| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073 | 
							- // vim:ts=4:sts=4:sw=4:
 
- /*!
 
-  *
 
-  * Copyright 2009-2017 Kris Kowal under the terms of the MIT
 
-  * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
 
-  *
 
-  * With parts by Tyler Close
 
-  * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
 
-  * at http://www.opensource.org/licenses/mit-license.html
 
-  * Forked at ref_send.js version: 2009-05-11
 
-  *
 
-  * With parts by Mark Miller
 
-  * Copyright (C) 2011 Google Inc.
 
-  *
 
-  * Licensed under the Apache License, Version 2.0 (the "License");
 
-  * you may not use this file except in compliance with the License.
 
-  * You may obtain a copy of the License at
 
-  *
 
-  * http://www.apache.org/licenses/LICENSE-2.0
 
-  *
 
-  * Unless required by applicable law or agreed to in writing, software
 
-  * distributed under the License is distributed on an "AS IS" BASIS,
 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
-  * See the License for the specific language governing permissions and
 
-  * limitations under the License.
 
-  *
 
-  */
 
- (function (definition) {
 
-     "use strict";
 
-     // This file will function properly as a <script> tag, or a module
 
-     // using CommonJS and NodeJS or RequireJS module formats.  In
 
-     // Common/Node/RequireJS, the module exports the Q API and when
 
-     // executed as a simple <script>, it creates a Q global instead.
 
-     // Montage Require
 
-     if (typeof bootstrap === "function") {
 
-         bootstrap("promise", definition);
 
-     // CommonJS
 
-     } else if (typeof exports === "object" && typeof module === "object") {
 
-         module.exports = definition();
 
-     // RequireJS
 
-     } else if (typeof define === "function" && define.amd) {
 
-         define(definition);
 
-     // SES (Secure EcmaScript)
 
-     } else if (typeof ses !== "undefined") {
 
-         if (!ses.ok()) {
 
-             return;
 
-         } else {
 
-             ses.makeQ = definition;
 
-         }
 
-     // <script>
 
-     } else if (typeof window !== "undefined" || typeof self !== "undefined") {
 
-         // Prefer window over self for add-on scripts. Use self for
 
-         // non-windowed contexts.
 
-         var global = typeof window !== "undefined" ? window : self;
 
-         // Get the `window` object, save the previous Q global
 
-         // and initialize Q as a global.
 
-         var previousQ = global.Q;
 
-         global.Q = definition();
 
-         // Add a noConflict function so Q can be removed from the
 
-         // global namespace.
 
-         global.Q.noConflict = function () {
 
-             global.Q = previousQ;
 
-             return this;
 
-         };
 
-     } else {
 
-         throw new Error("This environment was not anticipated by Q. Please file a bug.");
 
-     }
 
- })(function () {
 
- "use strict";
 
- var hasStacks = false;
 
- try {
 
-     throw new Error();
 
- } catch (e) {
 
-     hasStacks = !!e.stack;
 
- }
 
- // All code after this point will be filtered from stack traces reported
 
- // by Q.
 
- var qStartingLine = captureLine();
 
- var qFileName;
 
- // shims
 
- // used for fallback in "allResolved"
 
- var noop = function () {};
 
- // Use the fastest possible means to execute a task in a future turn
 
- // of the event loop.
 
- var nextTick =(function () {
 
-     // linked list of tasks (single, with head node)
 
-     var head = {task: void 0, next: null};
 
-     var tail = head;
 
-     var flushing = false;
 
-     var requestTick = void 0;
 
-     var isNodeJS = false;
 
-     // queue for late tasks, used by unhandled rejection tracking
 
-     var laterQueue = [];
 
-     function flush() {
 
-         /* jshint loopfunc: true */
 
-         var task, domain;
 
-         while (head.next) {
 
-             head = head.next;
 
-             task = head.task;
 
-             head.task = void 0;
 
-             domain = head.domain;
 
-             if (domain) {
 
-                 head.domain = void 0;
 
-                 domain.enter();
 
-             }
 
-             runSingle(task, domain);
 
-         }
 
-         while (laterQueue.length) {
 
-             task = laterQueue.pop();
 
-             runSingle(task);
 
-         }
 
-         flushing = false;
 
-     }
 
-     // runs a single function in the async queue
 
-     function runSingle(task, domain) {
 
-         try {
 
-             task();
 
-         } catch (e) {
 
-             if (isNodeJS) {
 
-                 // In node, uncaught exceptions are considered fatal errors.
 
-                 // Re-throw them synchronously to interrupt flushing!
 
-                 // Ensure continuation if the uncaught exception is suppressed
 
-                 // listening "uncaughtException" events (as domains does).
 
-                 // Continue in next event to avoid tick recursion.
 
-                 if (domain) {
 
-                     domain.exit();
 
-                 }
 
-                 setTimeout(flush, 0);
 
-                 if (domain) {
 
-                     domain.enter();
 
-                 }
 
-                 throw e;
 
-             } else {
 
-                 // In browsers, uncaught exceptions are not fatal.
 
-                 // Re-throw them asynchronously to avoid slow-downs.
 
-                 setTimeout(function () {
 
-                     throw e;
 
-                 }, 0);
 
-             }
 
-         }
 
-         if (domain) {
 
-             domain.exit();
 
-         }
 
-     }
 
-     nextTick = function (task) {
 
-         tail = tail.next = {
 
-             task: task,
 
-             domain: isNodeJS && process.domain,
 
-             next: null
 
-         };
 
-         if (!flushing) {
 
-             flushing = true;
 
-             requestTick();
 
-         }
 
-     };
 
-     if (typeof process === "object" &&
 
-         process.toString() === "[object process]" && process.nextTick) {
 
-         // Ensure Q is in a real Node environment, with a `process.nextTick`.
 
-         // To see through fake Node environments:
 
-         // * Mocha test runner - exposes a `process` global without a `nextTick`
 
-         // * Browserify - exposes a `process.nexTick` function that uses
 
-         //   `setTimeout`. In this case `setImmediate` is preferred because
 
-         //    it is faster. Browserify's `process.toString()` yields
 
-         //   "[object Object]", while in a real Node environment
 
-         //   `process.toString()` yields "[object process]".
 
-         isNodeJS = true;
 
-         requestTick = function () {
 
-             process.nextTick(flush);
 
-         };
 
-     } else if (typeof setImmediate === "function") {
 
-         // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
 
-         if (typeof window !== "undefined") {
 
-             requestTick = setImmediate.bind(window, flush);
 
-         } else {
 
-             requestTick = function () {
 
-                 setImmediate(flush);
 
-             };
 
-         }
 
-     } else if (typeof MessageChannel !== "undefined") {
 
-         // modern browsers
 
-         // http://www.nonblocking.io/2011/06/windownexttick.html
 
-         var channel = new MessageChannel();
 
-         // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
 
-         // working message ports the first time a page loads.
 
-         channel.port1.onmessage = function () {
 
-             requestTick = requestPortTick;
 
-             channel.port1.onmessage = flush;
 
-             flush();
 
-         };
 
-         var requestPortTick = function () {
 
-             // Opera requires us to provide a message payload, regardless of
 
-             // whether we use it.
 
-             channel.port2.postMessage(0);
 
-         };
 
-         requestTick = function () {
 
-             setTimeout(flush, 0);
 
-             requestPortTick();
 
-         };
 
-     } else {
 
-         // old browsers
 
-         requestTick = function () {
 
-             setTimeout(flush, 0);
 
-         };
 
-     }
 
-     // runs a task after all other tasks have been run
 
-     // this is useful for unhandled rejection tracking that needs to happen
 
-     // after all `then`d tasks have been run.
 
-     nextTick.runAfter = function (task) {
 
-         laterQueue.push(task);
 
-         if (!flushing) {
 
-             flushing = true;
 
-             requestTick();
 
-         }
 
-     };
 
-     return nextTick;
 
- })();
 
- // Attempt to make generics safe in the face of downstream
 
- // modifications.
 
- // There is no situation where this is necessary.
 
- // If you need a security guarantee, these primordials need to be
 
- // deeply frozen anyway, and if you don’t need a security guarantee,
 
- // this is just plain paranoid.
 
- // However, this **might** have the nice side-effect of reducing the size of
 
- // the minified code by reducing x.call() to merely x()
 
- // See Mark Miller’s explanation of what this does.
 
- // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
 
- var call = Function.call;
 
- function uncurryThis(f) {
 
-     return function () {
 
-         return call.apply(f, arguments);
 
-     };
 
- }
 
- // This is equivalent, but slower:
 
- // uncurryThis = Function_bind.bind(Function_bind.call);
 
- // http://jsperf.com/uncurrythis
 
- var array_slice = uncurryThis(Array.prototype.slice);
 
- var array_reduce = uncurryThis(
 
-     Array.prototype.reduce || function (callback, basis) {
 
-         var index = 0,
 
-             length = this.length;
 
-         // concerning the initial value, if one is not provided
 
-         if (arguments.length === 1) {
 
-             // seek to the first value in the array, accounting
 
-             // for the possibility that is is a sparse array
 
-             do {
 
-                 if (index in this) {
 
-                     basis = this[index++];
 
-                     break;
 
-                 }
 
-                 if (++index >= length) {
 
-                     throw new TypeError();
 
-                 }
 
-             } while (1);
 
-         }
 
-         // reduce
 
-         for (; index < length; index++) {
 
-             // account for the possibility that the array is sparse
 
-             if (index in this) {
 
-                 basis = callback(basis, this[index], index);
 
-             }
 
-         }
 
-         return basis;
 
-     }
 
- );
 
- var array_indexOf = uncurryThis(
 
-     Array.prototype.indexOf || function (value) {
 
-         // not a very good shim, but good enough for our one use of it
 
-         for (var i = 0; i < this.length; i++) {
 
-             if (this[i] === value) {
 
-                 return i;
 
-             }
 
-         }
 
-         return -1;
 
-     }
 
- );
 
- var array_map = uncurryThis(
 
-     Array.prototype.map || function (callback, thisp) {
 
-         var self = this;
 
-         var collect = [];
 
-         array_reduce(self, function (undefined, value, index) {
 
-             collect.push(callback.call(thisp, value, index, self));
 
-         }, void 0);
 
-         return collect;
 
-     }
 
- );
 
- var object_create = Object.create || function (prototype) {
 
-     function Type() { }
 
-     Type.prototype = prototype;
 
-     return new Type();
 
- };
 
- var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
 
-     obj[prop] = descriptor.value;
 
-     return obj;
 
- };
 
- var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
 
- var object_keys = Object.keys || function (object) {
 
-     var keys = [];
 
-     for (var key in object) {
 
-         if (object_hasOwnProperty(object, key)) {
 
-             keys.push(key);
 
-         }
 
-     }
 
-     return keys;
 
- };
 
- var object_toString = uncurryThis(Object.prototype.toString);
 
- function isObject(value) {
 
-     return value === Object(value);
 
- }
 
- // generator related shims
 
- // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
 
- function isStopIteration(exception) {
 
-     return (
 
-         object_toString(exception) === "[object StopIteration]" ||
 
-         exception instanceof QReturnValue
 
-     );
 
- }
 
- // FIXME: Remove this helper and Q.return once ES6 generators are in
 
- // SpiderMonkey.
 
- var QReturnValue;
 
- if (typeof ReturnValue !== "undefined") {
 
-     QReturnValue = ReturnValue;
 
- } else {
 
-     QReturnValue = function (value) {
 
-         this.value = value;
 
-     };
 
- }
 
- // long stack traces
 
- var STACK_JUMP_SEPARATOR = "From previous event:";
 
- function makeStackTraceLong(error, promise) {
 
-     // If possible, transform the error stack trace by removing Node and Q
 
-     // cruft, then concatenating with the stack trace of `promise`. See #57.
 
-     if (hasStacks &&
 
-         promise.stack &&
 
-         typeof error === "object" &&
 
-         error !== null &&
 
-         error.stack
 
-     ) {
 
-         var stacks = [];
 
-         for (var p = promise; !!p; p = p.source) {
 
-             if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
 
-                 object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
 
-                 stacks.unshift(p.stack);
 
-             }
 
-         }
 
-         stacks.unshift(error.stack);
 
-         var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
 
-         var stack = filterStackString(concatedStacks);
 
-         object_defineProperty(error, "stack", {value: stack, configurable: true});
 
-     }
 
- }
 
