Delete netconf
[controller.git] / opendaylight / md-sal / sal-rest-docgen / src / main / resources / explorer / lib / shred.bundle.js
1 var require = function (file, cwd) {
2     var resolved = require.resolve(file, cwd || '/');
3     var mod = require.modules[resolved];
4     if (!mod) throw new Error(
5         'Failed to resolve module ' + file + ', tried ' + resolved
6     );
7     var res = mod._cached ? mod._cached : mod();
8     return res;
9 }
10
11 require.paths = [];
12 require.modules = {};
13 require.extensions = [".js",".coffee"];
14
15 require._core = {
16     'assert': true,
17     'events': true,
18     'fs': true,
19     'path': true,
20     'vm': true
21 };
22
23 require.resolve = (function () {
24     return function (x, cwd) {
25         if (!cwd) cwd = '/';
26         
27         if (require._core[x]) return x;
28         var path = require.modules.path();
29         var y = cwd || '.';
30         
31         if (x.match(/^(?:\.\.?\/|\/)/)) {
32             var m = loadAsFileSync(path.resolve(y, x))
33                 || loadAsDirectorySync(path.resolve(y, x));
34             if (m) return m;
35         }
36         
37         var n = loadNodeModulesSync(x, y);
38         if (n) return n;
39         
40         throw new Error("Cannot find module '" + x + "'");
41         
42         function loadAsFileSync (x) {
43             if (require.modules[x]) {
44                 return x;
45             }
46             
47             for (var i = 0; i < require.extensions.length; i++) {
48                 var ext = require.extensions[i];
49                 if (require.modules[x + ext]) return x + ext;
50             }
51         }
52         
53         function loadAsDirectorySync (x) {
54             x = x.replace(/\/+$/, '');
55             var pkgfile = x + '/package.json';
56             if (require.modules[pkgfile]) {
57                 var pkg = require.modules[pkgfile]();
58                 var b = pkg.browserify;
59                 if (typeof b === 'object' && b.main) {
60                     var m = loadAsFileSync(path.resolve(x, b.main));
61                     if (m) return m;
62                 }
63                 else if (typeof b === 'string') {
64                     var m = loadAsFileSync(path.resolve(x, b));
65                     if (m) return m;
66                 }
67                 else if (pkg.main) {
68                     var m = loadAsFileSync(path.resolve(x, pkg.main));
69                     if (m) return m;
70                 }
71             }
72             
73             return loadAsFileSync(x + '/index');
74         }
75         
76         function loadNodeModulesSync (x, start) {
77             var dirs = nodeModulesPathsSync(start);
78             for (var i = 0; i < dirs.length; i++) {
79                 var dir = dirs[i];
80                 var m = loadAsFileSync(dir + '/' + x);
81                 if (m) return m;
82                 var n = loadAsDirectorySync(dir + '/' + x);
83                 if (n) return n;
84             }
85             
86             var m = loadAsFileSync(x);
87             if (m) return m;
88         }
89         
90         function nodeModulesPathsSync (start) {
91             var parts;
92             if (start === '/') parts = [ '' ];
93             else parts = path.normalize(start).split('/');
94             
95             var dirs = [];
96             for (var i = parts.length - 1; i >= 0; i--) {
97                 if (parts[i] === 'node_modules') continue;
98                 var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
99                 dirs.push(dir);
100             }
101             
102             return dirs;
103         }
104     };
105 })();
106
107 require.alias = function (from, to) {
108     var path = require.modules.path();
109     var res = null;
110     try {
111         res = require.resolve(from + '/package.json', '/');
112     }
113     catch (err) {
114         res = require.resolve(from, '/');
115     }
116     var basedir = path.dirname(res);
117     
118     var keys = (Object.keys || function (obj) {
119         var res = [];
120         for (var key in obj) res.push(key)
121         return res;
122     })(require.modules);
123     
124     for (var i = 0; i < keys.length; i++) {
125         var key = keys[i];
126         if (key.slice(0, basedir.length + 1) === basedir + '/') {
127             var f = key.slice(basedir.length);
128             require.modules[to + f] = require.modules[basedir + f];
129         }
130         else if (key === basedir) {
131             require.modules[to] = require.modules[basedir];
132         }
133     }
134 };
135
136 require.define = function (filename, fn) {
137     var dirname = require._core[filename]
138         ? ''
139         : require.modules.path().dirname(filename)
140     ;
141     
142     var require_ = function (file) {
143         return require(file, dirname)
144     };
145     require_.resolve = function (name) {
146         return require.resolve(name, dirname);
147     };
148     require_.modules = require.modules;
149     require_.define = require.define;
150     var module_ = { exports : {} };
151     
152     require.modules[filename] = function () {
153         require.modules[filename]._cached = module_.exports;
154         fn.call(
155             module_.exports,
156             require_,
157             module_,
158             module_.exports,
159             dirname,
160             filename
161         );
162         require.modules[filename]._cached = module_.exports;
163         return module_.exports;
164     };
165 };
166
167 if (typeof process === 'undefined') process = {};
168
169 if (!process.nextTick) process.nextTick = (function () {
170     var queue = [];
171     var canPost = typeof window !== 'undefined'
172         && window.postMessage && window.addEventListener
173     ;
174     
175     if (canPost) {
176         window.addEventListener('message', function (ev) {
177             if (ev.source === window && ev.data === 'browserify-tick') {
178                 ev.stopPropagation();
179                 if (queue.length > 0) {
180                     var fn = queue.shift();
181                     fn();
182                 }
183             }
184         }, true);
185     }
186     
187     return function (fn) {
188         if (canPost) {
189             queue.push(fn);
190             window.postMessage('browserify-tick', '*');
191         }
192         else setTimeout(fn, 0);
193     };
194 })();
195
196 if (!process.title) process.title = 'browser';
197
198 if (!process.binding) process.binding = function (name) {
199     if (name === 'evals') return require('vm')
200     else throw new Error('No such module')
201 };
202
203 if (!process.cwd) process.cwd = function () { return '.' };
204
205 require.define("path", function (require, module, exports, __dirname, __filename) {
206     function filter (xs, fn) {
207     var res = [];
208     for (var i = 0; i < xs.length; i++) {
209         if (fn(xs[i], i, xs)) res.push(xs[i]);
210     }
211     return res;
212 }
213
214 // resolves . and .. elements in a path array with directory names there
215 // must be no slashes, empty elements, or device names (c:\) in the array
216 // (so also no leading and trailing slashes - it does not distinguish
217 // relative and absolute paths)
218 function normalizeArray(parts, allowAboveRoot) {
219   // if the path tries to go above the root, `up` ends up > 0
220   var up = 0;
221   for (var i = parts.length; i >= 0; i--) {
222     var last = parts[i];
223     if (last == '.') {
224       parts.splice(i, 1);
225     } else if (last === '..') {
226       parts.splice(i, 1);
227       up++;
228     } else if (up) {
229       parts.splice(i, 1);
230       up--;
231     }
232   }
233
234   // if the path is allowed to go above the root, restore leading ..s
235   if (allowAboveRoot) {
236     for (; up--; up) {
237       parts.unshift('..');
238     }
239   }
240
241   return parts;
242 }
243
244 // Regex to split a filename into [*, dir, basename, ext]
245 // posix version
246 var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
247
248 // path.resolve([from ...], to)
249 // posix version
250 exports.resolve = function() {
251 var resolvedPath = '',
252     resolvedAbsolute = false;
253
254 for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
255   var path = (i >= 0)
256       ? arguments[i]
257       : process.cwd();
258
259   // Skip empty and invalid entries
260   if (typeof path !== 'string' || !path) {
261     continue;
262   }
263
264   resolvedPath = path + '/' + resolvedPath;
265   resolvedAbsolute = path.charAt(0) === '/';
266 }
267
268 // At this point the path should be resolved to a full absolute path, but
269 // handle relative paths to be safe (might happen when process.cwd() fails)
270
271 // Normalize the path
272 resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
273     return !!p;
274   }), !resolvedAbsolute).join('/');
275
276   return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
277 };
278
279 // path.normalize(path)
280 // posix version
281 exports.normalize = function(path) {
282 var isAbsolute = path.charAt(0) === '/',
283     trailingSlash = path.slice(-1) === '/';
284
285 // Normalize the path
286 path = normalizeArray(filter(path.split('/'), function(p) {
287     return !!p;
288   }), !isAbsolute).join('/');
289
290   if (!path && !isAbsolute) {
291     path = '.';
292   }
293   if (path && trailingSlash) {
294     path += '/';
295   }
296   
297   return (isAbsolute ? '/' : '') + path;
298 };
299
300
301 // posix version
302 exports.join = function() {
303   var paths = Array.prototype.slice.call(arguments, 0);
304   return exports.normalize(filter(paths, function(p, index) {
305     return p && typeof p === 'string';
306   }).join('/'));
307 };
308
309
310 exports.dirname = function(path) {
311   var dir = splitPathRe.exec(path)[1] || '';
312   var isWindows = false;
313   if (!dir) {
314     // No dirname
315     return '.';
316   } else if (dir.length === 1 ||
317       (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
318     // It is just a slash or a drive letter with a slash
319     return dir;
320   } else {
321     // It is a full dirname, strip trailing slash
322     return dir.substring(0, dir.length - 1);
323   }
324 };
325
326
327 exports.basename = function(path, ext) {
328   var f = splitPathRe.exec(path)[2] || '';
329   // TODO: make this comparison case-insensitive on windows?
330   if (ext && f.substr(-1 * ext.length) === ext) {
331     f = f.substr(0, f.length - ext.length);
332   }
333   return f;
334 };
335
336
337 exports.extname = function(path) {
338   return splitPathRe.exec(path)[3] || '';
339 };
340
341 });
342
343 require.define("/shred.js", function (require, module, exports, __dirname, __filename) {
344     // Shred is an HTTP client library intended to simplify the use of Node's
345 // built-in HTTP library. In particular, we wanted to make it easier to interact
346 // with HTTP-based APIs.
347 // 
348 // See the [examples](./examples.html) for more details.
349
350 // Ax is a nice logging library we wrote. You can use any logger, providing it
351 // has `info`, `warn`, `debug`, and `error` methods that take a string.
352 var Ax = require("ax")
353   , CookieJarLib = require( "cookiejar" )
354   , CookieJar = CookieJarLib.CookieJar
355 ;
356
357 // Shred takes some options, including a logger and request defaults.
358
359 var Shred = function(options) {
360   options = (options||{});
361   this.agent = options.agent;
362   this.defaults = options.defaults||{};
363   this.log = options.logger||(new Ax({ level: "info" }));
364   this._sharedCookieJar = new CookieJar();
365   this.logCurl = options.logCurl || false;
366 };
367
368 // Most of the real work is done in the request and reponse classes.
369  
370 Shred.Request = require("./shred/request");
371 Shred.Response = require("./shred/response");
372
373 // The `request` method kicks off a new request, instantiating a new `Request`
374 // object and passing along whatever default options we were given.
375
376 Shred.prototype = {
377   request: function(options) {
378     options.logger = this.log;
379     options.logCurl = options.logCurl || this.logCurl;
380     options.cookieJar = ( 'cookieJar' in options ) ? options.cookieJar : this._sharedCookieJar; // let them set cookieJar = null
381     options.agent = options.agent || this.agent;
382     // fill in default options
383     for (var key in this.defaults) {
384       if (this.defaults.hasOwnProperty(key) && !options[key]) {
385         options[key] = this.defaults[key]
386       }
387     }
388     return new Shred.Request(options);
389   }
390 };
391
392 // Define a bunch of convenience methods so that you don't have to include
393 // a `method` property in your request options.
394
395 "get put post delete".split(" ").forEach(function(method) {
396   Shred.prototype[method] = function(options) {
397     options.method = method;
398     return this.request(options);
399   };
400 });
401
402
403 module.exports = Shred;
404
405 });
406
407 require.define("/node_modules/ax/package.json", function (require, module, exports, __dirname, __filename) {
408     module.exports = {"main":"./lib/ax.js"}
409 });
410
411 require.define("/node_modules/ax/lib/ax.js", function (require, module, exports, __dirname, __filename) {
412     var inspect = require("util").inspect
413   , fs = require("fs")
414 ;
415
416
417 // this is a quick-and-dirty logger. there are other nicer loggers out there
418 // but the ones i found were also somewhat involved. this one has a Ruby
419 // logger type interface
420 //
421 // we can easily replace this, provide the info, debug, etc. methods are the
422 // same. or, we can change Haiku to use a more standard node.js interface
423
424 var format = function(level,message) {
425   var debug = (level=="debug"||level=="error");
426   if (!message) { return message.toString(); }
427   if (typeof(message) == "object") {
428     if (message instanceof Error && debug) {
429       return message.stack;
430     } else {
431       return inspect(message);
432     }
433   } else {
434     return message.toString();
435   }
436 };
437
438 var noOp = function(message) { return this; }
439 var makeLogger = function(level,fn) {
440   return function(message) { 
441     this.stream.write(this.format(level, message)+"\n");
442     return this;
443   }
444 };
445
446 var Logger = function(options) {
447   var logger = this;
448   var options = options||{};
449
450   // Default options
451   options.level = options.level || "info";
452   options.timestamp = options.timestamp || true;
453   options.prefix = options.prefix || "";
454   logger.options = options;
455
456   // Allows a prefix to be added to the message.
457   //
458   //    var logger = new Ax({ module: 'Haiku' })
459   //    logger.warn('this is going to be awesome!');
460   //    //=> Haiku: this is going to be awesome!
461   //
462   if (logger.options.module){
463     logger.options.prefix = logger.options.module;
464   }
465
466   // Write to stderr or a file
467   if (logger.options.file){
468     logger.stream = fs.createWriteStream(logger.options.file, {"flags": "a"});
469   } else {
470       if(process.title === "node")
471     logger.stream = process.stderr;
472       else if(process.title === "browser")
473     logger.stream = function () {
474       // Work around weird console context issue: http://code.google.com/p/chromium/issues/detail?id=48662
475       return console[logger.options.level].apply(console, arguments);
476     };
477   }
478
479   switch(logger.options.level){
480     case 'debug':
481       ['debug', 'info', 'warn'].forEach(function (level) {
482         logger[level] = Logger.writer(level);
483       });
484     case 'info':
485       ['info', 'warn'].forEach(function (level) {
486         logger[level] = Logger.writer(level);
487       });
488     case 'warn':
489       logger.warn = Logger.writer('warn');
490   }
491 }
492
493 // Used to define logger methods
494 Logger.writer = function(level){
495   return function(message){
496     var logger = this;
497
498     if(process.title === "node")
499   logger.stream.write(logger.format(level, message) + '\n');
500     else if(process.title === "browser")
501   logger.stream(logger.format(level, message) + '\n');
502
503   };
504 }
505
506
507 Logger.prototype = {
508   info: function(){},
509   debug: function(){},
510   warn: function(){},
511   error: Logger.writer('error'),
512   format: function(level, message){
513     if (! message) return '';
514
515     var logger = this
516       , prefix = logger.options.prefix
517       , timestamp = logger.options.timestamp ? " " + (new Date().toISOString()) : ""
518     ;
519
520     return (prefix + timestamp + ": " + message);
521   }
522 };
523
524 module.exports = Logger;
525
526 });
527
528 require.define("util", function (require, module, exports, __dirname, __filename) {
529     // todo
530
531 });
532
533 require.define("fs", function (require, module, exports, __dirname, __filename) {
534     // nothing to see here... no file methods for the browser
535
536 });
537
538 require.define("/node_modules/cookiejar/package.json", function (require, module, exports, __dirname, __filename) {
539     module.exports = {"main":"cookiejar.js"}
540 });
541
542 require.define("/node_modules/cookiejar/cookiejar.js", function (require, module, exports, __dirname, __filename) {
543     exports.CookieAccessInfo=CookieAccessInfo=function CookieAccessInfo(domain,path,secure,script) {
544     if(this instanceof CookieAccessInfo) {
545       this.domain=domain||undefined;
546       this.path=path||"/";
547       this.secure=!!secure;
548       this.script=!!script;
549       return this;
550     }
551     else {
552         return new CookieAccessInfo(domain,path,secure,script)    
553     }
554 }
555
556 exports.Cookie=Cookie=function Cookie(cookiestr) {
557   if(cookiestr instanceof Cookie) {
558     return cookiestr;
559   }
560     else {
561         if(this instanceof Cookie) {
562           this.name = null;
563           this.value = null;
564           this.expiration_date = Infinity;
565           this.path = "/";
566           this.domain = null;
567           this.secure = false; //how to define?
568           this.noscript = false; //httponly
569           if(cookiestr) {
570             this.parse(cookiestr)
571           }
572           return this;
573         }
574         return new Cookie(cookiestr)
575     }
576 }
577
578 Cookie.prototype.toString = function toString() {
579   var str=[this.name+"="+this.value];
580   if(this.expiration_date !== Infinity) {
581     str.push("expires="+(new Date(this.expiration_date)).toGMTString());
582   }
583   if(this.domain) {
584     str.push("domain="+this.domain);
585   }
586   if(this.path) {
587     str.push("path="+this.path);
588   }
589   if(this.secure) {
590     str.push("secure");
591   }
592   if(this.noscript) {
593     str.push("httponly");
594   }
595   return str.join("; ");
596 }
597
598 Cookie.prototype.toValueString = function toValueString() {
599   return this.name+"="+this.value;
600 }
601
602 var cookie_str_splitter=/[:](?=\s*[a-zA-Z0-9_\-]+\s*[=])/g
603 Cookie.prototype.parse = function parse(str) {
604   if(this instanceof Cookie) {
605       var parts=str.split(";")
606       , pair=parts[0].match(/([^=]+)=((?:.|\n)*)/)
607       , key=pair[1]
608       , value=pair[2];
609       this.name = key;
610       this.value = value;
611     
612       for(var i=1;i<parts.length;i++) {
613         pair=parts[i].match(/([^=]+)(?:=((?:.|\n)*))?/)
614         , key=pair[1].trim().toLowerCase()
615         , value=pair[2];
616         switch(key) {
617           case "httponly":
618             this.noscript = true;
619           break;
620           case "expires":
621             this.expiration_date = value
622               ? Number(Date.parse(value))
623               : Infinity;
624           break;
625           case "path":
626             this.path = value
627               ? value.trim()
628               : "";
629           break;
630           case "domain":
631             this.domain = value
632               ? value.trim()
633               : "";
634           break;
635           case "secure":
636             this.secure = true;
637           break
638         }
639       }
640     
641       return this;
642   }
643     return new Cookie().parse(str)
644 }
645
646 Cookie.prototype.matches = function matches(access_info) {
647   if(this.noscript && access_info.script
648   || this.secure && !access_info.secure
649   || !this.collidesWith(access_info)) {
650     return false
651   }
652   return true;
653 }
654
655 Cookie.prototype.collidesWith = function collidesWith(access_info) {
656   if((this.path && !access_info.path) || (this.domain && !access_info.domain)) {
657     return false
658   }
659   if(this.path && access_info.path.indexOf(this.path) !== 0) {
660     return false;
661   }
662   if (this.domain===access_info.domain) {
663     return true;
664   }
665   else if(this.domain && this.domain.charAt(0)===".")
666   {
667     var wildcard=access_info.domain.indexOf(this.domain.slice(1))
668     if(wildcard===-1 || wildcard!==access_info.domain.length-this.domain.length+1) {
669       return false;
670     }
671   }
672   else if(this.domain){
673     return false
674   }
675   return true;
676 }
677
678 exports.CookieJar=CookieJar=function CookieJar() {
679   if(this instanceof CookieJar) {
680       var cookies = {} //name: [Cookie]
681     
682       this.setCookie = function setCookie(cookie) {
683         cookie = Cookie(cookie);
684         //Delete the cookie if the set is past the current time
685         var remove = cookie.expiration_date <= Date.now();
686         if(cookie.name in cookies) {
687           var cookies_list = cookies[cookie.name];
688           for(var i=0;i<cookies_list.length;i++) {
689             var collidable_cookie = cookies_list[i];
690             if(collidable_cookie.collidesWith(cookie)) {
691               if(remove) {
692                 cookies_list.splice(i,1);
693                 if(cookies_list.length===0) {
694                   delete cookies[cookie.name]
695                 }
696                 return false;
697               }
698               else {
699                 return cookies_list[i]=cookie;
700               }
701             }
702           }
703           if(remove) {
704             return false;
705           }
706           cookies_list.push(cookie);
707           return cookie;
708         }
709         else if(remove){
710           return false;
711         }
712         else {
713           return cookies[cookie.name]=[cookie];
714         }
715       }
716       //returns a cookie
717       this.getCookie = function getCookie(cookie_name,access_info) {
718         var cookies_list = cookies[cookie_name];
719         for(var i=0;i<cookies_list.length;i++) {
720           var cookie = cookies_list[i];
721           if(cookie.expiration_date <= Date.now()) {
722             if(cookies_list.length===0) {
723               delete cookies[cookie.name]
724             }
725             continue;
726           }
727           if(cookie.matches(access_info)) {
728             return cookie;
729           }
730         }
731       }
732       //returns a list of cookies
733       this.getCookies = function getCookies(access_info) {
734         var matches=[];
735         for(var cookie_name in cookies) {
736           var cookie=this.getCookie(cookie_name,access_info);
737           if (cookie) {
738             matches.push(cookie);
739           }
740         }
741         matches.toString=function toString(){return matches.join(":");}
742             matches.toValueString=function() {return matches.map(function(c){return c.toValueString();}).join(';');}
743         return matches;
744       }
745     
746       return this;
747   }
748     return new CookieJar()
749 }
750
751
752 //returns list of cookies that were set correctly
753 CookieJar.prototype.setCookies = function setCookies(cookies) {
754   cookies=Array.isArray(cookies)
755     ?cookies
756     :cookies.split(cookie_str_splitter);
757   var successful=[]
758   for(var i=0;i<cookies.length;i++) {
759     var cookie = Cookie(cookies[i]);
760     if(this.setCookie(cookie)) {
761       successful.push(cookie);
762     }
763   }
764   return successful;
765 }
766
767 });
768
769 require.define("/shred/request.js", function (require, module, exports, __dirname, __filename) {
770     // The request object encapsulates a request, creating a Node.js HTTP request and
771 // then handling the response.
772
773 var HTTP = require("http")
774   , HTTPS = require("https")
775   , parseUri = require("./parseUri")
776   , Emitter = require('events').EventEmitter
777   , sprintf = require("sprintf").sprintf
778   , Response = require("./response")
779   , HeaderMixins = require("./mixins/headers")
780   , Content = require("./content")
781 ;
782
783 var STATUS_CODES = HTTP.STATUS_CODES || {
784     100 : 'Continue',
785     101 : 'Switching Protocols',
786     102 : 'Processing', // RFC 2518, obsoleted by RFC 4918
787     200 : 'OK',
788     201 : 'Created',
789     202 : 'Accepted',
790     203 : 'Non-Authoritative Information',
791     204 : 'No Content',
792     205 : 'Reset Content',
793     206 : 'Partial Content',
794     207 : 'Multi-Status', // RFC 4918
795     300 : 'Multiple Choices',
796     301 : 'Moved Permanently',
797     302 : 'Moved Temporarily',
798     303 : 'See Other',
799     304 : 'Not Modified',
800     305 : 'Use Proxy',
801     307 : 'Temporary Redirect',
802     400 : 'Bad Request',
803     401 : 'Unauthorized',
804     402 : 'Payment Required',
805     403 : 'Forbidden',
806     404 : 'Not Found',
807     405 : 'Method Not Allowed',
808     406 : 'Not Acceptable',
809     407 : 'Proxy Authentication Required',
810     408 : 'Request Time-out',
811     409 : 'Conflict',
812     410 : 'Gone',
813     411 : 'Length Required',
814     412 : 'Precondition Failed',
815     413 : 'Request Entity Too Large',
816     414 : 'Request-URI Too Large',
817     415 : 'Unsupported Media Type',
818     416 : 'Requested Range Not Satisfiable',
819     417 : 'Expectation Failed',
820     418 : 'I\'m a teapot', // RFC 2324
821     422 : 'Unprocessable Entity', // RFC 4918
822     423 : 'Locked', // RFC 4918
823     424 : 'Failed Dependency', // RFC 4918
824     425 : 'Unordered Collection', // RFC 4918
825     426 : 'Upgrade Required', // RFC 2817
826     500 : 'Internal Server Error',
827     501 : 'Not Implemented',
828     502 : 'Bad Gateway',
829     503 : 'Service Unavailable',
830     504 : 'Gateway Time-out',
831     505 : 'HTTP Version not supported',
832     506 : 'Variant Also Negotiates', // RFC 2295
833     507 : 'Insufficient Storage', // RFC 4918
834     509 : 'Bandwidth Limit Exceeded',
835     510 : 'Not Extended' // RFC 2774
836 };
837
838 // The Shred object itself constructs the `Request` object. You should rarely
839 // need to do this directly.
840
841 var Request = function(options) {
842   this.log = options.logger;
843   this.cookieJar = options.cookieJar;
844   this.encoding = options.encoding;
845   this.logCurl = options.logCurl;
846   processOptions(this,options||{});
847   createRequest(this);
848 };
849
850 // A `Request` has a number of properties, many of which help with details like
851 // URL parsing or defaulting the port for the request.
852
853 Object.defineProperties(Request.prototype, {
854
855 // - **url**. You can set the `url` property with a valid URL string and all the
856 //   URL-related properties (host, port, etc.) will be automatically set on the
857 //   request object.
858
859   url: {
860     get: function() {
861       if (!this.scheme) { return null; }
862       return sprintf("%s://%s:%s%s",
863           this.scheme, this.host, this.port,
864           (this.proxy ? "/" : this.path) +
865           (this.query ? ("?" + this.query) : ""));
866     },
867     set: function(_url) {
868       _url = parseUri(_url);
869       this.scheme = _url.protocol;
870       this.host = _url.host;
871       this.port = _url.port;
872       this.path = _url.path;
873       this.query = _url.query;
874       return this;
875     },
876     enumerable: true
877   },
878
879 // - **headers**. Returns a hash representing the request headers. You can't set
880 //   this directly, only get it. You can add or modify headers by using the
881 //   `setHeader` or `setHeaders` method. This ensures that the headers are
882 //   normalized - that is, you don't accidentally send `Content-Type` and
883 //   `content-type` headers. Keep in mind that if you modify the returned hash,
884 //   it will *not* modify the request headers.
885
886   headers: {
887     get: function() {
888       return this.getHeaders();
889     },
890     enumerable: true
891   },
892
893 // - **port**. Unless you set the `port` explicitly or include it in the URL, it
894 //   will default based on the scheme.
895
896   port: {
897     get: function() {
898       if (!this._port) {
899         switch(this.scheme) {
900           case "https": return this._port = 443;
901           case "http":
902           default: return this._port = 80;
903         }
904       }
905       return this._port;
906     },
907     set: function(value) { this._port = value; return this; },
908     enumerable: true
909   },
910
911 // - **method**. The request method - `get`, `put`, `post`, etc. that will be
912 //   used to make the request. Defaults to `get`.
913
914   method: {
915     get: function() {
916       return this._method = (this._method||"GET");
917     },
918     set: function(value) {
919       this._method = value; return this;
920     },
921     enumerable: true
922   },
923
924 // - **query**. Can be set either with a query string or a hash (object). Get
925 //   will always return a properly escaped query string or null if there is no
926 //   query component for the request.
927
928   query: {
929     get: function() {return this._query;},
930     set: function(value) {
931       var stringify = function (hash) {
932         var query = "";
933         for (var key in hash) {
934           query += encodeURIComponent(key) + '=' + encodeURIComponent(hash[key]) + '&';
935         }
936         // Remove the last '&'
937         query = query.slice(0, -1);
938         return query;
939       }
940
941       if (value) {
942         if (typeof value === 'object') {
943           value = stringify(value);
944         }
945         this._query = value;
946       } else {
947         this._query = "";
948       }
949       return this;
950     },
951     enumerable: true
952   },
953
954 // - **parameters**. This will return the query parameters in the form of a hash
955 //   (object).
956
957   parameters: {
958     get: function() { return QueryString.parse(this._query||""); },
959     enumerable: true
960   },
961
962 // - **content**. (Aliased as `body`.) Set this to add a content entity to the
963 //   request. Attempts to use the `content-type` header to determine what to do
964 //   with the content value. Get this to get back a [`Content`
965 //   object](./content.html).
966
967   body: {
968     get: function() { return this._body; },
969     set: function(value) {
970       this._body = new Content({
971         data: value,
972         type: this.getHeader("Content-Type")
973       });
974       this.setHeader("Content-Type",this.content.type);
975       this.setHeader("Content-Length",this.content.length);
976       return this;
977     },
978     enumerable: true
979   },
980
981 // - **timeout**. Used to determine how long to wait for a response. Does not
982 //   distinguish between connect timeouts versus request timeouts. Set either in
983 //   milliseconds or with an object with temporal attributes (hours, minutes,
984 //   seconds) and convert it into milliseconds. Get will always return
985 //   milliseconds.
986
987   timeout: {
988     get: function() { return this._timeout; }, // in milliseconds
989     set: function(timeout) {
990       var request = this
991         , milliseconds = 0;
992       ;
993       if (!timeout) return this;
994       if (typeof timeout==="number") { milliseconds = timeout; }
995       else {
996         milliseconds = (timeout.milliseconds||0) +
997           (1000 * ((timeout.seconds||0) +
998               (60 * ((timeout.minutes||0) +
999                 (60 * (timeout.hours||0))))));
1000       }
1001       this._timeout = milliseconds;
1002       return this;
1003     },
1004     enumerable: true
1005   }
1006 });
1007
1008 // Alias `body` property to `content`. Since the [content object](./content.html)
1009 // has a `body` attribute, it's preferable to use `content` since you can then
1010 // access the raw content data using `content.body`.
1011
1012 Object.defineProperty(Request.prototype,"content",
1013     Object.getOwnPropertyDescriptor(Request.prototype, "body"));
1014
1015 // The `Request` object can be pretty overwhelming to view using the built-in
1016 // Node.js inspect method. We want to make it a bit more manageable. This
1017 // probably goes [too far in the other
1018 // direction](https://github.com/spire-io/shred/issues/2).
1019
1020 Request.prototype.inspect = function () {
1021   var request = this;
1022   var headers = this.format_headers();
1023   var summary = ["<Shred Request> ", request.method.toUpperCase(),
1024       request.url].join(" ")
1025   return [ summary, "- Headers:", headers].join("\n");
1026 };
1027
1028 Request.prototype.format_headers = function () {
1029   var array = []
1030   var headers = this._headers
1031   for (var key in headers) {
1032     if (headers.hasOwnProperty(key)) {
1033       var value = headers[key]
1034       array.push("\t" + key + ": " + value);
1035     }
1036   }
1037   return array.join("\n");
1038 };
1039
1040 // Allow chainable 'on's:  shred.get({ ... }).on( ... ).  You can pass in a
1041 // single function, a pair (event, function), or a hash:
1042 // { event: function, event: function }
1043 Request.prototype.on = function (eventOrHash, listener) {
1044   var emitter = this.emitter;
1045   // Pass in a single argument as a function then make it the default response handler
1046   if (arguments.length === 1 && typeof(eventOrHash) === 'function') {
1047     emitter.on('response', eventOrHash);
1048   } else if (arguments.length === 1 && typeof(eventOrHash) === 'object') {
1049     for (var key in eventOrHash) {
1050       if (eventOrHash.hasOwnProperty(key)) {
1051         emitter.on(key, eventOrHash[key]);
1052       }
1053     }
1054   } else {
1055     emitter.on(eventOrHash, listener);
1056   }
1057   return this;
1058 };
1059
1060 // Add in the header methods. Again, these ensure we don't get the same header
1061 // multiple times with different case conventions.
1062 HeaderMixins.gettersAndSetters(Request);
1063
1064 // `processOptions` is called from the constructor to handle all the work
1065 // associated with making sure we do our best to ensure we have a valid request.
1066
1067 var processOptions = function(request,options) {
1068
1069   request.log.debug("Processing request options ..");
1070
1071   // We'll use `request.emitter` to manage the `on` event handlers.
1072   request.emitter = (new Emitter);
1073
1074   request.agent = options.agent;
1075
1076   // Set up the handlers ...
1077   if (options.on) {
1078     for (var key in options.on) {
1079       if (options.on.hasOwnProperty(key)) {
1080         request.emitter.on(key, options.on[key]);
1081       }
1082     }
1083   }
1084
1085   // Make sure we were give a URL or a host
1086   if (!options.url && !options.host) {
1087     request.emitter.emit("request_error",
1088         new Error("No url or url options (host, port, etc.)"));
1089     return;
1090   }
1091
1092   // Allow for the [use of a proxy](http://www.jmarshall.com/easy/http/#proxies).
1093
1094   if (options.url) {
1095     if (options.proxy) {
1096       request.url = options.proxy;
1097       request.path = options.url;
1098     } else {
1099       request.url = options.url;
1100     }
1101   }
1102
1103   // Set the remaining options.
1104   request.query = options.query||options.parameters||request.query ;
1105   request.method = options.method;
1106   request.setHeader("user-agent",options.agent||"Shred");
1107   request.setHeaders(options.headers);
1108
1109   if (request.cookieJar) {
1110     var cookies = request.cookieJar.getCookies( CookieAccessInfo( request.host, request.path ) );
1111     if (cookies.length) {
1112       var cookieString = request.getHeader('cookie')||'';
1113       for (var cookieIndex = 0; cookieIndex < cookies.length; ++cookieIndex) {
1114           if ( cookieString.length && cookieString[ cookieString.length - 1 ] != ';' )
1115           {
1116               cookieString += ';';
1117           }
1118           cookieString += cookies[ cookieIndex ].name + '=' + cookies[ cookieIndex ].value + ';';
1119       }
1120       request.setHeader("cookie", cookieString);
1121     }
1122   }
1123   
1124   // The content entity can be set either using the `body` or `content` attributes.
1125   if (options.body||options.content) {
1126     request.content = options.body||options.content;
1127   }
1128   request.timeout = options.timeout;
1129
1130 };
1131
1132 // `createRequest` is also called by the constructor, after `processOptions`.
1133 // This actually makes the request and processes the response, so `createRequest`
1134 // is a bit of a misnomer.
1135
1136 var createRequest = function(request) {
1137   var timeout ;
1138
1139   request.log.debug("Creating request ..");
1140   request.log.debug(request);
1141
1142   var reqParams = {
1143     host: request.host,
1144     port: request.port,
1145     method: request.method,
1146     path: request.path + (request.query ? '?'+request.query : ""),
1147     headers: request.getHeaders(),
1148     // Node's HTTP/S modules will ignore this, but we are using the
1149     // browserify-http module in the browser for both HTTP and HTTPS, and this
1150     // is how you differentiate the two.
1151     scheme: request.scheme,
1152     // Use a provided agent.  'Undefined' is the default, which uses a global
1153     // agent.
1154     agent: request.agent
1155   };
1156
1157   if (request.logCurl) {
1158     logCurl(request);
1159   }
1160
1161   var http = request.scheme == "http" ? HTTP : HTTPS;
1162
1163   // Set up the real request using the selected library. The request won't be
1164   // sent until we call `.end()`.
1165   request._raw = http.request(reqParams, function(response) {
1166     request.log.debug("Received response ..");
1167
1168     // We haven't timed out and we have a response, so make sure we clear the
1169     // timeout so it doesn't fire while we're processing the response.
1170     clearTimeout(timeout);
1171
1172     // Construct a Shred `Response` object from the response. This will stream
1173     // the response, thus the need for the callback. We can access the response
1174     // entity safely once we're in the callback.
1175     response = new Response(response, request, function(response) {
1176
1177       // Set up some event magic. The precedence is given first to
1178       // status-specific handlers, then to responses for a given event, and then
1179       // finally to the more general `response` handler. In the last case, we
1180       // need to first make sure we're not dealing with a a redirect.
1181       var emit = function(event) {
1182         var emitter = request.emitter;
1183         var textStatus = STATUS_CODES[response.status] ? STATUS_CODES[response.status].toLowerCase() : null;
1184         if (emitter.listeners(response.status).length > 0 || emitter.listeners(textStatus).length > 0) {
1185           emitter.emit(response.status, response);
1186           emitter.emit(textStatus, response);
1187         } else {
1188           if (emitter.listeners(event).length>0) {
1189             emitter.emit(event, response);
1190           } else if (!response.isRedirect) {
1191             emitter.emit("response", response);
1192             //console.warn("Request has no event listener for status code " + response.status);
1193           }
1194         }
1195       };
1196
1197       // Next, check for a redirect. We simply repeat the request with the URL
1198       // given in the `Location` header. We fire a `redirect` event.
1199       if (response.isRedirect) {
1200         request.log.debug("Redirecting to "
1201             + response.getHeader("Location"));
1202         request.url = response.getHeader("Location");
1203         emit("redirect");
1204         createRequest(request);
1205
1206       // Okay, it's not a redirect. Is it an error of some kind?
1207       } else if (response.isError) {
1208         emit("error");
1209       } else {
1210       // It looks like we're good shape. Trigger the `success` event.
1211         emit("success");
1212       }
1213     });
1214   });
1215
1216   // We're still setting up the request. Next, we're going to handle error cases
1217   // where we have no response. We don't emit an error event because that event
1218   // takes a response. We don't response handlers to have to check for a null
1219   // value. However, we [should introduce a different event
1220   // type](https://github.com/spire-io/shred/issues/3) for this type of error.
1221   request._raw.on("error", function(error) {
1222     request.emitter.emit("request_error", error);
1223   });
1224
1225   request._raw.on("socket", function(socket) {
1226     request.emitter.emit("socket", socket);
1227   });
1228
1229   // TCP timeouts should also trigger the "response_error" event.
1230   request._raw.on('socket', function () {
1231     request._raw.socket.on('timeout', function () {
1232       // This should trigger the "error" event on the raw request, which will
1233       // trigger the "response_error" on the shred request.
1234       request._raw.abort();
1235     });
1236   });
1237
1238
1239   // We're almost there. Next, we need to write the request entity to the
1240   // underlying request object.
1241   if (request.content) {
1242     request.log.debug("Streaming body: '" +
1243         request.content.data.slice(0,59) + "' ... ");
1244     request._raw.write(request.content.data);
1245   }
1246
1247   // Finally, we need to set up the timeout. We do this last so that we don't
1248   // start the clock ticking until the last possible moment.
1249   if (request.timeout) {
1250     timeout = setTimeout(function() {
1251       request.log.debug("Timeout fired, aborting request ...");
1252       request._raw.abort();
1253       request.emitter.emit("timeout", request);
1254     },request.timeout);
1255   }
1256
1257   // The `.end()` method will cause the request to fire. Technically, it might
1258   // have already sent the headers and body.
1259   request.log.debug("Sending request ...");
1260   request._raw.end();
1261 };
1262
1263 // Logs the curl command for the request.
1264 var logCurl = function (req) {
1265   var headers = req.getHeaders();
1266   var headerString = "";
1267
1268   for (var key in headers) {
1269     headerString += '-H "' + key + ": " + headers[key] + '" ';
1270   }
1271
1272   var bodyString = ""
1273
1274   if (req.content) {
1275     bodyString += "-d '" + req.content.body + "' ";
1276   }
1277
1278   var query = req.query ? '?' + req.query : "";
1279
1280   console.log("curl " +
1281     "-X " + req.method.toUpperCase() + " " +
1282     req.scheme + "://" + req.host + ":" + req.port + req.path + query + " " +
1283     headerString +
1284     bodyString
1285   );
1286 };
1287
1288
1289 module.exports = Request;
1290
1291 });
1292
1293 require.define("http", function (require, module, exports, __dirname, __filename) {
1294     // todo
1295
1296 });
1297
1298 require.define("https", function (require, module, exports, __dirname, __filename) {
1299     // todo
1300
1301 });
1302
1303 require.define("/shred/parseUri.js", function (require, module, exports, __dirname, __filename) {
1304     // parseUri 1.2.2
1305 // (c) Steven Levithan <stevenlevithan.com>
1306 // MIT License
1307
1308 function parseUri (str) {
1309   var o   = parseUri.options,
1310     m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
1311     uri = {},
1312     i   = 14;
1313
1314   while (i--) uri[o.key[i]] = m[i] || "";
1315
1316   uri[o.q.name] = {};
1317   uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
1318     if ($1) uri[o.q.name][$1] = $2;
1319   });
1320
1321   return uri;
1322 };
1323
1324 parseUri.options = {
1325   strictMode: false,
1326   key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
1327   q:   {
1328     name:   "queryKey",
1329     parser: /(?:^|&)([^&=]*)=?([^&]*)/g
1330   },
1331   parser: {
1332     strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
1333     loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
1334   }
1335 };
1336
1337 module.exports = parseUri;
1338
1339 });
1340
1341 require.define("events", function (require, module, exports, __dirname, __filename) {
1342     if (!process.EventEmitter) process.EventEmitter = function () {};
1343
1344 var EventEmitter = exports.EventEmitter = process.EventEmitter;
1345 var isArray = typeof Array.isArray === 'function'
1346     ? Array.isArray
1347     : function (xs) {
1348         return Object.toString.call(xs) === '[object Array]'
1349     }
1350 ;
1351
1352 // By default EventEmitters will print a warning if more than
1353 // 10 listeners are added to it. This is a useful default which
1354 // helps finding memory leaks.
1355 //
1356 // Obviously not all Emitters should be limited to 10. This function allows
1357 // that to be increased. Set to zero for unlimited.
1358 var defaultMaxListeners = 10;
1359 EventEmitter.prototype.setMaxListeners = function(n) {
1360   if (!this._events) this._events = {};
1361   this._events.maxListeners = n;
1362 };
1363
1364
1365 EventEmitter.prototype.emit = function(type) {
1366   // If there is no 'error' event listener then throw.
1367   if (type === 'error') {
1368     if (!this._events || !this._events.error ||
1369         (isArray(this._events.error) && !this._events.error.length))
1370     {
1371       if (arguments[1] instanceof Error) {
1372         throw arguments[1]; // Unhandled 'error' event
1373       } else {
1374         throw new Error("Uncaught, unspecified 'error' event.");
1375       }
1376       return false;
1377     }
1378   }
1379
1380   if (!this._events) return false;
1381   var handler = this._events[type];
1382   if (!handler) return false;
1383
1384   if (typeof handler == 'function') {
1385     switch (arguments.length) {
1386       // fast cases
1387       case 1:
1388         handler.call(this);
1389         break;
1390       case 2:
1391         handler.call(this, arguments[1]);
1392         break;
1393       case 3:
1394         handler.call(this, arguments[1], arguments[2]);
1395         break;
1396       // slower
1397       default:
1398         var args = Array.prototype.slice.call(arguments, 1);
1399         handler.apply(this, args);
1400     }
1401     return true;
1402
1403   } else if (isArray(handler)) {
1404     var args = Array.prototype.slice.call(arguments, 1);
1405
1406     var listeners = handler.slice();
1407     for (var i = 0, l = listeners.length; i < l; i++) {
1408       listeners[i].apply(this, args);
1409     }
1410     return true;
1411
1412   } else {
1413     return false;
1414   }
1415 };
1416
1417 // EventEmitter is defined in src/node_events.cc
1418 // EventEmitter.prototype.emit() is also defined there.
1419 EventEmitter.prototype.addListener = function(type, listener) {
1420   if ('function' !== typeof listener) {
1421     throw new Error('addListener only takes instances of Function');
1422   }
1423
1424   if (!this._events) this._events = {};
1425
1426   // To avoid recursion in the case that type == "newListeners"! Before
1427   // adding it to the listeners, first emit "newListeners".
1428   this.emit('newListener', type, listener);
1429
1430   if (!this._events[type]) {
1431     // Optimize the case of one listener. Don't need the extra array object.
1432     this._events[type] = listener;
1433   } else if (isArray(this._events[type])) {
1434
1435     // Check for listener leak
1436     if (!this._events[type].warned) {
1437       var m;
1438       if (this._events.maxListeners !== undefined) {
1439         m = this._events.maxListeners;
1440       } else {
1441         m = defaultMaxListeners;
1442       }
1443
1444       if (m && m > 0 && this._events[type].length > m) {
1445         this._events[type].warned = true;
1446         console.error('(node) warning: possible EventEmitter memory ' +
1447                       'leak detected. %d listeners added. ' +
1448                       'Use emitter.setMaxListeners() to increase limit.',
1449                       this._events[type].length);
1450         console.trace();
1451       }
1452     }
1453
1454     // If we've already got an array, just append.
1455     this._events[type].push(listener);
1456   } else {
1457     // Adding the second element, need to change to array.
1458     this._events[type] = [this._events[type], listener];
1459   }
1460
1461   return this;
1462 };
1463
1464 EventEmitter.prototype.on = EventEmitter.prototype.addListener;
1465
1466 EventEmitter.prototype.once = function(type, listener) {
1467   var self = this;
1468   self.on(type, function g() {
1469     self.removeListener(type, g);
1470     listener.apply(this, arguments);
1471   });
1472
1473   return this;
1474 };
1475
1476 EventEmitter.prototype.removeListener = function(type, listener) {
1477   if ('function' !== typeof listener) {
1478     throw new Error('removeListener only takes instances of Function');
1479   }
1480
1481   // does not use listeners(), so no side effect of creating _events[type]
1482   if (!this._events || !this._events[type]) return this;
1483
1484   var list = this._events[type];
1485
1486   if (isArray(list)) {
1487     var i = list.indexOf(listener);
1488     if (i < 0) return this;
1489     list.splice(i, 1);
1490     if (list.length == 0)
1491       delete this._events[type];
1492   } else if (this._events[type] === listener) {
1493     delete this._events[type];
1494   }
1495
1496   return this;
1497 };
1498
1499 EventEmitter.prototype.removeAllListeners = function(type) {
1500   // does not use listeners(), so no side effect of creating _events[type]
1501   if (type && this._events && this._events[type]) this._events[type] = null;
1502   return this;
1503 };
1504
1505 EventEmitter.prototype.listeners = function(type) {
1506   if (!this._events) this._events = {};
1507   if (!this._events[type]) this._events[type] = [];
1508   if (!isArray(this._events[type])) {
1509     this._events[type] = [this._events[type]];
1510   }
1511   return this._events[type];
1512 };
1513
1514 });
1515
1516 require.define("/node_modules/sprintf/package.json", function (require, module, exports, __dirname, __filename) {
1517     module.exports = {"main":"./lib/sprintf"}
1518 });
1519
1520 require.define("/node_modules/sprintf/lib/sprintf.js", function (require, module, exports, __dirname, __filename) {
1521     /**
1522 sprintf() for JavaScript 0.7-beta1
1523 http://www.diveintojavascript.com/projects/javascript-sprintf
1524
1525 Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
1526 All rights reserved.
1527
1528 Redistribution and use in source and binary forms, with or without
1529 modification, are permitted provided that the following conditions are met:
1530     * Redistributions of source code must retain the above copyright
1531       notice, this list of conditions and the following disclaimer.
1532     * Redistributions in binary form must reproduce the above copyright
1533       notice, this list of conditions and the following disclaimer in the
1534       documentation and/or other materials provided with the distribution.
1535     * Neither the name of sprintf() for JavaScript nor the
1536       names of its contributors may be used to endorse or promote products
1537       derived from this software without specific prior written permission.
1538
1539 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1540 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1541 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1542 DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
1543 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1544 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
1545 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
1546 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1547 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
1548 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1549
1550
1551 Changelog:
1552 2010.11.07 - 0.7-beta1-node
1553   - converted it to a node.js compatible module
1554
1555 2010.09.06 - 0.7-beta1
1556   - features: vsprintf, support for named placeholders
1557   - enhancements: format cache, reduced global namespace pollution
1558
1559 2010.05.22 - 0.6:
1560  - reverted to 0.4 and fixed the bug regarding the sign of the number 0
1561  Note:
1562  Thanks to Raphael Pigulla <raph (at] n3rd [dot) org> (http://www.n3rd.org/)
1563  who warned me about a bug in 0.5, I discovered that the last update was
1564  a regress. I appologize for that.
1565
1566 2010.05.09 - 0.5:
1567  - bug fix: 0 is now preceeded with a + sign
1568  - bug fix: the sign was not at the right position on padded results (Kamal Abdali)
1569  - switched from GPL to BSD license
1570
1571 2007.10.21 - 0.4:
1572  - unit test and patch (David Baird)
1573
1574 2007.09.17 - 0.3:
1575  - bug fix: no longer throws exception on empty paramenters (Hans Pufal)
1576
1577 2007.09.11 - 0.2:
1578  - feature: added argument swapping
1579
1580 2007.04.03 - 0.1:
1581  - initial release
1582 **/
1583
1584 var sprintf = (function() {
1585   function get_type(variable) {
1586     return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
1587   }
1588   function str_repeat(input, multiplier) {
1589     for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
1590     return output.join('');
1591   }
1592
1593   var str_format = function() {
1594     if (!str_format.cache.hasOwnProperty(arguments[0])) {
1595       str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
1596     }
1597     return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
1598   };
1599
1600   str_format.format = function(parse_tree, argv) {
1601     var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
1602     for (i = 0; i < tree_length; i++) {
1603       node_type = get_type(parse_tree[i]);
1604       if (node_type === 'string') {
1605         output.push(parse_tree[i]);
1606       }
1607       else if (node_type === 'array') {
1608         match = parse_tree[i]; // convenience purposes only
1609         if (match[2]) { // keyword argument
1610           arg = argv[cursor];
1611           for (k = 0; k < match[2].length; k++) {
1612             if (!arg.hasOwnProperty(match[2][k])) {
1613               throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
1614             }
1615             arg = arg[match[2][k]];
1616           }
1617         }
1618         else if (match[1]) { // positional argument (explicit)
1619           arg = argv[match[1]];
1620         }
1621         else { // positional argument (implicit)
1622           arg = argv[cursor++];
1623         }
1624
1625         if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
1626           throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
1627         }
1628         switch (match[8]) {
1629           case 'b': arg = arg.toString(2); break;
1630           case 'c': arg = String.fromCharCode(arg); break;
1631           case 'd': arg = parseInt(arg, 10); break;
1632           case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
1633           case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
1634           case 'o': arg = arg.toString(8); break;
1635           case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
1636           case 'u': arg = Math.abs(arg); break;
1637           case 'x': arg = arg.toString(16); break;
1638           case 'X': arg = arg.toString(16).toUpperCase(); break;
1639         }
1640         arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
1641         pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
1642         pad_length = match[6] - String(arg).length;
1643         pad = match[6] ? str_repeat(pad_character, pad_length) : '';
1644         output.push(match[5] ? arg + pad : pad + arg);
1645       }
1646     }
1647     return output.join('');
1648   };
1649
1650   str_format.cache = {};
1651
1652   str_format.parse = function(fmt) {
1653     var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
1654     while (_fmt) {
1655       if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
1656         parse_tree.push(match[0]);
1657       }
1658       else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
1659         parse_tree.push('%');
1660       }
1661       else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
1662         if (match[2]) {
1663           arg_names |= 1;
1664           var field_list = [], replacement_field = match[2], field_match = [];
1665           if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
1666             field_list.push(field_match[1]);
1667             while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
1668               if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
1669                 field_list.push(field_match[1]);
1670               }
1671               else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
1672                 field_list.push(field_match[1]);
1673               }
1674               else {
1675                 throw('[sprintf] huh?');
1676               }
1677             }
1678           }
1679           else {
1680             throw('[sprintf] huh?');
1681           }
1682           match[2] = field_list;
1683         }
1684         else {
1685           arg_names |= 2;
1686         }
1687         if (arg_names === 3) {
1688           throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
1689         }
1690         parse_tree.push(match);
1691       }
1692       else {
1693         throw('[sprintf] huh?');
1694       }
1695       _fmt = _fmt.substring(match[0].length);
1696     }
1697     return parse_tree;
1698   };
1699
1700   return str_format;
1701 })();
1702
1703 var vsprintf = function(fmt, argv) {
1704   argv.unshift(fmt);
1705   return sprintf.apply(null, argv);
1706 };
1707
1708 exports.sprintf = sprintf;
1709 exports.vsprintf = vsprintf;
1710 });
1711
1712 require.define("/shred/response.js", function (require, module, exports, __dirname, __filename) {
1713     // The `Response object` encapsulates a Node.js HTTP response.
1714
1715 var Content = require("./content")
1716   , HeaderMixins = require("./mixins/headers")
1717   , CookieJarLib = require( "cookiejar" )
1718   , Cookie = CookieJarLib.Cookie
1719 ;
1720
1721 // Browser doesn't have zlib.
1722 var zlib = null;
1723 try {
1724   zlib = require('zlib');
1725 } catch (e) {
1726   console.warn("no zlib library");
1727 }
1728
1729 // Iconv doesn't work in browser
1730 var Iconv = null;
1731 try {
1732   Iconv = require('iconv-lite');
1733 } catch (e) {
1734   console.warn("no iconv library");
1735 }
1736
1737 // Construct a `Response` object. You should never have to do this directly. The
1738 // `Request` object handles this, getting the raw response object and passing it
1739 // in here, along with the request. The callback allows us to stream the response
1740 // and then use the callback to let the request know when it's ready.
1741 var Response = function(raw, request, callback) { 
1742   var response = this;
1743   this._raw = raw;
1744
1745   // The `._setHeaders` method is "private"; you can't otherwise set headers on
1746   // the response.
1747   this._setHeaders.call(this,raw.headers);
1748   
1749   // store any cookies
1750   if (request.cookieJar && this.getHeader('set-cookie')) {
1751     var cookieStrings = this.getHeader('set-cookie');
1752     var cookieObjs = []
1753       , cookie;
1754
1755     for (var i = 0; i < cookieStrings.length; i++) {
1756       var cookieString = cookieStrings[i];
1757       if (!cookieString) {
1758         continue;
1759       }
1760
1761       if (!cookieString.match(/domain\=/i)) {
1762         cookieString += '; domain=' + request.host;
1763       }
1764
1765       if (!cookieString.match(/path\=/i)) {
1766         cookieString += '; path=' + request.path;
1767       }
1768
1769       try {
1770         cookie = new Cookie(cookieString);
1771         if (cookie) {
1772           cookieObjs.push(cookie);
1773         }
1774       } catch (e) {
1775         console.warn("Tried to set bad cookie: " + cookieString);
1776       }
1777     }
1778
1779     request.cookieJar.setCookies(cookieObjs);
1780   }
1781
1782   this.request = request;
1783   this.client = request.client;
1784   this.log = this.request.log;
1785
1786   // Stream the response content entity and fire the callback when we're done.
1787   // Store the incoming data in a array of Buffers which we concatinate into one
1788   // buffer at the end.  We need to use buffers instead of strings here in order
1789   // to preserve binary data.
1790   var chunkBuffers = [];
1791   var dataLength = 0;
1792   raw.on("data", function(chunk) {
1793     chunkBuffers.push(chunk);
1794     dataLength += chunk.length;
1795   });
1796   raw.on("end", function() {
1797     var body;
1798     if (typeof Buffer === 'undefined') {
1799       // Just concatinate into a string
1800       body = chunkBuffers.join('');
1801     } else {
1802       // Initialize new buffer and add the chunks one-at-a-time.
1803       body = new Buffer(dataLength);
1804       for (var i = 0, pos = 0; i < chunkBuffers.length; i++) {
1805         chunkBuffers[i].copy(body, pos);
1806         pos += chunkBuffers[i].length;
1807       }
1808     }
1809
1810     var setBodyAndFinish = function (body) {
1811       response._body = new Content({ 
1812         body: body,
1813         type: response.getHeader("Content-Type")
1814       });
1815       callback(response);
1816     }
1817
1818     if (zlib && response.getHeader("Content-Encoding") === 'gzip'){
1819       zlib.gunzip(body, function (err, gunzippedBody) {
1820         if (Iconv && response.request.encoding){
1821           body = Iconv.fromEncoding(gunzippedBody,response.request.encoding);
1822         } else {
1823           body = gunzippedBody.toString();
1824         }
1825         setBodyAndFinish(body);
1826       })
1827     }
1828     else{
1829        if (response.request.encoding){
1830             body = Iconv.fromEncoding(body,response.request.encoding);
1831         }        
1832       setBodyAndFinish(body);
1833     }
1834   });
1835 };
1836
1837 // The `Response` object can be pretty overwhelming to view using the built-in
1838 // Node.js inspect method. We want to make it a bit more manageable. This
1839 // probably goes [too far in the other
1840 // direction](https://github.com/spire-io/shred/issues/2).
1841
1842 Response.prototype = {
1843   inspect: function() {
1844     var response = this;
1845     var headers = this.format_headers();
1846     var summary = ["<Shred Response> ", response.status].join(" ")
1847     return [ summary, "- Headers:", headers].join("\n");
1848   },
1849   format_headers: function () {
1850     var array = []
1851     var headers = this._headers
1852     for (var key in headers) {
1853       if (headers.hasOwnProperty(key)) {
1854         var value = headers[key]
1855         array.push("\t" + key + ": " + value);
1856       }
1857     }
1858     return array.join("\n");
1859   }
1860 };
1861
1862 // `Response` object properties, all of which are read-only:
1863 Object.defineProperties(Response.prototype, {
1864   
1865 // - **status**. The HTTP status code for the response. 
1866   status: {
1867     get: function() { return this._raw.statusCode; },
1868     enumerable: true
1869   },
1870
1871 // - **content**. The HTTP content entity, if any. Provided as a [content
1872 //   object](./content.html), which will attempt to convert the entity based upon
1873 //   the `content-type` header. The converted value is available as
1874 //   `content.data`. The original raw content entity is available as
1875 //   `content.body`.
1876   body: {
1877     get: function() { return this._body; }
1878   },
1879   content: {
1880     get: function() { return this.body; },
1881     enumerable: true
1882   },
1883
1884 // - **isRedirect**. Is the response a redirect? These are responses with 3xx
1885 //   status and a `Location` header.
1886   isRedirect: {
1887     get: function() {
1888       return (this.status>299
1889           &&this.status<400
1890           &&this.getHeader("Location"));
1891     },
1892     enumerable: true
1893   },
1894
1895 // - **isError**. Is the response an error? These are responses with status of
1896 //   400 or greater.
1897   isError: {
1898     get: function() {
1899       return (this.status === 0 || this.status > 399)
1900     },
1901     enumerable: true
1902   }
1903 });
1904
1905 // Add in the [getters for accessing the normalized headers](./headers.js).
1906 HeaderMixins.getters(Response);
1907 HeaderMixins.privateSetters(Response);
1908
1909 // Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes
1910 // getAllResponseHeaders() to return {} if the response is a CORS request.
1911 // xhr.getHeader still works correctly.
1912 var getHeader = Response.prototype.getHeader;
1913 Response.prototype.getHeader = function (name) {
1914   return (getHeader.call(this,name) ||
1915     (typeof this._raw.getHeader === 'function' && this._raw.getHeader(name)));
1916 };
1917
1918 module.exports = Response;
1919
1920 });
1921
1922 require.define("/shred/content.js", function (require, module, exports, __dirname, __filename) {
1923     
1924 // The purpose of the `Content` object is to abstract away the data conversions
1925 // to and from raw content entities as strings. For example, you want to be able
1926 // to pass in a Javascript object and have it be automatically converted into a
1927 // JSON string if the `content-type` is set to a JSON-based media type.
1928 // Conversely, you want to be able to transparently get back a Javascript object
1929 // in the response if the `content-type` is a JSON-based media-type.
1930
1931 // One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5).
1932
1933 // The `Content` constructor takes an options object, which *must* have either a
1934 // `body` or `data` property and *may* have a `type` property indicating the
1935 // media type. If there is no `type` attribute, a default will be inferred.
1936 var Content = function(options) {
1937   this.body = options.body;
1938   this.data = options.data;
1939   this.type = options.type;
1940 };
1941
1942 Content.prototype = {
1943   // Treat `toString()` as asking for the `content.body`. That is, the raw content entity.
1944   //
1945   //     toString: function() { return this.body; }
1946   //
1947   // Commented out, but I've forgotten why. :/
1948 };
1949
1950
1951 // `Content` objects have the following attributes:
1952 Object.defineProperties(Content.prototype,{
1953   
1954 // - **type**. Typically accessed as `content.type`, reflects the `content-type`
1955 //   header associated with the request or response. If not passed as an options
1956 //   to the constructor or set explicitly, it will infer the type the `data`
1957 //   attribute, if possible, and, failing that, will default to `text/plain`.
1958   type: {
1959     get: function() {
1960       if (this._type) {
1961         return this._type;
1962       } else {
1963         if (this._data) {
1964           switch(typeof this._data) {
1965             case "string": return "text/plain";
1966             case "object": return "application/json";
1967           }
1968         }
1969       }
1970       return "text/plain";
1971     },
1972     set: function(value) {
1973       this._type = value;
1974       return this;
1975     },
1976     enumerable: true
1977   },
1978
1979 // - **data**. Typically accessed as `content.data`, reflects the content entity
1980 //   converted into Javascript data. This can be a string, if the `type` is, say,
1981 //   `text/plain`, but can also be a Javascript object. The conversion applied is
1982 //   based on the `processor` attribute. The `data` attribute can also be set
1983 //   directly, in which case the conversion will be done the other way, to infer
1984 //   the `body` attribute.
1985   data: {
1986     get: function() {
1987       if (this._body) {
1988         return this.processor.parser(this._body);
1989       } else {
1990         return this._data;
1991       }
1992     },
1993     set: function(data) {
1994       if (this._body&&data) Errors.setDataWithBody(this);
1995       this._data = data;
1996       return this;
1997     },
1998     enumerable: true
1999   },
2000
2001 // - **body**. Typically accessed as `content.body`, reflects the content entity
2002 //   as a UTF-8 string. It is the mirror of the `data` attribute. If you set the
2003 //   `data` attribute, the `body` attribute will be inferred and vice-versa. If
2004 //   you attempt to set both, an exception is raised.
2005   body: {
2006     get: function() {
2007       if (this._data) {
2008         return this.processor.stringify(this._data);
2009       } else {
2010         return this.processor.stringify(this._body);
2011       }
2012     },
2013     set: function(body) {
2014       if (this._data&&body) Errors.setBodyWithData(this);
2015       this._body = body;
2016       return this;
2017     },
2018     enumerable: true
2019   },
2020
2021 // - **processor**. The functions that will be used to convert to/from `data` and
2022 //   `body` attributes. You can add processors. The two that are built-in are for
2023 //   `text/plain`, which is basically an identity transformation and
2024 //   `application/json` and other JSON-based media types (including custom media
2025 //   types with `+json`). You can add your own processors. See below.
2026   processor: {
2027     get: function() {
2028       var processor = Content.processors[this.type];
2029       if (processor) {
2030         return processor;
2031       } else {
2032         // Return the first processor that matches any part of the
2033         // content type. ex: application/vnd.foobar.baz+json will match json.
2034         var main = this.type.split(";")[0];
2035         var parts = main.split(/\+|\//);
2036         for (var i=0, l=parts.length; i < l; i++) {
2037           processor = Content.processors[parts[i]]
2038         }
2039         return processor || {parser:identity,stringify:toString};
2040       }
2041     },
2042     enumerable: true
2043   },
2044
2045 // - **length**. Typically accessed as `content.length`, returns the length in
2046 //   bytes of the raw content entity.
2047   length: {
2048     get: function() {
2049       if (typeof Buffer !== 'undefined') {
2050         return Buffer.byteLength(this.body);
2051       }
2052       return this.body.length;
2053     }
2054   }
2055 });
2056
2057 Content.processors = {};
2058
2059 // The `registerProcessor` function allows you to add your own processors to
2060 // convert content entities. Each processor consists of a Javascript object with
2061 // two properties:
2062 // - **parser**. The function used to parse a raw content entity and convert it
2063 //   into a Javascript data type.
2064 // - **stringify**. The function used to convert a Javascript data type into a
2065 //   raw content entity.
2066 Content.registerProcessor = function(types,processor) {
2067   
2068 // You can pass an array of types that will trigger this processor, or just one.
2069 // We determine the array via duck-typing here.
2070   if (types.forEach) {
2071     types.forEach(function(type) {
2072       Content.processors[type] = processor;
2073     });
2074   } else {
2075     // If you didn't pass an array, we just use what you pass in.
2076     Content.processors[types] = processor;
2077   }
2078 };
2079
2080 // Register the identity processor, which is used for text-based media types.
2081 var identity = function(x) { return x; }
2082   , toString = function(x) { return x.toString(); }
2083 Content.registerProcessor(
2084   ["text/html","text/plain","text"],
2085   { parser: identity, stringify: toString });
2086
2087 // Register the JSON processor, which is used for JSON-based media types.
2088 Content.registerProcessor(
2089   ["application/json; charset=utf-8","application/json","json"],
2090   {
2091     parser: function(string) {
2092       return JSON.parse(string);
2093     },
2094     stringify: function(data) {
2095       return JSON.stringify(data); }});
2096
2097 // Error functions are defined separately here in an attempt to make the code
2098 // easier to read.
2099 var Errors = {
2100   setDataWithBody: function(object) {
2101     throw new Error("Attempt to set data attribute of a content object " +
2102         "when the body attributes was already set.");
2103   },
2104   setBodyWithData: function(object) {
2105     throw new Error("Attempt to set body attribute of a content object " +
2106         "when the data attributes was already set.");
2107   }
2108 }
2109 module.exports = Content;
2110
2111 });
2112
2113 require.define("/shred/mixins/headers.js", function (require, module, exports, __dirname, __filename) {
2114     // The header mixins allow you to add HTTP header support to any object. This
2115 // might seem pointless: why not simply use a hash? The main reason is that, per
2116 // the [HTTP spec](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2),
2117 // headers are case-insensitive. So, for example, `content-type` is the same as
2118 // `CONTENT-TYPE` which is the same as `Content-Type`. Since there is no way to
2119 // overload the index operator in Javascript, using a hash to represent the
2120 // headers means it's possible to have two conflicting values for a single
2121 // header.
2122 // 
2123 // The solution to this is to provide explicit methods to set or get headers.
2124 // This also has the benefit of allowing us to introduce additional variations,
2125 // including snake case, which we automatically convert to what Matthew King has
2126 // dubbed "corset case" - the hyphen-separated names with initial caps:
2127 // `Content-Type`. We use corset-case just in case we're dealing with servers
2128 // that haven't properly implemented the spec.
2129
2130 // Convert headers to corset-case. **Example:** `CONTENT-TYPE` will be converted
2131 // to `Content-Type`.
2132
2133 var corsetCase = function(string) {
2134   return string.toLowerCase()
2135       //.replace("_","-")
2136       .replace(/(^|-)(\w)/g, 
2137           function(s) { return s.toUpperCase(); });
2138 };
2139
2140 // We suspect that `initializeHeaders` was once more complicated ...
2141 var initializeHeaders = function(object) {
2142   return {};
2143 };
2144
2145 // Access the `_headers` property using lazy initialization. **Warning:** If you
2146 // mix this into an object that is using the `_headers` property already, you're
2147 // going to have trouble.
2148 var $H = function(object) {
2149   return object._headers||(object._headers=initializeHeaders(object));
2150 };
2151
2152 // Hide the implementations as private functions, separate from how we expose them.
2153
2154 // The "real" `getHeader` function: get the header after normalizing the name.
2155 var getHeader = function(object,name) {
2156   return $H(object)[corsetCase(name)];
2157 };
2158
2159 // The "real" `getHeader` function: get one or more headers, or all of them
2160 // if you don't ask for any specifics. 
2161 var getHeaders = function(object,names) {
2162   var keys = (names && names.length>0) ? names : Object.keys($H(object));
2163   var hash = keys.reduce(function(hash,key) {
2164     hash[key] = getHeader(object,key);
2165     return hash;
2166   },{});
2167   // Freeze the resulting hash so you don't mistakenly think you're modifying
2168   // the real headers.
2169   Object.freeze(hash);
2170   return hash;
2171 };
2172
2173 // The "real" `setHeader` function: set a header, after normalizing the name.
2174 var setHeader = function(object,name,value) {
2175   $H(object)[corsetCase(name)] = value;
2176   return object;
2177 };
2178
2179 // The "real" `setHeaders` function: set multiple headers based on a hash.
2180 var setHeaders = function(object,hash) {
2181   for( var key in hash ) { setHeader(object,key,hash[key]); };
2182   return this;
2183 };
2184
2185 // Here's where we actually bind the functionality to an object. These mixins work by
2186 // exposing mixin functions. Each function mixes in a specific batch of features.
2187 module.exports = {
2188   
2189   // Add getters.
2190   getters: function(constructor) {
2191     constructor.prototype.getHeader = function(name) { return getHeader(this,name); };
2192     constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); };
2193   },
2194   // Add setters but as "private" methods.
2195   privateSetters: function(constructor) {
2196     constructor.prototype._setHeader = function(key,value) { return setHeader(this,key,value); };
2197     constructor.prototype._setHeaders = function(hash) { return setHeaders(this,hash); };
2198   },
2199   // Add setters.
2200   setters: function(constructor) {
2201     constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); };
2202     constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); };
2203   },
2204   // Add both getters and setters.
2205   gettersAndSetters: function(constructor) {
2206     constructor.prototype.getHeader = function(name) { return getHeader(this,name); };
2207     constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); };
2208     constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); };
2209     constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); };
2210   },
2211 };
2212
2213 });
2214
2215 require.define("/node_modules/iconv-lite/package.json", function (require, module, exports, __dirname, __filename) {
2216     module.exports = {}
2217 });
2218
2219 require.define("/node_modules/iconv-lite/index.js", function (require, module, exports, __dirname, __filename) {
2220     // Module exports
2221 var iconv = module.exports = {
2222     toEncoding: function(str, encoding) {
2223         return iconv.getCodec(encoding).toEncoding(str);
2224     },
2225     fromEncoding: function(buf, encoding) {
2226         return iconv.getCodec(encoding).fromEncoding(buf);
2227     },
2228     
2229     defaultCharUnicode: '�',
2230     defaultCharSingleByte: '?',
2231     
2232     // Get correct codec for given encoding.
2233     getCodec: function(encoding) {
2234         var enc = encoding || "utf8";
2235         var codecOptions = undefined;
2236         while (1) {
2237             if (getType(enc) === "String")
2238                 enc = enc.replace(/[- ]/g, "").toLowerCase();
2239             var codec = iconv.encodings[enc];
2240             var type = getType(codec);
2241             if (type === "String") {
2242                 // Link to other encoding.
2243                 codecOptions = {originalEncoding: enc};
2244                 enc = codec;
2245             }
2246             else if (type === "Object" && codec.type != undefined) {
2247                 // Options for other encoding.
2248                 codecOptions = codec;
2249                 enc = codec.type;
2250             } 
2251             else if (type === "Function")
2252                 // Codec itself.
2253                 return codec(codecOptions);
2254             else
2255                 throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
2256         }
2257     },
2258     
2259     // Define basic encodings
2260     encodings: {
2261         internal: function(options) {
2262             return {
2263                 toEncoding: function(str) {
2264                     return new Buffer(ensureString(str), options.originalEncoding);
2265                 },
2266                 fromEncoding: function(buf) {
2267                     return ensureBuffer(buf).toString(options.originalEncoding);
2268                 }
2269             };
2270         },
2271         utf8: "internal",
2272         ucs2: "internal",
2273         binary: "internal",
2274         ascii: "internal",
2275         base64: "internal",
2276         
2277         // Codepage single-byte encodings.
2278         singlebyte: function(options) {
2279             // Prepare chars if needed
2280             if (!options.chars || (options.chars.length !== 128 && options.chars.length !== 256))
2281                 throw new Error("Encoding '"+options.type+"' has incorrect 'chars' (must be of len 128 or 256)");
2282             
2283             if (options.chars.length === 128)
2284                 options.chars = asciiString + options.chars;
2285             
2286             if (!options.charsBuf) {
2287                 options.charsBuf = new Buffer(options.chars, 'ucs2');
2288             }
2289             
2290             if (!options.revCharsBuf) {
2291                 options.revCharsBuf = new Buffer(65536);
2292                 var defChar = iconv.defaultCharSingleByte.charCodeAt(0);
2293                 for (var i = 0; i < options.revCharsBuf.length; i++)
2294                     options.revCharsBuf[i] = defChar;
2295                 for (var i = 0; i < options.chars.length; i++)
2296                     options.revCharsBuf[options.chars.charCodeAt(i)] = i;
2297             }
2298             
2299             return {
2300                 toEncoding: function(str) {
2301                     str = ensureString(str);
2302                     
2303                     var buf = new Buffer(str.length);
2304                     var revCharsBuf = options.revCharsBuf;
2305                     for (var i = 0; i < str.length; i++)
2306                         buf[i] = revCharsBuf[str.charCodeAt(i)];
2307                     
2308                     return buf;
2309                 },
2310                 fromEncoding: function(buf) {
2311                     buf = ensureBuffer(buf);
2312                     
2313                     // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
2314                     var charsBuf = options.charsBuf;
2315                     var newBuf = new Buffer(buf.length*2);
2316                     var idx1 = 0, idx2 = 0;
2317                     for (var i = 0, _len = buf.length; i < _len; i++) {
2318                         idx1 = buf[i]*2; idx2 = i*2;
2319                         newBuf[idx2] = charsBuf[idx1];
2320                         newBuf[idx2+1] = charsBuf[idx1+1];
2321                     }
2322                     return newBuf.toString('ucs2');
2323                 }
2324             };
2325         },
2326
2327         // Codepage double-byte encodings.
2328         table: function(options) {
2329             var table = options.table, key, revCharsTable = options.revCharsTable;
2330             if (!table) {
2331                 throw new Error("Encoding '" + options.type +"' has incorect 'table' option");
2332             }
2333             if(!revCharsTable) {
2334                 revCharsTable = options.revCharsTable = {};
2335                 for (key in table) {
2336                     revCharsTable[table[key]] = parseInt(key);
2337                 }
2338             }
2339             
2340             return {
2341                 toEncoding: function(str) {
2342                     str = ensureString(str);
2343                     var strLen = str.length;
2344                     var bufLen = strLen;
2345                     for (var i = 0; i < strLen; i++)
2346                         if (str.charCodeAt(i) >> 7)
2347                             bufLen++;
2348
2349                     var newBuf = new Buffer(bufLen), gbkcode, unicode, 
2350                         defaultChar = revCharsTable[iconv.defaultCharUnicode.charCodeAt(0)];
2351
2352                     for (var i = 0, j = 0; i < strLen; i++) {
2353                         unicode = str.charCodeAt(i);
2354                         if (unicode >> 7) {
2355                             gbkcode = revCharsTable[unicode] || defaultChar;
2356                             newBuf[j++] = gbkcode >> 8; //high byte;
2357                             newBuf[j++] = gbkcode & 0xFF; //low byte
2358                         } else {//ascii
2359                             newBuf[j++] = unicode;
2360                         }
2361                     }
2362                     return newBuf;
2363                 },
2364                 fromEncoding: function(buf) {
2365                     buf = ensureBuffer(buf);
2366                     var bufLen = buf.length, strLen = 0;
2367                     for (var i = 0; i < bufLen; i++) {
2368                         strLen++;
2369                         if (buf[i] & 0x80) //the high bit is 1, so this byte is gbkcode's high byte.skip next byte
2370                             i++;
2371                     }
2372                     var newBuf = new Buffer(strLen*2), unicode, gbkcode,
2373                         defaultChar = iconv.defaultCharUnicode.charCodeAt(0);
2374                     
2375                     for (var i = 0, j = 0; i < bufLen; i++, j+=2) {
2376                         gbkcode = buf[i];
2377                         if (gbkcode & 0x80) {
2378                             gbkcode = (gbkcode << 8) + buf[++i];
2379                             unicode = table[gbkcode] || defaultChar;
2380                         } else {
2381                             unicode = gbkcode;
2382                         }
2383                         newBuf[j] = unicode & 0xFF; //low byte
2384                         newBuf[j+1] = unicode >> 8; //high byte
2385                     }
2386                     return newBuf.toString('ucs2');
2387                 }
2388             }
2389         }
2390     }
2391 };
2392
2393 // Add aliases to convert functions
2394 iconv.encode = iconv.toEncoding;
2395 iconv.decode = iconv.fromEncoding;
2396
2397 // Load other encodings from files in /encodings dir.
2398 var encodingsDir = __dirname+"/encodings/",
2399     fs = require('fs');
2400 fs.readdirSync(encodingsDir).forEach(function(file) {
2401     if(fs.statSync(encodingsDir + file).isDirectory()) return;
2402     var encodings = require(encodingsDir + file)
2403     for (var key in encodings)
2404         iconv.encodings[key] = encodings[key]
2405 });
2406
2407 // Utilities
2408 var asciiString = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'+
2409               ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f';
2410
2411 var ensureBuffer = function(buf) {
2412     buf = buf || new Buffer(0);
2413     return (buf instanceof Buffer) ? buf : new Buffer(buf.toString(), "utf8");
2414 }
2415
2416 var ensureString = function(str) {
2417     str = str || "";
2418     return (str instanceof String) ? str : str.toString((str instanceof Buffer) ? 'utf8' : undefined);
2419 }
2420
2421 var getType = function(obj) {
2422     return Object.prototype.toString.call(obj).slice(8, -1);
2423 }
2424
2425
2426 });
2427
2428 require.define("/node_modules/http-browserify/package.json", function (require, module, exports, __dirname, __filename) {
2429     module.exports = {"main":"index.js","browserify":"browser.js"}
2430 });
2431
2432 require.define("/node_modules/http-browserify/browser.js", function (require, module, exports, __dirname, __filename) {
2433     var http = module.exports;
2434 var EventEmitter = require('events').EventEmitter;
2435 var Request = require('./lib/request');
2436
2437 http.request = function (params, cb) {
2438     if (!params) params = {};
2439     if (!params.host) params.host = window.location.host.split(':')[0];
2440     if (!params.port) params.port = window.location.port;
2441     
2442     var req = new Request(new xhrHttp, params);
2443     if (cb) req.on('response', cb);
2444     return req;
2445 };
2446
2447 http.get = function (params, cb) {
2448     params.method = 'GET';
2449     var req = http.request(params, cb);
2450     req.end();
2451     return req;
2452 };
2453
2454 var xhrHttp = (function () {
2455     if (typeof window === 'undefined') {
2456         throw new Error('no window object present');
2457     }
2458     else if (window.XMLHttpRequest) {
2459         return window.XMLHttpRequest;
2460     }
2461     else if (window.ActiveXObject) {
2462         var axs = [
2463             'Msxml2.XMLHTTP.6.0',
2464             'Msxml2.XMLHTTP.3.0',
2465             'Microsoft.XMLHTTP'
2466         ];
2467         for (var i = 0; i < axs.length; i++) {
2468             try {
2469                 var ax = new(window.ActiveXObject)(axs[i]);
2470                 return function () {
2471                     if (ax) {
2472                         var ax_ = ax;
2473                         ax = null;
2474                         return ax_;
2475                     }
2476                     else {
2477                         return new(window.ActiveXObject)(axs[i]);
2478                     }
2479                 };
2480             }
2481             catch (e) {}
2482         }
2483         throw new Error('ajax not supported in this browser')
2484     }
2485     else {
2486         throw new Error('ajax not supported in this browser');
2487     }
2488 })();
2489
2490 http.STATUS_CODES = {
2491     100 : 'Continue',
2492     101 : 'Switching Protocols',
2493     102 : 'Processing', // RFC 2518, obsoleted by RFC 4918
2494     200 : 'OK',
2495     201 : 'Created',
2496     202 : 'Accepted',
2497     203 : 'Non-Authoritative Information',
2498     204 : 'No Content',
2499     205 : 'Reset Content',
2500     206 : 'Partial Content',
2501     207 : 'Multi-Status', // RFC 4918
2502     300 : 'Multiple Choices',
2503     301 : 'Moved Permanently',
2504     302 : 'Moved Temporarily',
2505     303 : 'See Other',
2506     304 : 'Not Modified',
2507     305 : 'Use Proxy',
2508     307 : 'Temporary Redirect',
2509     400 : 'Bad Request',
2510     401 : 'Unauthorized',
2511     402 : 'Payment Required',
2512     403 : 'Forbidden',
2513     404 : 'Not Found',
2514     405 : 'Method Not Allowed',
2515     406 : 'Not Acceptable',
2516     407 : 'Proxy Authentication Required',
2517     408 : 'Request Time-out',
2518     409 : 'Conflict',
2519     410 : 'Gone',
2520     411 : 'Length Required',
2521     412 : 'Precondition Failed',
2522     413 : 'Request Entity Too Large',
2523     414 : 'Request-URI Too Large',
2524     415 : 'Unsupported Media Type',
2525     416 : 'Requested Range Not Satisfiable',
2526     417 : 'Expectation Failed',
2527     418 : 'I\'m a teapot', // RFC 2324
2528     422 : 'Unprocessable Entity', // RFC 4918
2529     423 : 'Locked', // RFC 4918
2530     424 : 'Failed Dependency', // RFC 4918
2531     425 : 'Unordered Collection', // RFC 4918
2532     426 : 'Upgrade Required', // RFC 2817
2533     500 : 'Internal Server Error',
2534     501 : 'Not Implemented',
2535     502 : 'Bad Gateway',
2536     503 : 'Service Unavailable',
2537     504 : 'Gateway Time-out',
2538     505 : 'HTTP Version not supported',
2539     506 : 'Variant Also Negotiates', // RFC 2295
2540     507 : 'Insufficient Storage', // RFC 4918
2541     509 : 'Bandwidth Limit Exceeded',
2542     510 : 'Not Extended' // RFC 2774
2543 };
2544
2545 });
2546
2547 require.define("/node_modules/http-browserify/lib/request.js", function (require, module, exports, __dirname, __filename) {
2548     var EventEmitter = require('events').EventEmitter;
2549 var Response = require('./response');
2550 var isSafeHeader = require('./isSafeHeader');
2551
2552 var Request = module.exports = function (xhr, params) {
2553     var self = this;
2554     self.xhr = xhr;
2555     self.body = '';
2556     
2557     var uri = params.host + ':' + params.port + (params.path || '/');
2558     
2559     xhr.open(
2560         params.method || 'GET',
2561         (params.scheme || 'http') + '://' + uri,
2562         true
2563     );
2564     
2565     if (params.headers) {
2566         Object.keys(params.headers).forEach(function (key) {
2567             if (!isSafeHeader(key)) return;
2568             var value = params.headers[key];
2569             if (Array.isArray(value)) {
2570                 value.forEach(function (v) {
2571                     xhr.setRequestHeader(key, v);
2572                 });
2573             }
2574             else xhr.setRequestHeader(key, value)
2575         });
2576     }
2577     
2578     var res = new Response(xhr);
2579     res.on('ready', function () {
2580         self.emit('response', res);
2581     });
2582     
2583     xhr.onreadystatechange = function () {
2584         res.handle(xhr);
2585     };
2586 };
2587
2588 Request.prototype = new EventEmitter;
2589
2590 Request.prototype.setHeader = function (key, value) {
2591     if ((Array.isArray && Array.isArray(value))
2592     || value instanceof Array) {
2593         for (var i = 0; i < value.length; i++) {
2594             this.xhr.setRequestHeader(key, value[i]);
2595         }
2596     }
2597     else {
2598         this.xhr.setRequestHeader(key, value);
2599     }
2600 };
2601
2602 Request.prototype.write = function (s) {
2603     this.body += s;
2604 };
2605
2606 Request.prototype.end = function (s) {
2607     if (s !== undefined) this.write(s);
2608     this.xhr.send(this.body);
2609 };
2610
2611 });
2612
2613 require.define("/node_modules/http-browserify/lib/response.js", function (require, module, exports, __dirname, __filename) {
2614     var EventEmitter = require('events').EventEmitter;
2615 var isSafeHeader = require('./isSafeHeader');
2616
2617 var Response = module.exports = function (xhr) {
2618     this.xhr = xhr;
2619     this.offset = 0;
2620 };
2621
2622 Response.prototype = new EventEmitter;
2623
2624 var capable = {
2625     streaming : true,
2626     status2 : true
2627 };
2628
2629 function parseHeaders (xhr) {
2630     var lines = xhr.getAllResponseHeaders().split(/\r?\n/);
2631     var headers = {};
2632     for (var i = 0; i < lines.length; i++) {
2633         var line = lines[i];
2634         if (line === '') continue;
2635         
2636         var m = line.match(/^([^:]+):\s*(.*)/);
2637         if (m) {
2638             var key = m[1].toLowerCase(), value = m[2];
2639             
2640             if (headers[key] !== undefined) {
2641                 if ((Array.isArray && Array.isArray(headers[key]))
2642                 || headers[key] instanceof Array) {
2643                     headers[key].push(value);
2644                 }
2645                 else {
2646                     headers[key] = [ headers[key], value ];
2647                 }
2648             }
2649             else {
2650                 headers[key] = value;
2651             }
2652         }
2653         else {
2654             headers[line] = true;
2655         }
2656     }
2657     return headers;
2658 }
2659
2660 Response.prototype.getHeader = function (key) {
2661     var header = this.headers ? this.headers[key.toLowerCase()] : null;
2662     if (header) return header;
2663
2664     // Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes
2665     // getAllResponseHeaders() to return {} if the response is a CORS request.
2666     // xhr.getHeader still works correctly.
2667     if (isSafeHeader(key)) {
2668       return this.xhr.getResponseHeader(key);
2669     }
2670     return null;
2671 };
2672
2673 Response.prototype.handle = function () {
2674     var xhr = this.xhr;
2675     if (xhr.readyState === 2 && capable.status2) {
2676         try {
2677             this.statusCode = xhr.status;
2678             this.headers = parseHeaders(xhr);
2679         }
2680         catch (err) {
2681             capable.status2 = false;
2682         }
2683         
2684         if (capable.status2) {
2685             this.emit('ready');
2686         }
2687     }
2688     else if (capable.streaming && xhr.readyState === 3) {
2689         try {
2690             if (!this.statusCode) {
2691                 this.statusCode = xhr.status;
2692                 this.headers = parseHeaders(xhr);
2693                 this.emit('ready');
2694             }
2695         }
2696         catch (err) {}
2697         
2698         try {
2699             this.write();
2700         }
2701         catch (err) {
2702             capable.streaming = false;
2703         }
2704     }
2705     else if (xhr.readyState === 4) {
2706         if (!this.statusCode) {
2707             this.statusCode = xhr.status;
2708             this.emit('ready');
2709         }
2710         this.write();
2711         
2712         if (xhr.error) {
2713             this.emit('error', xhr.responseText);
2714         }
2715         else this.emit('end');
2716     }
2717 };
2718
2719 Response.prototype.write = function () {
2720     var xhr = this.xhr;
2721     if (xhr.responseText.length > this.offset) {
2722         this.emit('data', xhr.responseText.slice(this.offset));
2723         this.offset = xhr.responseText.length;
2724     }
2725 };
2726
2727 });
2728
2729 require.define("/node_modules/http-browserify/lib/isSafeHeader.js", function (require, module, exports, __dirname, __filename) {
2730     // Taken from http://dxr.mozilla.org/mozilla/mozilla-central/content/base/src/nsXMLHttpRequest.cpp.html
2731 var unsafeHeaders = [
2732     "accept-charset",
2733     "accept-encoding",
2734     "access-control-request-headers",
2735     "access-control-request-method",
2736     "connection",
2737     "content-length",
2738     "cookie",
2739     "cookie2",
2740     "content-transfer-encoding",
2741     "date",
2742     "expect",
2743     "host",
2744     "keep-alive",
2745     "origin",
2746     "referer",
2747     "set-cookie",
2748     "te",
2749     "trailer",
2750     "transfer-encoding",
2751     "upgrade",
2752     "user-agent",
2753     "via"
2754 ];
2755
2756 module.exports = function (headerName) {
2757     if (!headerName) return false;
2758     return (unsafeHeaders.indexOf(headerName.toLowerCase()) === -1)
2759 };
2760
2761 });
2762
2763 require.alias("http-browserify", "/node_modules/http");
2764
2765 require.alias("http-browserify", "/node_modules/https");