- function filterStackString(stackString) {
 
-     var lines = stackString.split("\n");
 
-     var desiredLines = [];
 
-     for (var i = 0; i < lines.length; ++i) {
 
-         var line = lines[i];
 
-         if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
 
-             desiredLines.push(line);
 
-         }
 
-     }
 
-     return desiredLines.join("\n");
 
- }
 
- function isNodeFrame(stackLine) {
 
-     return stackLine.indexOf("(module.js:") !== -1 ||
 
-            stackLine.indexOf("(node.js:") !== -1;
 
- }
 
- function getFileNameAndLineNumber(stackLine) {
 
-     // Named functions: "at functionName (filename:lineNumber:columnNumber)"
 
-     // In IE10 function name can have spaces ("Anonymous function") O_o
 
-     var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
 
-     if (attempt1) {
 
-         return [attempt1[1], Number(attempt1[2])];
 
-     }
 
-     // Anonymous functions: "at filename:lineNumber:columnNumber"
 
-     var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
 
-     if (attempt2) {
 
-         return [attempt2[1], Number(attempt2[2])];
 
-     }
 
-     // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
 
-     var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
 
-     if (attempt3) {
 
-         return [attempt3[1], Number(attempt3[2])];
 
-     }
 
- }
 
- function isInternalFrame(stackLine) {
 
-     var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
 
-     if (!fileNameAndLineNumber) {
 
-         return false;
 
-     }
 
-     var fileName = fileNameAndLineNumber[0];
 
-     var lineNumber = fileNameAndLineNumber[1];
 
-     return fileName === qFileName &&
 
-         lineNumber >= qStartingLine &&
 
-         lineNumber <= qEndingLine;
 
- }
 
- // discover own file name and line number range for filtering stack
 
- // traces
 
- function captureLine() {
 
-     if (!hasStacks) {
 
-         return;
 
-     }
 
-     try {
 
-         throw new Error();
 
-     } catch (e) {
 
-         var lines = e.stack.split("\n");
 
-         var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
 
-         var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
 
-         if (!fileNameAndLineNumber) {
 
-             return;
 
-         }
 
-         qFileName = fileNameAndLineNumber[0];
 
-         return fileNameAndLineNumber[1];
 
-     }
 
- }
 
- function deprecate(callback, name, alternative) {
 
-     return function () {
 
-         if (typeof console !== "undefined" &&
 
-             typeof console.warn === "function") {
 
-             console.warn(name + " is deprecated, use " + alternative +
 
-                          " instead.", new Error("").stack);
 
-         }
 
-         return callback.apply(callback, arguments);
 
-     };
 
- }
 
- // end of shims
 
- // beginning of real work
 
- /**
 
-  * Constructs a promise for an immediate reference, passes promises through, or
 
-  * coerces promises from different systems.
 
-  * @param value immediate reference or promise
 
-  */
 
- function Q(value) {
 
-     // If the object is already a Promise, return it directly.  This enables
 
-     // the resolve function to both be used to created references from objects,
 
-     // but to tolerably coerce non-promises to promises.
 
-     if (value instanceof Promise) {
 
-         return value;
 
-     }
 
-     // assimilate thenables
 
-     if (isPromiseAlike(value)) {
 
-         return coerce(value);
 
-     } else {
 
-         return fulfill(value);
 
-     }
 
- }
 
- Q.resolve = Q;
 
- /**
 
-  * Performs a task in a future turn of the event loop.
 
-  * @param {Function} task
 
-  */
 
- Q.nextTick = nextTick;
 
- /**
 
-  * Controls whether or not long stack traces will be on
 
-  */
 
- Q.longStackSupport = false;
 
- /**
 
-  * The counter is used to determine the stopping point for building
 
-  * long stack traces. In makeStackTraceLong we walk backwards through
 
-  * the linked list of promises, only stacks which were created before
 
-  * the rejection are concatenated.
 
-  */
 
- var longStackCounter = 1;
 
- // enable long stacks if Q_DEBUG is set
 
- if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
 
-     Q.longStackSupport = true;
 
- }
 
- /**
 
-  * Constructs a {promise, resolve, reject} object.
 
-  *
 
-  * `resolve` is a callback to invoke with a more resolved value for the
 
-  * promise. To fulfill the promise, invoke `resolve` with any value that is
 
-  * not a thenable. To reject the promise, invoke `resolve` with a rejected
 
-  * thenable, or invoke `reject` with the reason directly. To resolve the
 
-  * promise to another thenable, thus putting it in the same state, invoke
 
-  * `resolve` with that other thenable.
 
-  */
 
- Q.defer = defer;
 
- function defer() {
 
-     // if "messages" is an "Array", that indicates that the promise has not yet
 
-     // been resolved.  If it is "undefined", it has been resolved.  Each
 
-     // element of the messages array is itself an array of complete arguments to
 
-     // forward to the resolved promise.  We coerce the resolution value to a
 
-     // promise using the `resolve` function because it handles both fully
 
-     // non-thenable values and other thenables gracefully.
 
-     var messages = [], progressListeners = [], resolvedPromise;
 
-     var deferred = object_create(defer.prototype);
 
-     var promise = object_create(Promise.prototype);
 
-     promise.promiseDispatch = function (resolve, op, operands) {
 
-         var args = array_slice(arguments);
 
-         if (messages) {
 
-             messages.push(args);
 
-             if (op === "when" && operands[1]) { // progress operand
 
-                 progressListeners.push(operands[1]);
 
-             }
 
-         } else {
 
-             Q.nextTick(function () {
 
-                 resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
 
-             });
 
-         }
 
-     };
 
-     // XXX deprecated
 
-     promise.valueOf = function () {
 
-         if (messages) {
 
-             return promise;
 
-         }
 
-         var nearerValue = nearer(resolvedPromise);
 
-         if (isPromise(nearerValue)) {
 
-             resolvedPromise = nearerValue; // shorten chain
 
-         }
 
-         return nearerValue;
 
-     };
 
-     promise.inspect = function () {
 
-         if (!resolvedPromise) {
 
-             return { state: "pending" };
 
-         }
 
-         return resolvedPromise.inspect();
 
-     };
 
-     if (Q.longStackSupport && hasStacks) {
 
-         try {
 
-             throw new Error();
 
-         } catch (e) {
 
-             // NOTE: don't try to use `Error.captureStackTrace` or transfer the
 
-             // accessor around; that causes memory leaks as per GH-111. Just
 
-             // reify the stack trace as a string ASAP.
 
-             //
 
-             // At the same time, cut off the first line; it's always just
 
-             // "[object Promise]\n", as per the `toString`.
 
-             promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
 
-             promise.stackCounter = longStackCounter++;
 
-         }
 
-     }
 
-     // NOTE: we do the checks for `resolvedPromise` in each method, instead of
 
-     // consolidating them into `become`, since otherwise we'd create new
 
-     // promises with the lines `become(whatever(value))`. See e.g. GH-252.
 
-     function become(newPromise) {
 
-         resolvedPromise = newPromise;
 
-         if (Q.longStackSupport && hasStacks) {
 
-             // Only hold a reference to the new promise if long stacks
 
-             // are enabled to reduce memory usage
 
-             promise.source = newPromise;
 
-         }
 
-         array_reduce(messages, function (undefined, message) {
 
-             Q.nextTick(function () {
 
-                 newPromise.promiseDispatch.apply(newPromise, message);
 
-             });
 
-         }, void 0);
 
-         messages = void 0;
 
-         progressListeners = void 0;
 
-     }
 
-     deferred.promise = promise;
 
-     deferred.resolve = function (value) {
 
-         if (resolvedPromise) {
 
-             return;
 
-         }
 
-         become(Q(value));
 
-     };
 
-     deferred.fulfill = function (value) {
 
-         if (resolvedPromise) {
 
-             return;
 
-         }
 
-         become(fulfill(value));
 
-     };
 
-     deferred.reject = function (reason) {
 
-         if (resolvedPromise) {
 
-             return;
 
-         }
 
-         become(reject(reason));
 
-     };
 
-     deferred.notify = function (progress) {
 
-         if (resolvedPromise) {
 
-             return;
 
-         }
 
-         array_reduce(progressListeners, function (undefined, progressListener) {
 
-             Q.nextTick(function () {
 
-                 progressListener(progress);
 
-             });
 
-         }, void 0);
 
-     };
 
-     return deferred;
 
- }
 
- /**
 
-  * Creates a Node-style callback that will resolve or reject the deferred
 
-  * promise.
 
-  * @returns a nodeback
 
-  */
 
- defer.prototype.makeNodeResolver = function () {
 
-     var self = this;
 
-     return function (error, value) {
 
-         if (error) {
 
-             self.reject(error);
 
-         } else if (arguments.length > 2) {
 
-             self.resolve(array_slice(arguments, 1));
 
-         } else {
 
-             self.resolve(value);
 
-         }
 
-     };
 
- };
 
- /**
 
-  * @param resolver {Function} a function that returns nothing and accepts
 
-  * the resolve, reject, and notify functions for a deferred.
 
-  * @returns a promise that may be resolved with the given resolve and reject
 
-  * functions, or rejected by a thrown exception in resolver
 
-  */
 
- Q.Promise = promise; // ES6
 
- Q.promise = promise;
 
- function promise(resolver) {
 
-     if (typeof resolver !== "function") {
 
-         throw new TypeError("resolver must be a function.");
 
-     }
 
-     var deferred = defer();
 
-     try {
 
-         resolver(deferred.resolve, deferred.reject, deferred.notify);
 
-     } catch (reason) {
 
-         deferred.reject(reason);
 
-     }
 
-     return deferred.promise;
 
- }
 
- promise.race = race; // ES6
 
- promise.all = all; // ES6
 
- promise.reject = reject; // ES6
 
- promise.resolve = Q; // ES6
 
- // XXX experimental.  This method is a way to denote that a local value is
 
- // serializable and should be immediately dispatched to a remote upon request,
 
- // instead of passing a reference.
 
- Q.passByCopy = function (object) {
 
-     //freeze(object);
 
-     //passByCopies.set(object, true);
 
-     return object;
 
- };
 
- Promise.prototype.passByCopy = function () {
 
-     //freeze(object);
 
-     //passByCopies.set(object, true);
 
-     return this;
 
- };
 
- /**
 
-  * If two promises eventually fulfill to the same value, promises that value,
 
-  * but otherwise rejects.
 
-  * @param x {Any*}
 
-  * @param y {Any*}
 
-  * @returns {Any*} a promise for x and y if they are the same, but a rejection
 
-  * otherwise.
 
-  *
 
-  */
 
- Q.join = function (x, y) {
 
-     return Q(x).join(y);
 
- };
 
- Promise.prototype.join = function (that) {
 
-     return Q([this, that]).spread(function (x, y) {
 
-         if (x === y) {
 
-             // TODO: "===" should be Object.is or equiv
 
-             return x;
 
-         } else {
 
-             throw new Error("Q can't join: not the same: " + x + " " + y);
 
-         }
 
-     });
 
- };
 
- /**
 
-  * Returns a promise for the first of an array of promises to become settled.
 
-  * @param answers {Array[Any*]} promises to race
 
-  * @returns {Any*} the first promise to be settled
 
-  */
 
- Q.race = race;
 
- function race(answerPs) {
 
-     return promise(function (resolve, reject) {
 
-         // Switch to this once we can assume at least ES5
 
-         // answerPs.forEach(function (answerP) {
 
-         //     Q(answerP).then(resolve, reject);
 
-         // });
 
-         // Use this in the meantime
 
-         for (var i = 0, len = answerPs.length; i < len; i++) {
 
-             Q(answerPs[i]).then(resolve, reject);
 
-         }
 
-     });
 
- }
 
- Promise.prototype.race = function () {
 
-     return this.then(Q.race);
 
- };
 
- /**
 
-  * Constructs a Promise with a promise descriptor object and optional fallback
 
-  * function.  The descriptor contains methods like when(rejected), get(name),
 
-  * set(name, value), post(name, args), and delete(name), which all
 
-  * return either a value, a promise for a value, or a rejection.  The fallback
 
-  * accepts the operation name, a resolver, and any further arguments that would
 
-  * have been forwarded to the appropriate method above had a method been
 
-  * provided with the proper name.  The API makes no guarantees about the nature
 
-  * of the returned object, apart from that it is usable whereever promises are
 
-  * bought and sold.
 
-  */
 
- Q.makePromise = Promise;
 
- function Promise(descriptor, fallback, inspect) {
 
-     if (fallback === void 0) {
 
-         fallback = function (op) {
 
-             return reject(new Error(
 
-                 "Promise does not support operation: " + op
 
-             ));
 
-         };
 
-     }
 
-     if (inspect === void 0) {
 
-         inspect = function () {
 
-             return {state: "unknown"};
 
-         };
 
-     }
 
-     var promise = object_create(Promise.prototype);
 
-     promise.promiseDispatch = function (resolve, op, args) {
 
-         var result;
 
-         try {
 
-             if (descriptor[op]) {
 
-                 result = descriptor[op].apply(promise, args);
 
-             } else {
 
-                 result = fallback.call(promise, op, args);
 
-             }
 
-         } catch (exception) {
 
-             result = reject(exception);
 
-         }
 
-         if (resolve) {
 
-             resolve(result);
 
-         }
 
-     };
 
-     promise.inspect = inspect;
 
-     // XXX deprecated `valueOf` and `exception` support
 
-     if (inspect) {
 
-         var inspected = inspect();
 
-         if (inspected.state === "rejected") {
 
-             promise.exception = inspected.reason;
 
-         }
 
-         promise.valueOf = function () {
 
-             var inspected = inspect();
 
-             if (inspected.state === "pending" ||
 
-                 inspected.state === "rejected") {
 
-                 return promise;
 
-             }
 
-             return inspected.value;
 
-         };
 
-     }
 
-     return promise;
 
- }
 
- Promise.prototype.toString = function () {
 
-     return "[object Promise]";
 
- };
 
- Promise.prototype.then = function (fulfilled, rejected, progressed) {
 
-     var self = this;
 
-     var deferred = defer();
 
-     var done = false;   // ensure the untrusted promise makes at most a
 
-                         // single call to one of the callbacks
 
-     function _fulfilled(value) {
 
-         try {
 
-             return typeof fulfilled === "function" ? fulfilled(value) : value;
 
-         } catch (exception) {
 
-             return reject(exception);
 
-         }
 
-     }
 
-     function _rejected(exception) {
 
-         if (typeof rejected === "function") {
 
-             makeStackTraceLong(exception, self);
 
-             try {
 
-                 return rejected(exception);
 
-             } catch (newException) {
 
-                 return reject(newException);
 
-             }
 
-         }
 
-         return reject(exception);
 
-     }
 
-     function _progressed(value) {
 
-         return typeof progressed === "function" ? progressed(value) : value;
 
-     }
 
-     Q.nextTick(function () {
 
-         self.promiseDispatch(function (value) {
 
-             if (done) {
 
-                 return;
 
-             }
 
-             done = true;
 
-             deferred.resolve(_fulfilled(value));
 
-         }, "when", [function (exception) {
 
-             if (done) {
 
-                 return;
 
-             }
 
-             done = true;
 
-             deferred.resolve(_rejected(exception));
 
-         }]);
 
-     });
 
-     // Progress propagator need to be attached in the current tick.
 
-     self.promiseDispatch(void 0, "when", [void 0, function (value) {
 
-         var newValue;
 
-         var threw = false;
 
-         try {
 
-             newValue = _progressed(value);
 
-         } catch (e) {
 
-             threw = true;
 
-             if (Q.onerror) {
 
-                 Q.onerror(e);
 
-             } else {
 
-                 throw e;
 
-             }
 
-         }
 
-         if (!threw) {
 
-             deferred.notify(newValue);
 
-         }
 
-     }]);
 
-     return deferred.promise;
 
- };
 
- Q.tap = function (promise, callback) {
 
-     return Q(promise).tap(callback);
 
- };
 
- /**
 
-  * Works almost like "finally", but not called for rejections.
 
-  * Original resolution value is passed through callback unaffected.
 
-  * Callback may return a promise that will be awaited for.
 
-  * @param {Function} callback
 
-  * @returns {Q.Promise}
 
-  * @example
 
-  * doSomething()
 
-  *   .then(...)
 
-  *   .tap(console.log)
 
-  *   .then(...);
 
-  */
 
- Promise.prototype.tap = function (callback) {
 
-     callback = Q(callback);
 
-     return this.then(function (value) {
 
-         return callback.fcall(value).thenResolve(value);
 
-     });
 
- };
 
- /**
 
-  * Registers an observer on a promise.
 
-  *
 
-  * Guarantees:
 
-  *
 
-  * 1. that fulfilled and rejected will be called only once.
 
-  * 2. that either the fulfilled callback or the rejected callback will be
 
-  *    called, but not both.
 
-  * 3. that fulfilled and rejected will not be called in this turn.
 
-  *
 
-  * @param value      promise or immediate reference to observe
 
-  * @param fulfilled  function to be called with the fulfilled value
 
-  * @param rejected   function to be called with the rejection exception
 
-  * @param progressed function to be called on any progress notifications
 
-  * @return promise for the return value from the invoked callback
 
-  */
 
- Q.when = when;
 
- function when(value, fulfilled, rejected, progressed) {
 
-     return Q(value).then(fulfilled, rejected, progressed);
 
- }
 
- Promise.prototype.thenResolve = function (value) {
 
-     return this.then(function () { return value; });
 
- };
 
- Q.thenResolve = function (promise, value) {
 
-     return Q(promise).thenResolve(value);
 
- };
 
- Promise.prototype.thenReject = function (reason) {
 
-     return this.then(function () { throw reason; });
 
- };
 
- Q.thenReject = function (promise, reason) {
 
-     return Q(promise).thenReject(reason);
 
- };
 
- /**
 
-  * If an object is not a promise, it is as "near" as possible.
 
-  * If a promise is rejected, it is as "near" as possible too.
 
-  * If it’s a fulfilled promise, the fulfillment value is nearer.
 
-  * If it’s a deferred promise and the deferred has been resolved, the
 
-  * resolution is "nearer".
 
-  * @param object
 
-  * @returns most resolved (nearest) form of the object
 
-  */
 
- // XXX should we re-do this?
 
- Q.nearer = nearer;
 
- function nearer(value) {
 
-     if (isPromise(value)) {
 
-         var inspected = value.inspect();
 
-         if (inspected.state === "fulfilled") {
 
-             return inspected.value;
 
-         }
 
-     }
 
-     return value;
 
- }
 
- /**
 
-  * @returns whether the given object is a promise.
 
-  * Otherwise it is a fulfilled value.
 
-  */
 
- Q.isPromise = isPromise;
 
- function isPromise(object) {
 
-     return object instanceof Promise;
 
- }
 
- Q.isPromiseAlike = isPromiseAlike;
 
- function isPromiseAlike(object) {
 
-     return isObject(object) && typeof object.then === "function";
 
- }
 
- /**
 
-  * @returns whether the given object is a pending promise, meaning not
 
-  * fulfilled or rejected.
 
-  */
 
- Q.isPending = isPending;
 
- function isPending(object) {
 
-     return isPromise(object) && object.inspect().state === "pending";
 
- }
 
- Promise.prototype.isPending = function () {
 
-     return this.inspect().state === "pending";
 
- };
 
- /**
 
-  * @returns whether the given object is a value or fulfilled
 
-  * promise.
 
-  */
 
- Q.isFulfilled = isFulfilled;
 
- function isFulfilled(object) {
 
-     return !isPromise(object) || object.inspect().state === "fulfilled";
 
- }
 
- Promise.prototype.isFulfilled = function () {
 
-     return this.inspect().state === "fulfilled";
 
- };
 
- /**
 
-  * @returns whether the given object is a rejected promise.
 
-  */
 
- Q.isRejected = isRejected;
 
- function isRejected(object) {
 
-     return isPromise(object) && object.inspect().state === "rejected";
 
- }
 
- Promise.prototype.isRejected = function () {
 
-     return this.inspect().state === "rejected";
 
- };
 
- //// BEGIN UNHANDLED REJECTION TRACKING
 
- // This promise library consumes exceptions thrown in handlers so they can be
 
- // handled by a subsequent promise.  The exceptions get added to this array when
 
- // they are created, and removed when they are handled.  Note that in ES6 or
 
- // shimmed environments, this would naturally be a `Set`.
 
- var unhandledReasons = [];
 
- var unhandledRejections = [];
 
- var reportedUnhandledRejections = [];
 
- var trackUnhandledRejections = true;
 
- function resetUnhandledRejections() {
 
-     unhandledReasons.length = 0;
 
-     unhandledRejections.length = 0;
 
-     if (!trackUnhandledRejections) {
 
-         trackUnhandledRejections = true;
 
-     }
 
- }
 
- function trackRejection(promise, reason) {
 
-     if (!trackUnhandledRejections) {
 
-         return;
 
-     }
 
-     if (typeof process === "object" && typeof process.emit === "function") {
 
-         Q.nextTick.runAfter(function () {
 
-             if (array_indexOf(unhandledRejections, promise) !== -1) {
 
-                 process.emit("unhandledRejection", reason, promise);
 
-                 reportedUnhandledRejections.push(promise);
 
-             }
 
-         });
 
-     }
 
-     unhandledRejections.push(promise);
 
-     if (reason && typeof reason.stack !== "undefined") {
 
-         unhandledReasons.push(reason.stack);
 
-     } else {
 
-         unhandledReasons.push("(no stack) " + reason);
 
-     }
 
- }
 
- function untrackRejection(promise) {
 
-     if (!trackUnhandledRejections) {
 
-         return;
 
-     }
 
-     var at = array_indexOf(unhandledRejections, promise);
 
-     if (at !== -1) {
 
-         if (typeof process === "object" && typeof process.emit === "function") {
 
-             Q.nextTick.runAfter(function () {
 
-                 var atReport = array_indexOf(reportedUnhandledRejections, promise);
 
-                 if (atReport !== -1) {
 
-                     process.emit("rejectionHandled", unhandledReasons[at], promise);
 
-                     reportedUnhandledRejections.splice(atReport, 1);
 
-                 }
 
-             });
 
-         }
 
-         unhandledRejections.splice(at, 1);
 
-         unhandledReasons.splice(at, 1);
 
-     }
 
- }
 
- Q.resetUnhandledRejections = resetUnhandledRejections;
 
- Q.getUnhandledReasons = function () {
 
-     // Make a copy so that consumers can't interfere with our internal state.
 
-     return unhandledReasons.slice();
 
- };
 
- Q.stopUnhandledRejectionTracking = function () {
 
-     resetUnhandledRejections();
 
-     trackUnhandledRejections = false;
 
- };
 
- resetUnhandledRejections();
 
- //// END UNHANDLED REJECTION TRACKING
 
- /**
 
-  * Constructs a rejected promise.
 
-  * @param reason value describing the failure
 
-  */
 
- Q.reject = reject;
 
- function reject(reason) {
 
-     var rejection = Promise({
 
-         "when": function (rejected) {
 
-             // note that the error has been handled
 
-             if (rejected) {
 
-                 untrackRejection(this);
 
-             }
 
-             return rejected ? rejected(reason) : this;
 
-         }
 
-     }, function fallback() {
 
-         return this;
 
-     }, function inspect() {
 
-         return { state: "rejected", reason: reason };
 
-     });
 
-     // Note that the reason has not been handled.
 
-     trackRejection(rejection, reason);
 
-     return rejection;
 
- }
 
- /**
 
-  * Constructs a fulfilled promise for an immediate reference.
 
-  * @param value immediate reference
 
-  */
 
- Q.fulfill = fulfill;
 
- function fulfill(value) {
 
-     return Promise({
 
-         "when": function () {
 
-             return value;
 
-         },
 
-         "get": function (name) {
 
-             return value[name];
 
-         },
 
-         "set": function (name, rhs) {
 
-             value[name] = rhs;
 
-         },
 
-         "delete": function (name) {
 
-             delete value[name];
 
-         },
 
-         "post": function (name, args) {
 
-             // Mark Miller proposes that post with no name should apply a
 
-             // promised function.
 
-             if (name === null || name === void 0) {
 
-                 return value.apply(void 0, args);
 
-             } else {
 
-                 return value[name].apply(value, args);
 
-             }
 
-         },
 
-         "apply": function (thisp, args) {
 
-             return value.apply(thisp, args);
 
-         },
 
-         "keys": function () {
 
-             return object_keys(value);
 
-         }
 
-     }, void 0, function inspect() {
 
-         return { state: "fulfilled", value: value };
 
-     });
 
- }
 
- /**
 
-  * Converts thenables to Q promises.
 
-  * @param promise thenable promise
 
-  * @returns a Q promise
 
-  */
 
- function coerce(promise) {
 
-     var deferred = defer();
 
-     Q.nextTick(function () {
 
-         try {
 
-             promise.then(deferred.resolve, deferred.reject, deferred.notify);
 
-         } catch (exception) {
 
-             deferred.reject(exception);
 
-         }
 
-     });
 
-     return deferred.promise;
 
- }
 
- /**
 
-  * Annotates an object such that it will never be
 
-  * transferred away from this process over any promise
 
-  * communication channel.
 
-  * @param object
 
-  * @returns promise a wrapping of that object that
 
-  * additionally responds to the "isDef" message
 
-  * without a rejection.
 
-  */
 
- Q.master = master;
 
- function master(object) {
 
-     return Promise({
 
-         "isDef": function () {}
 
-     }, function fallback(op, args) {
 
-         return dispatch(object, op, args);
 
-     }, function () {
 
-         return Q(object).inspect();
 
-     });
 
- }
 
- /**
 
-  * Spreads the values of a promised array of arguments into the
 
-  * fulfillment callback.
 
-  * @param fulfilled callback that receives variadic arguments from the
 
-  * promised array
 
-  * @param rejected callback that receives the exception if the promise
 
-  * is rejected.
 
-  * @returns a promise for the return value or thrown exception of
 
-  * either callback.
 
-  */
 
- Q.spread = spread;
 
- function spread(value, fulfilled, rejected) {
 
-     return Q(value).spread(fulfilled, rejected);
 
- }
 
- Promise.prototype.spread = function (fulfilled, rejected) {
 
-     return this.all().then(function (array) {
 
-         return fulfilled.apply(void 0, array);
 
-     }, rejected);
 
- };
 
- /**
 
-  * The async function is a decorator for generator functions, turning
 
-  * them into asynchronous generators.  Although generators are only part
 
-  * of the newest ECMAScript 6 drafts, this code does not cause syntax
 
-  * errors in older engines.  This code should continue to work and will
 
-  * in fact improve over time as the language improves.
 
-  *
 
-  * ES6 generators are currently part of V8 version 3.19 with the
 
-  * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
 
-  * for longer, but under an older Python-inspired form.  This function
 
-  * works on both kinds of generators.
 
-  *
 
-  * Decorates a generator function such that:
 
-  *  - it may yield promises
 
-  *  - execution will continue when that promise is fulfilled
 
-  *  - the value of the yield expression will be the fulfilled value
 
-  *  - it returns a promise for the return value (when the generator
 
-  *    stops iterating)
 
-  *  - the decorated function returns a promise for the return value
 
-  *    of the generator or the first rejected promise among those
 
-  *    yielded.
 
-  *  - if an error is thrown in the generator, it propagates through
 
-  *    every following yield until it is caught, or until it escapes
 
-  *    the generator function altogether, and is translated into a
 
-  *    rejection for the promise returned by the decorated generator.
 
-  */
 
- Q.async = async;
 
- function async(makeGenerator) {
 
-     return function () {
 
-         // when verb is "send", arg is a value
 
-         // when verb is "throw", arg is an exception
 
-         function continuer(verb, arg) {
 
-             var result;
 
-             // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
 
-             // engine that has a deployed base of browsers that support generators.
 
-             // However, SM's generators use the Python-inspired semantics of
 
-             // outdated ES6 drafts.  We would like to support ES6, but we'd also
 
-             // like to make it possible to use generators in deployed browsers, so
 
-             // we also support Python-style generators.  At some point we can remove
 
-             // this block.
 
-             if (typeof StopIteration === "undefined") {
 
-                 // ES6 Generators
 
-                 try {
 
-                     result = generator[verb](arg);
 
-                 } catch (exception) {
 
-                     return reject(exception);
 
-                 }
 
-                 if (result.done) {
 
-                     return Q(result.value);
 
-                 } else {
 
-                     return when(result.value, callback, errback);
 
-                 }
 
-             } else {
 
-                 // SpiderMonkey Generators
 
-                 // FIXME: Remove this case when SM does ES6 generators.
 
-                 try {
 
-                     result = generator[verb](arg);
 
-                 } catch (exception) {
 
-                     if (isStopIteration(exception)) {
 
-                         return Q(exception.value);
 
-                     } else {
 
-                         return reject(exception);
 
-                     }
 
-                 }
 
-                 return when(result, callback, errback);
 
-             }
 
-         }
 
-         var generator = makeGenerator.apply(this, arguments);
 
-         var callback = continuer.bind(continuer, "next");
 
-         var errback = continuer.bind(continuer, "throw");
 
-         return callback();
 
-     };
 
- }
 
- /**
 
-  * The spawn function is a small wrapper around async that immediately
 
-  * calls the generator and also ends the promise chain, so that any
 
-  * unhandled errors are thrown instead of forwarded to the error
 
-  * handler. This is useful because it's extremely common to run
 
-  * generators at the top-level to work with libraries.
 
-  */
 
- Q.spawn = spawn;
 
- function spawn(makeGenerator) {
 
-     Q.done(Q.async(makeGenerator)());
 
- }
 
- // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
 
- /**
 
-  * Throws a ReturnValue exception to stop an asynchronous generator.
 
-  *
 
-  * This interface is a stop-gap measure to support generator return
 
-  * values in older Firefox/SpiderMonkey.  In browsers that support ES6
 
-  * generators like Chromium 29, just use "return" in your generator
 
-  * functions.
 
-  *
 
-  * @param value the return value for the surrounding generator
 
-  * @throws ReturnValue exception with the value.
 
-  * @example
 
-  * // ES6 style
 
-  * Q.async(function* () {
 
-  *      var foo = yield getFooPromise();
 
-  *      var bar = yield getBarPromise();
 
-  *      return foo + bar;
 
-  * })
 
-  * // Older SpiderMonkey style
 
-  * Q.async(function () {
 
-  *      var foo = yield getFooPromise();
 
-  *      var bar = yield getBarPromise();
 
-  *      Q.return(foo + bar);
 
-  * })
 
-  */
 
- Q["return"] = _return;
 
- function _return(value) {
 
-     throw new QReturnValue(value);
 
- }
 
- /**
 
-  * The promised function decorator ensures that any promise arguments
 
-  * are settled and passed as values (`this` is also settled and passed
 
-  * as a value).  It will also ensure that the result of a function is
 
-  * always a promise.
 
-  *
 
-  * @example
 
-  * var add = Q.promised(function (a, b) {
 
-  *     return a + b;
 
-  * });
 
-  * add(Q(a), Q(B));
 
-  *
 
-  * @param {function} callback The function to decorate
 
-  * @returns {function} a function that has been decorated.
 
-  */
 
- Q.promised = promised;
 
- function promised(callback) {
 
-     return function () {
 
-         return spread([this, all(arguments)], function (self, args) {
 
-             return callback.apply(self, args);
 
-         });
 
-     };
 
- }
 
- /**
 
-  * sends a message to a value in a future turn
 
-  * @param object* the recipient
 
-  * @param op the name of the message operation, e.g., "when",
 
-  * @param args further arguments to be forwarded to the operation
 
-  * @returns result {Promise} a promise for the result of the operation
 
-  */
 
- Q.dispatch = dispatch;
 
- function dispatch(object, op, args) {
 
-     return Q(object).dispatch(op, args);
 
- }
 
- Promise.prototype.dispatch = function (op, args) {
 
-     var self = this;
 
-     var deferred = defer();
 
-     Q.nextTick(function () {
 
-         self.promiseDispatch(deferred.resolve, op, args);
 
-     });
 
-     return deferred.promise;
 
- };
 
- /**
 
-  * Gets the value of a property in a future turn.
 
-  * @param object    promise or immediate reference for target object
 
-  * @param name      name of property to get
 
-  * @return promise for the property value
 
-  */
 
- Q.get = function (object, key) {
 
-     return Q(object).dispatch("get", [key]);
 
- };
 
- Promise.prototype.get = function (key) {
 
-     return this.dispatch("get", [key]);
 
- };
 
- /**
 
-  * Sets the value of a property in a future turn.
 
-  * @param object    promise or immediate reference for object object
 
-  * @param name      name of property to set
 
-  * @param value     new value of property
 
-  * @return promise for the return value
 
-  */
 
- Q.set = function (object, key, value) {
 
-     return Q(object).dispatch("set", [key, value]);
 
- };
 
- Promise.prototype.set = function (key, value) {
 
-     return this.dispatch("set", [key, value]);
 
- };
 
- /**
 
-  * Deletes a property in a future turn.
 
-  * @param object    promise or immediate reference for target object
 
-  * @param name      name of property to delete
 
-  * @return promise for the return value
 
-  */
 
- Q.del = // XXX legacy
 
- Q["delete"] = function (object, key) {
 
-     return Q(object).dispatch("delete", [key]);
 
- };
 
- Promise.prototype.del = // XXX legacy
 
- Promise.prototype["delete"] = function (key) {
 
-     return this.dispatch("delete", [key]);
 
- };
 
- /**
 
-  * Invokes a method in a future turn.
 
-  * @param object    promise or immediate reference for target object
 
-  * @param name      name of method to invoke
 
-  * @param value     a value to post, typically an array of
 
-  *                  invocation arguments for promises that
 
-  *                  are ultimately backed with `resolve` values,
 
-  *                  as opposed to those backed with URLs
 
-  *                  wherein the posted value can be any
 
-  *                  JSON serializable object.
 
-  * @return promise for the return value
 
-  */
 
- // bound locally because it is used by other methods
 
- Q.mapply = // XXX As proposed by "Redsandro"
 
- Q.post = function (object, name, args) {
 
-     return Q(object).dispatch("post", [name, args]);
 
- };
 
- Promise.prototype.mapply = // XXX As proposed by "Redsandro"
 
- Promise.prototype.post = function (name, args) {
 
-     return this.dispatch("post", [name, args]);
 
- };
 
- /**
 
-  * Invokes a method in a future turn.
 
-  * @param object    promise or immediate reference for target object
 
-  * @param name      name of method to invoke
 
-  * @param ...args   array of invocation arguments
 
-  * @return promise for the return value
 
-  */
 
- Q.send = // XXX Mark Miller's proposed parlance
 
- Q.mcall = // XXX As proposed by "Redsandro"
 
- Q.invoke = function (object, name /*...args*/) {
 
-     return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
 
- };
 
- Promise.prototype.send = // XXX Mark Miller's proposed parlance
 
- Promise.prototype.mcall = // XXX As proposed by "Redsandro"
 
- Promise.prototype.invoke = function (name /*...args*/) {
 
-     return this.dispatch("post", [name, array_slice(arguments, 1)]);
 
- };
 
- /**
 
-  * Applies the promised function in a future turn.
 
-  * @param object    promise or immediate reference for target function
 
-  * @param args      array of application arguments
 
-  */
 
- Q.fapply = function (object, args) {
 
-     return Q(object).dispatch("apply", [void 0, args]);
 
- };
 
- Promise.prototype.fapply = function (args) {
 
-     return this.dispatch("apply", [void 0, args]);
 
- };
 
- /**
 
-  * Calls the promised function in a future turn.
 
-  * @param object    promise or immediate reference for target function
 
-  * @param ...args   array of application arguments
 
-  */
 
- Q["try"] =
 
- Q.fcall = function (object /* ...args*/) {
 
-     return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
 
- };
 
- Promise.prototype.fcall = function (/*...args*/) {
 
-     return this.dispatch("apply", [void 0, array_slice(arguments)]);
 
- };
 
- /**
 
-  * Binds the promised function, transforming return values into a fulfilled
 
-  * promise and thrown errors into a rejected one.
 
-  * @param object    promise or immediate reference for target function
 
-  * @param ...args   array of application arguments
 
-  */
 
- Q.fbind = function (object /*...args*/) {
 
-     var promise = Q(object);
 
-     var args = array_slice(arguments, 1);
 
-     return function fbound() {
 
-         return promise.dispatch("apply", [
 
-             this,
 
-             args.concat(array_slice(arguments))
 
-         ]);
 
-     };
 
- };
 
- Promise.prototype.fbind = function (/*...args*/) {
 
-     var promise = this;
 
-     var args = array_slice(arguments);
 
-     return function fbound() {
 
-         return promise.dispatch("apply", [
 
-             this,
 
-             args.concat(array_slice(arguments))
 
-         ]);
 
-     };
 
- };
 
- /**
 
-  * Requests the names of the owned properties of a promised
 
-  * object in a future turn.
 
-  * @param object    promise or immediate reference for target object
 
-  * @return promise for the keys of the eventually settled object
 
-  */
 
- Q.keys = function (object) {
 
-     return Q(object).dispatch("keys", []);
 
- };
 
- Promise.prototype.keys = function () {
 
-     return this.dispatch("keys", []);
 
- };
 
- /**
 
-  * Turns an array of promises into a promise for an array.  If any of
 
-  * the promises gets rejected, the whole array is rejected immediately.
 
-  * @param {Array*} an array (or promise for an array) of values (or
 
-  * promises for values)
 
-  * @returns a promise for an array of the corresponding values
 
-  */
 
- // By Mark Miller
 
- // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
 
- Q.all = all;
 
- function all(promises) {
 
-     return when(promises, function (promises) {
 
-         var pendingCount = 0;
 
-         var deferred = defer();
 
-         array_reduce(promises, function (undefined, promise, index) {
 
-             var snapshot;
 
-             if (
 
-                 isPromise(promise) &&
 
-                 (snapshot = promise.inspect()).state === "fulfilled"
 
-             ) {
 
-                 promises[index] = snapshot.value;
 
-             } else {
 
-                 ++pendingCount;
 
-                 when(
 
-                     promise,
 
-                     function (value) {
 
-                         promises[index] = value;
 
-                         if (--pendingCount === 0) {
 
-                             deferred.resolve(promises);
 
-                         }
 
-                     },
 
-                     deferred.reject,
 
-                     function (progress) {
 
-                         deferred.notify({ index: index, value: progress });
 
-                     }
 
-                 );
 
-             }
 
-         }, void 0);
 
-         if (pendingCount === 0) {
 
-             deferred.resolve(promises);
 
-         }
 
-         return deferred.promise;
 
-     });
 
- }
 
- Promise.prototype.all = function () {
 
-     return all(this);
 
- };
 
- /**
 
-  * Returns the first resolved promise of an array. Prior rejected promises are
 
-  * ignored.  Rejects only if all promises are rejected.
 
-  * @param {Array*} an array containing values or promises for values
 
-  * @returns a promise fulfilled with the value of the first resolved promise,
 
-  * or a rejected promise if all promises are rejected.
 
-  */
 
- Q.any = any;
 
- function any(promises) {
 
-     if (promises.length === 0) {
 
-         return Q.resolve();
 
-     }
 
-     var deferred = Q.defer();
 
-     var pendingCount = 0;
 
-     array_reduce(promises, function (prev, current, index) {
 
-         var promise = promises[index];
 
-         pendingCount++;
 
-         when(promise, onFulfilled, onRejected, onProgress);
 
-         function onFulfilled(result) {
 
-             deferred.resolve(result);
 
-         }
 
-         function onRejected(err) {
 
-             pendingCount--;
 
-             if (pendingCount === 0) {
 
-                 err.message = ("Q can't get fulfillment value from any promise, all " +
 
-                     "promises were rejected. Last error message: " + err.message);
 
-                 deferred.reject(err);
 
-             }
 
-         }
 
-         function onProgress(progress) {
 
-             deferred.notify({
 
-                 index: index,
 
-                 value: progress
 
-             });
 
-         }
 
-     }, undefined);
 
-     return deferred.promise;
 
- }
 
- Promise.prototype.any = function () {
 
-     return any(this);
 
- };
 
- /**
 
-  * Waits for all promises to be settled, either fulfilled or
 
-  * rejected.  This is distinct from `all` since that would stop
 
-  * waiting at the first rejection.  The promise returned by
 
-  * `allResolved` will never be rejected.
 
-  * @param promises a promise for an array (or an array) of promises
 
-  * (or values)
 
-  * @return a promise for an array of promises
 
-  */
 
- Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
 
- function allResolved(promises) {
 
-     return when(promises, function (promises) {
 
-         promises = array_map(promises, Q);
 
-         return when(all(array_map(promises, function (promise) {
 
-             return when(promise, noop, noop);
 
-         })), function () {
 
-             return promises;
 
-         });
 
-     });
 
- }
 
- Promise.prototype.allResolved = function () {
 
-     return allResolved(this);
 
- };
 
- /**
 
-  * @see Promise#allSettled
 
-  */
 
- Q.allSettled = allSettled;
 
- function allSettled(promises) {
 
-     return Q(promises).allSettled();
 
- }
 
- /**
 
-  * Turns an array of promises into a promise for an array of their states (as
 
-  * returned by `inspect`) when they have all settled.
 
-  * @param {Array[Any*]} values an array (or promise for an array) of values (or
 
-  * promises for values)
 
-  * @returns {Array[State]} an array of states for the respective values.
 
-  */
 
- Promise.prototype.allSettled = function () {
 
-     return this.then(function (promises) {
 
-         return all(array_map(promises, function (promise) {
 
-             promise = Q(promise);
 
-             function regardless() {
 
-                 return promise.inspect();
 
-             }
 
-             return promise.then(regardless, regardless);
 
-         }));
 
-     });
 
- };
 
- /**
 
-  * Captures the failure of a promise, giving an oportunity to recover
 
-  * with a callback.  If the given promise is fulfilled, the returned
 
-  * promise is fulfilled.
 
-  * @param {Any*} promise for something
 
-  * @param {Function} callback to fulfill the returned promise if the
 
-  * given promise is rejected
 
-  * @returns a promise for the return value of the callback
 
-  */
 
- Q.fail = // XXX legacy
 
- Q["catch"] = function (object, rejected) {
 
-     return Q(object).then(void 0, rejected);
 
- };
 
- Promise.prototype.fail = // XXX legacy
 
- Promise.prototype["catch"] = function (rejected) {
 
-     return this.then(void 0, rejected);
 
- };
 
- /**
 
-  * Attaches a listener that can respond to progress notifications from a
 
-  * promise's originating deferred. This listener receives the exact arguments
 
-  * passed to ``deferred.notify``.
 
-  * @param {Any*} promise for something
 
-  * @param {Function} callback to receive any progress notifications
 
-  * @returns the given promise, unchanged
 
-  */
 
- Q.progress = progress;
 
- function progress(object, progressed) {
 
-     return Q(object).then(void 0, void 0, progressed);
 
- }
 
- Promise.prototype.progress = function (progressed) {
 
-     return this.then(void 0, void 0, progressed);
 
- };
 
- /**
 
-  * Provides an opportunity to observe the settling of a promise,
 
-  * regardless of whether the promise is fulfilled or rejected.  Forwards
 
-  * the resolution to the returned promise when the callback is done.
 
-  * The callback can return a promise to defer completion.
 
-  * @param {Any*} promise
 
-  * @param {Function} callback to observe the resolution of the given
 
-  * promise, takes no arguments.
 
-  * @returns a promise for the resolution of the given promise when
 
-  * ``fin`` is done.
 
-  */
 
- Q.fin = // XXX legacy
 
- Q["finally"] = function (object, callback) {
 
-     return Q(object)["finally"](callback);
 
- };
 
- Promise.prototype.fin = // XXX legacy
 
- Promise.prototype["finally"] = function (callback) {
 
-     if (!callback || typeof callback.apply !== "function") {
 
-         throw new Error("Q can't apply finally callback");
 
-     }
 
-     callback = Q(callback);
 
-     return this.then(function (value) {
 
-         return callback.fcall().then(function () {
 
-             return value;
 
-         });
 
-     }, function (reason) {
 
-         // TODO attempt to recycle the rejection with "this".
 
-         return callback.fcall().then(function () {
 
-             throw reason;
 
-         });
 
-     });
 
- };
 
- /**
 
-  * Terminates a chain of promises, forcing rejections to be
 
-  * thrown as exceptions.
 
-  * @param {Any*} promise at the end of a chain of promises
 
-  * @returns nothing
 
-  */
 
- Q.done = function (object, fulfilled, rejected, progress) {
 
-     return Q(object).done(fulfilled, rejected, progress);
 
- };
 
- Promise.prototype.done = function (fulfilled, rejected, progress) {
 
-     var onUnhandledError = function (error) {
 
-         // forward to a future turn so that ``when``
 
-         // does not catch it and turn it into a rejection.
 
-         Q.nextTick(function () {
 
-             makeStackTraceLong(error, promise);
 
-             if (Q.onerror) {
 
-                 Q.onerror(error);
 
-             } else {
 
-                 throw error;
 
-             }
 
-         });
 
-     };
 
-     // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
 
-     var promise = fulfilled || rejected || progress ?
 
-         this.then(fulfilled, rejected, progress) :
 
-         this;
 
-     if (typeof process === "object" && process && process.domain) {
 
-         onUnhandledError = process.domain.bind(onUnhandledError);
 
-     }
 
-     promise.then(void 0, onUnhandledError);
 
- };
 
- /**
 
-  * Causes a promise to be rejected if it does not get fulfilled before
 
-  * some milliseconds time out.
 
-  * @param {Any*} promise
 
-  * @param {Number} milliseconds timeout
 
-  * @param {Any*} custom error message or Error object (optional)
 
-  * @returns a promise for the resolution of the given promise if it is
 
-  * fulfilled before the timeout, otherwise rejected.
 
-  */
 
- Q.timeout = function (object, ms, error) {
 
-     return Q(object).timeout(ms, error);
 
- };
 
- Promise.prototype.timeout = function (ms, error) {
 
-     var deferred = defer();
 
-     var timeoutId = setTimeout(function () {
 
-         if (!error || "string" === typeof error) {
 
-             error = new Error(error || "Timed out after " + ms + " ms");
 
-             error.code = "ETIMEDOUT";
 
-         }
 
-         deferred.reject(error);
 
-     }, ms);
 
-     this.then(function (value) {
 
-         clearTimeout(timeoutId);
 
-         deferred.resolve(value);
 
-     }, function (exception) {
 
-         clearTimeout(timeoutId);
 
-         deferred.reject(exception);
 
-     }, deferred.notify);
 
-     return deferred.promise;
 
- };
 
- /**
 
-  * Returns a promise for the given value (or promised value), some
 
-  * milliseconds after it resolved. Passes rejections immediately.
 
-  * @param {Any*} promise
 
-  * @param {Number} milliseconds
 
-  * @returns a promise for the resolution of the given promise after milliseconds
 
-  * time has elapsed since the resolution of the given promise.
 
-  * If the given promise rejects, that is passed immediately.
 
-  */
 
- Q.delay = function (object, timeout) {
 
-     if (timeout === void 0) {
 
-         timeout = object;
 
-         object = void 0;
 
-     }
 
-     return Q(object).delay(timeout);
 
- };
 
- Promise.prototype.delay = function (timeout) {
 
-     return this.then(function (value) {
 
-         var deferred = defer();
 
-         setTimeout(function () {
 
-             deferred.resolve(value);
 
-         }, timeout);
 
-         return deferred.promise;
 
-     });
 
- };
 
- /**
 
-  * Passes a continuation to a Node function, which is called with the given
 
-  * arguments provided as an array, and returns a promise.
 
-  *
 
-  *      Q.nfapply(FS.readFile, [__filename])
 
-  *      .then(function (content) {
 
-  *      })
 
-  *
 
-  */
 
- Q.nfapply = function (callback, args) {
 
-     return Q(callback).nfapply(args);
 
- };
 
- Promise.prototype.nfapply = function (args) {
 
-     var deferred = defer();
 
-     var nodeArgs = array_slice(args);
 
-     nodeArgs.push(deferred.makeNodeResolver());
 
-     this.fapply(nodeArgs).fail(deferred.reject);
 
-     return deferred.promise;
 
- };
 
- /**
 
-  * Passes a continuation to a Node function, which is called with the given
 
-  * arguments provided individually, and returns a promise.
 
-  * @example
 
-  * Q.nfcall(FS.readFile, __filename)
 
-  * .then(function (content) {
 
-  * })
 
-  *
 
-  */
 
- Q.nfcall = function (callback /*...args*/) {
 
-     var args = array_slice(arguments, 1);
 
-     return Q(callback).nfapply(args);
 
- };
 
- Promise.prototype.nfcall = function (/*...args*/) {
 
-     var nodeArgs = array_slice(arguments);
 
-     var deferred = defer();
 
-     nodeArgs.push(deferred.makeNodeResolver());
 
-     this.fapply(nodeArgs).fail(deferred.reject);
 
-     return deferred.promise;
 
- };
 
- /**
 
-  * Wraps a NodeJS continuation passing function and returns an equivalent
 
-  * version that returns a promise.
 
-  * @example
 
-  * Q.nfbind(FS.readFile, __filename)("utf-8")
 
-  * .then(console.log)
 
-  * .done()
 
-  */
 
- Q.nfbind =
 
- Q.denodeify = function (callback /*...args*/) {
 
-     if (callback === undefined) {
 
-         throw new Error("Q can't wrap an undefined function");
 
-     }
 
-     var baseArgs = array_slice(arguments, 1);
 
-     return function () {
 
-         var nodeArgs = baseArgs.concat(array_slice(arguments));
 
-         var deferred = defer();
 
-         nodeArgs.push(deferred.makeNodeResolver());
 
-         Q(callback).fapply(nodeArgs).fail(deferred.reject);
 
-         return deferred.promise;
 
-     };
 
- };
 
- Promise.prototype.nfbind =
 
- Promise.prototype.denodeify = function (/*...args*/) {
 
-     var args = array_slice(arguments);
 
-     args.unshift(this);
 
-     return Q.denodeify.apply(void 0, args);
 
- };
 
- Q.nbind = function (callback, thisp /*...args*/) {
 
-     var baseArgs = array_slice(arguments, 2);
 
-     return function () {
 
-         var nodeArgs = baseArgs.concat(array_slice(arguments));
 
-         var deferred = defer();
 
-         nodeArgs.push(deferred.makeNodeResolver());
 
-         function bound() {
 
-             return callback.apply(thisp, arguments);
 
-         }
 
-         Q(bound).fapply(nodeArgs).fail(deferred.reject);
 
-         return deferred.promise;
 
-     };
 
- };
 
- Promise.prototype.nbind = function (/*thisp, ...args*/) {
 
-     var args = array_slice(arguments, 0);
 
-     args.unshift(this);
 
-     return Q.nbind.apply(void 0, args);
 
- };
 
- /**
 
-  * Calls a method of a Node-style object that accepts a Node-style
 
-  * callback with a given array of arguments, plus a provided callback.
 
-  * @param object an object that has the named method
 
-  * @param {String} name name of the method of object
 
-  * @param {Array} args arguments to pass to the method; the callback
 
-  * will be provided by Q and appended to these arguments.
 
-  * @returns a promise for the value or error
 
-  */
 
- Q.nmapply = // XXX As proposed by "Redsandro"
 
- Q.npost = function (object, name, args) {
 
-     return Q(object).npost(name, args);
 
- };
 
- Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
 
- Promise.prototype.npost = function (name, args) {
 
-     var nodeArgs = array_slice(args || []);
 
-     var deferred = defer();
 
-     nodeArgs.push(deferred.makeNodeResolver());
 
-     this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
 
-     return deferred.promise;
 
- };
 
- /**
 
-  * Calls a method of a Node-style object that accepts a Node-style
 
-  * callback, forwarding the given variadic arguments, plus a provided
 
-  * callback argument.
 
-  * @param object an object that has the named method
 
-  * @param {String} name name of the method of object
 
-  * @param ...args arguments to pass to the method; the callback will
 
-  * be provided by Q and appended to these arguments.
 
-  * @returns a promise for the value or error
 
-  */
 
- Q.nsend = // XXX Based on Mark Miller's proposed "send"
 
- Q.nmcall = // XXX Based on "Redsandro's" proposal
 
- Q.ninvoke = function (object, name /*...args*/) {
 
-     var nodeArgs = array_slice(arguments, 2);
 
-     var deferred = defer();
 
-     nodeArgs.push(deferred.makeNodeResolver());
 
-     Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
 
-     return deferred.promise;
 
- };
 
- Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
 
- Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
 
- Promise.prototype.ninvoke = function (name /*...args*/) {
 
-     var nodeArgs = array_slice(arguments, 1);
 
-     var deferred = defer();
 
-     nodeArgs.push(deferred.makeNodeResolver());
 
-     this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
 
-     return deferred.promise;
 
- };
 
- /**
 
-  * If a function would like to support both Node continuation-passing-style and
 
-  * promise-returning-style, it can end its internal promise chain with
 
-  * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
 
-  * elects to use a nodeback, the result will be sent there.  If they do not
 
-  * pass a nodeback, they will receive the result promise.
 
-  * @param object a result (or a promise for a result)
 
-  * @param {Function} nodeback a Node.js-style callback
 
-  * @returns either the promise or nothing
 
-  */
 
- Q.nodeify = nodeify;
 
- function nodeify(object, nodeback) {
 
-     return Q(object).nodeify(nodeback);
 
- }
 
- Promise.prototype.nodeify = function (nodeback) {
 
-     if (nodeback) {
 
-         this.then(function (value) {
 
-             Q.nextTick(function () {
 
-                 nodeback(null, value);
 
-             });
 
-         }, function (error) {
 
-             Q.nextTick(function () {
 
-                 nodeback(error);
 
-             });
 
-         });
 
-     } else {
 
-         return this;
 
-     }
 
- };
 
- Q.noConflict = function() {
 
-     throw new Error("Q.noConflict only works when Q is used as a global");
 
- };
 
- // All code before this point will be filtered from stack traces.
 
- var qEndingLine = captureLine();
 
- return Q;
 
- });
 
 
  |