github.com/theQRL/go-zond@v0.1.1/internal/jsre/deps/web3.js (about)

     1  require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
     2  module.exports=[
     3    {
     4      "constant": true,
     5      "inputs": [
     6        {
     7          "name": "_owner",
     8          "type": "address"
     9        }
    10      ],
    11      "name": "name",
    12      "outputs": [
    13        {
    14          "name": "o_name",
    15          "type": "bytes32"
    16        }
    17      ],
    18      "type": "function"
    19    },
    20    {
    21      "constant": true,
    22      "inputs": [
    23        {
    24          "name": "_name",
    25          "type": "bytes32"
    26        }
    27      ],
    28      "name": "owner",
    29      "outputs": [
    30        {
    31          "name": "",
    32          "type": "address"
    33        }
    34      ],
    35      "type": "function"
    36    },
    37    {
    38      "constant": true,
    39      "inputs": [
    40        {
    41          "name": "_name",
    42          "type": "bytes32"
    43        }
    44      ],
    45      "name": "content",
    46      "outputs": [
    47        {
    48          "name": "",
    49          "type": "bytes32"
    50        }
    51      ],
    52      "type": "function"
    53    },
    54    {
    55      "constant": true,
    56      "inputs": [
    57        {
    58          "name": "_name",
    59          "type": "bytes32"
    60        }
    61      ],
    62      "name": "addr",
    63      "outputs": [
    64        {
    65          "name": "",
    66          "type": "address"
    67        }
    68      ],
    69      "type": "function"
    70    },
    71    {
    72      "constant": false,
    73      "inputs": [
    74        {
    75          "name": "_name",
    76          "type": "bytes32"
    77        }
    78      ],
    79      "name": "reserve",
    80      "outputs": [],
    81      "type": "function"
    82    },
    83    {
    84      "constant": true,
    85      "inputs": [
    86        {
    87          "name": "_name",
    88          "type": "bytes32"
    89        }
    90      ],
    91      "name": "subRegistrar",
    92      "outputs": [
    93        {
    94          "name": "",
    95          "type": "address"
    96        }
    97      ],
    98      "type": "function"
    99    },
   100    {
   101      "constant": false,
   102      "inputs": [
   103        {
   104          "name": "_name",
   105          "type": "bytes32"
   106        },
   107        {
   108          "name": "_newOwner",
   109          "type": "address"
   110        }
   111      ],
   112      "name": "transfer",
   113      "outputs": [],
   114      "type": "function"
   115    },
   116    {
   117      "constant": false,
   118      "inputs": [
   119        {
   120          "name": "_name",
   121          "type": "bytes32"
   122        },
   123        {
   124          "name": "_registrar",
   125          "type": "address"
   126        }
   127      ],
   128      "name": "setSubRegistrar",
   129      "outputs": [],
   130      "type": "function"
   131    },
   132    {
   133      "constant": false,
   134      "inputs": [],
   135      "name": "Registrar",
   136      "outputs": [],
   137      "type": "function"
   138    },
   139    {
   140      "constant": false,
   141      "inputs": [
   142        {
   143          "name": "_name",
   144          "type": "bytes32"
   145        },
   146        {
   147          "name": "_a",
   148          "type": "address"
   149        },
   150        {
   151          "name": "_primary",
   152          "type": "bool"
   153        }
   154      ],
   155      "name": "setAddress",
   156      "outputs": [],
   157      "type": "function"
   158    },
   159    {
   160      "constant": false,
   161      "inputs": [
   162        {
   163          "name": "_name",
   164          "type": "bytes32"
   165        },
   166        {
   167          "name": "_content",
   168          "type": "bytes32"
   169        }
   170      ],
   171      "name": "setContent",
   172      "outputs": [],
   173      "type": "function"
   174    },
   175    {
   176      "constant": false,
   177      "inputs": [
   178        {
   179          "name": "_name",
   180          "type": "bytes32"
   181        }
   182      ],
   183      "name": "disown",
   184      "outputs": [],
   185      "type": "function"
   186    },
   187    {
   188      "anonymous": false,
   189      "inputs": [
   190        {
   191          "indexed": true,
   192          "name": "_name",
   193          "type": "bytes32"
   194        },
   195        {
   196          "indexed": false,
   197          "name": "_winner",
   198          "type": "address"
   199        }
   200      ],
   201      "name": "AuctionEnded",
   202      "type": "event"
   203    },
   204    {
   205      "anonymous": false,
   206      "inputs": [
   207        {
   208          "indexed": true,
   209          "name": "_name",
   210          "type": "bytes32"
   211        },
   212        {
   213          "indexed": false,
   214          "name": "_bidder",
   215          "type": "address"
   216        },
   217        {
   218          "indexed": false,
   219          "name": "_value",
   220          "type": "uint256"
   221        }
   222      ],
   223      "name": "NewBid",
   224      "type": "event"
   225    },
   226    {
   227      "anonymous": false,
   228      "inputs": [
   229        {
   230          "indexed": true,
   231          "name": "name",
   232          "type": "bytes32"
   233        }
   234      ],
   235      "name": "Changed",
   236      "type": "event"
   237    },
   238    {
   239      "anonymous": false,
   240      "inputs": [
   241        {
   242          "indexed": true,
   243          "name": "name",
   244          "type": "bytes32"
   245        },
   246        {
   247          "indexed": true,
   248          "name": "addr",
   249          "type": "address"
   250        }
   251      ],
   252      "name": "PrimaryChanged",
   253      "type": "event"
   254    }
   255  ]
   256  
   257  },{}],2:[function(require,module,exports){
   258  module.exports=[
   259    {
   260      "constant": true,
   261      "inputs": [
   262        {
   263          "name": "_name",
   264          "type": "bytes32"
   265        }
   266      ],
   267      "name": "owner",
   268      "outputs": [
   269        {
   270          "name": "",
   271          "type": "address"
   272        }
   273      ],
   274      "type": "function"
   275    },
   276    {
   277      "constant": false,
   278      "inputs": [
   279        {
   280          "name": "_name",
   281          "type": "bytes32"
   282        },
   283        {
   284          "name": "_refund",
   285          "type": "address"
   286        }
   287      ],
   288      "name": "disown",
   289      "outputs": [],
   290      "type": "function"
   291    },
   292    {
   293      "constant": true,
   294      "inputs": [
   295        {
   296          "name": "_name",
   297          "type": "bytes32"
   298        }
   299      ],
   300      "name": "addr",
   301      "outputs": [
   302        {
   303          "name": "",
   304          "type": "address"
   305        }
   306      ],
   307      "type": "function"
   308    },
   309    {
   310      "constant": false,
   311      "inputs": [
   312        {
   313          "name": "_name",
   314          "type": "bytes32"
   315        }
   316      ],
   317      "name": "reserve",
   318      "outputs": [],
   319      "type": "function"
   320    },
   321    {
   322      "constant": false,
   323      "inputs": [
   324        {
   325          "name": "_name",
   326          "type": "bytes32"
   327        },
   328        {
   329          "name": "_newOwner",
   330          "type": "address"
   331        }
   332      ],
   333      "name": "transfer",
   334      "outputs": [],
   335      "type": "function"
   336    },
   337    {
   338      "constant": false,
   339      "inputs": [
   340        {
   341          "name": "_name",
   342          "type": "bytes32"
   343        },
   344        {
   345          "name": "_a",
   346          "type": "address"
   347        }
   348      ],
   349      "name": "setAddr",
   350      "outputs": [],
   351      "type": "function"
   352    },
   353    {
   354      "anonymous": false,
   355      "inputs": [
   356        {
   357          "indexed": true,
   358          "name": "name",
   359          "type": "bytes32"
   360        }
   361      ],
   362      "name": "Changed",
   363      "type": "event"
   364    }
   365  ]
   366  
   367  },{}],3:[function(require,module,exports){
   368  module.exports=[
   369    {
   370      "constant": false,
   371      "inputs": [
   372        {
   373          "name": "from",
   374          "type": "bytes32"
   375        },
   376        {
   377          "name": "to",
   378          "type": "address"
   379        },
   380        {
   381          "name": "value",
   382          "type": "uint256"
   383        }
   384      ],
   385      "name": "transfer",
   386      "outputs": [],
   387      "type": "function"
   388    },
   389    {
   390      "constant": false,
   391      "inputs": [
   392        {
   393          "name": "from",
   394          "type": "bytes32"
   395        },
   396        {
   397          "name": "to",
   398          "type": "address"
   399        },
   400        {
   401          "name": "indirectId",
   402          "type": "bytes32"
   403        },
   404        {
   405          "name": "value",
   406          "type": "uint256"
   407        }
   408      ],
   409      "name": "icapTransfer",
   410      "outputs": [],
   411      "type": "function"
   412    },
   413    {
   414      "constant": false,
   415      "inputs": [
   416        {
   417          "name": "to",
   418          "type": "bytes32"
   419        }
   420      ],
   421      "name": "deposit",
   422      "outputs": [],
   423      "payable": true,
   424      "type": "function"
   425    },
   426    {
   427      "anonymous": false,
   428      "inputs": [
   429        {
   430          "indexed": true,
   431          "name": "from",
   432          "type": "address"
   433        },
   434        {
   435          "indexed": false,
   436          "name": "value",
   437          "type": "uint256"
   438        }
   439      ],
   440      "name": "AnonymousDeposit",
   441      "type": "event"
   442    },
   443    {
   444      "anonymous": false,
   445      "inputs": [
   446        {
   447          "indexed": true,
   448          "name": "from",
   449          "type": "address"
   450        },
   451        {
   452          "indexed": true,
   453          "name": "to",
   454          "type": "bytes32"
   455        },
   456        {
   457          "indexed": false,
   458          "name": "value",
   459          "type": "uint256"
   460        }
   461      ],
   462      "name": "Deposit",
   463      "type": "event"
   464    },
   465    {
   466      "anonymous": false,
   467      "inputs": [
   468        {
   469          "indexed": true,
   470          "name": "from",
   471          "type": "bytes32"
   472        },
   473        {
   474          "indexed": true,
   475          "name": "to",
   476          "type": "address"
   477        },
   478        {
   479          "indexed": false,
   480          "name": "value",
   481          "type": "uint256"
   482        }
   483      ],
   484      "name": "Transfer",
   485      "type": "event"
   486    },
   487    {
   488      "anonymous": false,
   489      "inputs": [
   490        {
   491          "indexed": true,
   492          "name": "from",
   493          "type": "bytes32"
   494        },
   495        {
   496          "indexed": true,
   497          "name": "to",
   498          "type": "address"
   499        },
   500        {
   501          "indexed": false,
   502          "name": "indirectId",
   503          "type": "bytes32"
   504        },
   505        {
   506          "indexed": false,
   507          "name": "value",
   508          "type": "uint256"
   509        }
   510      ],
   511      "name": "IcapTransfer",
   512      "type": "event"
   513    }
   514  ]
   515  
   516  },{}],4:[function(require,module,exports){
   517  var f = require('./formatters');
   518  var SolidityType = require('./type');
   519  
   520  /**
   521   * SolidityTypeAddress is a prototype that represents address type
   522   * It matches:
   523   * address
   524   * address[]
   525   * address[4]
   526   * address[][]
   527   * address[3][]
   528   * address[][6][], ...
   529   */
   530  var SolidityTypeAddress = function () {
   531      this._inputFormatter = f.formatInputInt;
   532      this._outputFormatter = f.formatOutputAddress;
   533  };
   534  
   535  SolidityTypeAddress.prototype = new SolidityType({});
   536  SolidityTypeAddress.prototype.constructor = SolidityTypeAddress;
   537  
   538  SolidityTypeAddress.prototype.isType = function (name) {
   539      return !!name.match(/address(\[([0-9]*)\])?/);
   540  };
   541  
   542  module.exports = SolidityTypeAddress;
   543  
   544  },{"./formatters":9,"./type":14}],5:[function(require,module,exports){
   545  var f = require('./formatters');
   546  var SolidityType = require('./type');
   547  
   548  /**
   549   * SolidityTypeBool is a prototype that represents bool type
   550   * It matches:
   551   * bool
   552   * bool[]
   553   * bool[4]
   554   * bool[][]
   555   * bool[3][]
   556   * bool[][6][], ...
   557   */
   558  var SolidityTypeBool = function () {
   559      this._inputFormatter = f.formatInputBool;
   560      this._outputFormatter = f.formatOutputBool;
   561  };
   562  
   563  SolidityTypeBool.prototype = new SolidityType({});
   564  SolidityTypeBool.prototype.constructor = SolidityTypeBool;
   565  
   566  SolidityTypeBool.prototype.isType = function (name) {
   567      return !!name.match(/^bool(\[([0-9]*)\])*$/);
   568  };
   569  
   570  module.exports = SolidityTypeBool;
   571  
   572  },{"./formatters":9,"./type":14}],6:[function(require,module,exports){
   573  var f = require('./formatters');
   574  var SolidityType = require('./type');
   575  
   576  /**
   577   * SolidityTypeBytes is a prototype that represents the bytes type.
   578   * It matches:
   579   * bytes
   580   * bytes[]
   581   * bytes[4]
   582   * bytes[][]
   583   * bytes[3][]
   584   * bytes[][6][], ...
   585   * bytes32
   586   * bytes8[4]
   587   * bytes[3][]
   588   */
   589  var SolidityTypeBytes = function () {
   590      this._inputFormatter = f.formatInputBytes;
   591      this._outputFormatter = f.formatOutputBytes;
   592  };
   593  
   594  SolidityTypeBytes.prototype = new SolidityType({});
   595  SolidityTypeBytes.prototype.constructor = SolidityTypeBytes;
   596  
   597  SolidityTypeBytes.prototype.isType = function (name) {
   598      return !!name.match(/^bytes([0-9]{1,})(\[([0-9]*)\])*$/);
   599  };
   600  
   601  module.exports = SolidityTypeBytes;
   602  
   603  },{"./formatters":9,"./type":14}],7:[function(require,module,exports){
   604  /*
   605      This file is part of web3.js.
   606  
   607      web3.js is free software: you can redistribute it and/or modify
   608      it under the terms of the GNU Lesser General Public License as published by
   609      the Free Software Foundation, either version 3 of the License, or
   610      (at your option) any later version.
   611  
   612      web3.js is distributed in the hope that it will be useful,
   613      but WITHOUT ANY WARRANTY; without even the implied warranty of
   614      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   615      GNU Lesser General Public License for more details.
   616  
   617      You should have received a copy of the GNU Lesser General Public License
   618      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
   619  */
   620  /**
   621   * @file coder.js
   622   * @author Marek Kotewicz <marek@ethdev.com>
   623   * @date 2015
   624   */
   625  
   626  var f = require('./formatters');
   627  
   628  var SolidityTypeAddress = require('./address');
   629  var SolidityTypeBool = require('./bool');
   630  var SolidityTypeInt = require('./int');
   631  var SolidityTypeUInt = require('./uint');
   632  var SolidityTypeDynamicBytes = require('./dynamicbytes');
   633  var SolidityTypeString = require('./string');
   634  var SolidityTypeReal = require('./real');
   635  var SolidityTypeUReal = require('./ureal');
   636  var SolidityTypeBytes = require('./bytes');
   637  
   638  var isDynamic = function (solidityType, type) {
   639     return solidityType.isDynamicType(type) ||
   640            solidityType.isDynamicArray(type);
   641  };
   642  
   643  /**
   644   * SolidityCoder prototype should be used to encode/decode solidity params of any type
   645   */
   646  var SolidityCoder = function (types) {
   647      this._types = types;
   648  };
   649  
   650  /**
   651   * This method should be used to transform type to SolidityType
   652   *
   653   * @method _requireType
   654   * @param {String} type
   655   * @returns {SolidityType}
   656   * @throws {Error} throws if no matching type is found
   657   */
   658  SolidityCoder.prototype._requireType = function (type) {
   659      var solidityType = this._types.filter(function (t) {
   660          return t.isType(type);
   661      })[0];
   662  
   663      if (!solidityType) {
   664          throw Error('invalid solidity type!: ' + type);
   665      }
   666  
   667      return solidityType;
   668  };
   669  
   670  /**
   671   * Should be used to encode plain param
   672   *
   673   * @method encodeParam
   674   * @param {String} type
   675   * @param {Object} plain param
   676   * @return {String} encoded plain param
   677   */
   678  SolidityCoder.prototype.encodeParam = function (type, param) {
   679      return this.encodeParams([type], [param]);
   680  };
   681  
   682  /**
   683   * Should be used to encode list of params
   684   *
   685   * @method encodeParams
   686   * @param {Array} types
   687   * @param {Array} params
   688   * @return {String} encoded list of params
   689   */
   690  SolidityCoder.prototype.encodeParams = function (types, params) {
   691      var solidityTypes = this.getSolidityTypes(types);
   692  
   693      var encodeds = solidityTypes.map(function (solidityType, index) {
   694          return solidityType.encode(params[index], types[index]);
   695      });
   696  
   697      var dynamicOffset = solidityTypes.reduce(function (acc, solidityType, index) {
   698          var staticPartLength = solidityType.staticPartLength(types[index]);
   699          var roundedStaticPartLength = Math.floor((staticPartLength + 31) / 32) * 32;
   700  
   701          return acc + (isDynamic(solidityTypes[index], types[index]) ?
   702              32 :
   703              roundedStaticPartLength);
   704      }, 0);
   705  
   706      var result = this.encodeMultiWithOffset(types, solidityTypes, encodeds, dynamicOffset);
   707  
   708      return result;
   709  };
   710  
   711  SolidityCoder.prototype.encodeMultiWithOffset = function (types, solidityTypes, encodeds, dynamicOffset) {
   712      var result = "";
   713      var self = this;
   714  
   715      types.forEach(function (type, i) {
   716          if (isDynamic(solidityTypes[i], types[i])) {
   717              result += f.formatInputInt(dynamicOffset).encode();
   718              var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   719              dynamicOffset += e.length / 2;
   720          } else {
   721              // don't add length to dynamicOffset. it's already counted
   722              result += self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   723          }
   724  
   725          // TODO: figure out nested arrays
   726      });
   727  
   728      types.forEach(function (type, i) {
   729          if (isDynamic(solidityTypes[i], types[i])) {
   730              var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   731              dynamicOffset += e.length / 2;
   732              result += e;
   733          }
   734      });
   735      return result;
   736  };
   737  
   738  // TODO: refactor whole encoding!
   739  SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded, offset) {
   740      var self = this;
   741      if (solidityType.isDynamicArray(type)) {
   742          return (function () {
   743              // offset was already set
   744              var nestedName = solidityType.nestedName(type);
   745              var nestedStaticPartLength = solidityType.staticPartLength(nestedName);
   746              var result = encoded[0];
   747  
   748              (function () {
   749                  var previousLength = 2; // in int
   750                  if (solidityType.isDynamicArray(nestedName)) {
   751                      for (var i = 1; i < encoded.length; i++) {
   752                          previousLength += +(encoded[i - 1])[0] || 0;
   753                          result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode();
   754                      }
   755                  }
   756              })();
   757  
   758              // first element is length, skip it
   759              (function () {
   760                  for (var i = 0; i < encoded.length - 1; i++) {
   761                      var additionalOffset = result / 2;
   762                      result += self.encodeWithOffset(nestedName, solidityType, encoded[i + 1], offset +  additionalOffset);
   763                  }
   764              })();
   765  
   766              return result;
   767          })();
   768  
   769      } else if (solidityType.isStaticArray(type)) {
   770          return (function () {
   771              var nestedName = solidityType.nestedName(type);
   772              var nestedStaticPartLength = solidityType.staticPartLength(nestedName);
   773              var result = "";
   774  
   775  
   776              if (solidityType.isDynamicArray(nestedName)) {
   777                  (function () {
   778                      var previousLength = 0; // in int
   779                      for (var i = 0; i < encoded.length; i++) {
   780                          // calculate length of previous item
   781                          previousLength += +(encoded[i - 1] || [])[0] || 0;
   782                          result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode();
   783                      }
   784                  })();
   785              }
   786  
   787              (function () {
   788                  for (var i = 0; i < encoded.length; i++) {
   789                      var additionalOffset = result / 2;
   790                      result += self.encodeWithOffset(nestedName, solidityType, encoded[i], offset + additionalOffset);
   791                  }
   792              })();
   793  
   794              return result;
   795          })();
   796      }
   797  
   798      return encoded;
   799  };
   800  
   801  /**
   802   * Should be used to decode bytes to plain param
   803   *
   804   * @method decodeParam
   805   * @param {String} type
   806   * @param {String} bytes
   807   * @return {Object} plain param
   808   */
   809  SolidityCoder.prototype.decodeParam = function (type, bytes) {
   810      return this.decodeParams([type], bytes)[0];
   811  };
   812  
   813  /**
   814   * Should be used to decode list of params
   815   *
   816   * @method decodeParam
   817   * @param {Array} types
   818   * @param {String} bytes
   819   * @return {Array} array of plain params
   820   */
   821  SolidityCoder.prototype.decodeParams = function (types, bytes) {
   822      var solidityTypes = this.getSolidityTypes(types);
   823      var offsets = this.getOffsets(types, solidityTypes);
   824  
   825      return solidityTypes.map(function (solidityType, index) {
   826          return solidityType.decode(bytes, offsets[index],  types[index], index);
   827      });
   828  };
   829  
   830  SolidityCoder.prototype.getOffsets = function (types, solidityTypes) {
   831      var lengths =  solidityTypes.map(function (solidityType, index) {
   832          return solidityType.staticPartLength(types[index]);
   833      });
   834  
   835      for (var i = 1; i < lengths.length; i++) {
   836           // sum with length of previous element
   837          lengths[i] += lengths[i - 1];
   838      }
   839  
   840      return lengths.map(function (length, index) {
   841          // remove the current length, so the length is sum of previous elements
   842          var staticPartLength = solidityTypes[index].staticPartLength(types[index]);
   843          return length - staticPartLength;
   844      });
   845  };
   846  
   847  SolidityCoder.prototype.getSolidityTypes = function (types) {
   848      var self = this;
   849      return types.map(function (type) {
   850          return self._requireType(type);
   851      });
   852  };
   853  
   854  var coder = new SolidityCoder([
   855      new SolidityTypeAddress(),
   856      new SolidityTypeBool(),
   857      new SolidityTypeInt(),
   858      new SolidityTypeUInt(),
   859      new SolidityTypeDynamicBytes(),
   860      new SolidityTypeBytes(),
   861      new SolidityTypeString(),
   862      new SolidityTypeReal(),
   863      new SolidityTypeUReal()
   864  ]);
   865  
   866  module.exports = coder;
   867  
   868  },{"./address":4,"./bool":5,"./bytes":6,"./dynamicbytes":8,"./formatters":9,"./int":10,"./real":12,"./string":13,"./uint":15,"./ureal":16}],8:[function(require,module,exports){
   869  var f = require('./formatters');
   870  var SolidityType = require('./type');
   871  
   872  var SolidityTypeDynamicBytes = function () {
   873      this._inputFormatter = f.formatInputDynamicBytes;
   874      this._outputFormatter = f.formatOutputDynamicBytes;
   875  };
   876  
   877  SolidityTypeDynamicBytes.prototype = new SolidityType({});
   878  SolidityTypeDynamicBytes.prototype.constructor = SolidityTypeDynamicBytes;
   879  
   880  SolidityTypeDynamicBytes.prototype.isType = function (name) {
   881      return !!name.match(/^bytes(\[([0-9]*)\])*$/);
   882  };
   883  
   884  SolidityTypeDynamicBytes.prototype.isDynamicType = function () {
   885      return true;
   886  };
   887  
   888  module.exports = SolidityTypeDynamicBytes;
   889  
   890  },{"./formatters":9,"./type":14}],9:[function(require,module,exports){
   891  /*
   892      This file is part of web3.js.
   893  
   894      web3.js is free software: you can redistribute it and/or modify
   895      it under the terms of the GNU Lesser General Public License as published by
   896      the Free Software Foundation, either version 3 of the License, or
   897      (at your option) any later version.
   898  
   899      web3.js is distributed in the hope that it will be useful,
   900      but WITHOUT ANY WARRANTY; without even the implied warranty of
   901      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   902      GNU Lesser General Public License for more details.
   903  
   904      You should have received a copy of the GNU Lesser General Public License
   905      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
   906  */
   907  /**
   908   * @file formatters.js
   909   * @author Marek Kotewicz <marek@ethdev.com>
   910   * @date 2015
   911   */
   912  
   913  var BigNumber = require('bignumber.js');
   914  var utils = require('../utils/utils');
   915  var c = require('../utils/config');
   916  var SolidityParam = require('./param');
   917  
   918  
   919  /**
   920   * Formats input value to byte representation of int
   921   * If value is negative, return it's two's complement
   922   * If the value is floating point, round it down
   923   *
   924   * @method formatInputInt
   925   * @param {String|Number|BigNumber} value that needs to be formatted
   926   * @returns {SolidityParam}
   927   */
   928  var formatInputInt = function (value) {
   929      BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE);
   930      var result = utils.padLeft(utils.toTwosComplement(value).toString(16), 64);
   931      return new SolidityParam(result);
   932  };
   933  
   934  /**
   935   * Formats input bytes
   936   *
   937   * @method formatInputBytes
   938   * @param {String}
   939   * @returns {SolidityParam}
   940   */
   941  var formatInputBytes = function (value) {
   942      var result = utils.toHex(value).substr(2);
   943      var l = Math.floor((result.length + 63) / 64);
   944      result = utils.padRight(result, l * 64);
   945      return new SolidityParam(result);
   946  };
   947  
   948  /**
   949   * Formats input bytes
   950   *
   951   * @method formatDynamicInputBytes
   952   * @param {String}
   953   * @returns {SolidityParam}
   954   */
   955  var formatInputDynamicBytes = function (value) {
   956      var result = utils.toHex(value).substr(2);
   957      var length = result.length / 2;
   958      var l = Math.floor((result.length + 63) / 64);
   959      result = utils.padRight(result, l * 64);
   960      return new SolidityParam(formatInputInt(length).value + result);
   961  };
   962  
   963  /**
   964   * Formats input value to byte representation of string
   965   *
   966   * @method formatInputString
   967   * @param {String}
   968   * @returns {SolidityParam}
   969   */
   970  var formatInputString = function (value) {
   971      var result = utils.fromUtf8(value).substr(2);
   972      var length = result.length / 2;
   973      var l = Math.floor((result.length + 63) / 64);
   974      result = utils.padRight(result, l * 64);
   975      return new SolidityParam(formatInputInt(length).value + result);
   976  };
   977  
   978  /**
   979   * Formats input value to byte representation of bool
   980   *
   981   * @method formatInputBool
   982   * @param {Boolean}
   983   * @returns {SolidityParam}
   984   */
   985  var formatInputBool = function (value) {
   986      var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ?  '1' : '0');
   987      return new SolidityParam(result);
   988  };
   989  
   990  /**
   991   * Formats input value to byte representation of real
   992   * Values are multiplied by 2^m and encoded as integers
   993   *
   994   * @method formatInputReal
   995   * @param {String|Number|BigNumber}
   996   * @returns {SolidityParam}
   997   */
   998  var formatInputReal = function (value) {
   999      return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));
  1000  };
  1001  
  1002  /**
  1003   * Check if input value is negative
  1004   *
  1005   * @method signedIsNegative
  1006   * @param {String} value is hex format
  1007   * @returns {Boolean} true if it is negative, otherwise false
  1008   */
  1009  var signedIsNegative = function (value) {
  1010      return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1';
  1011  };
  1012  
  1013  /**
  1014   * Formats right-aligned output bytes to int
  1015   *
  1016   * @method formatOutputInt
  1017   * @param {SolidityParam} param
  1018   * @returns {BigNumber} right-aligned output bytes formatted to big number
  1019   */
  1020  var formatOutputInt = function (param) {
  1021      var value = param.staticPart() || "0";
  1022  
  1023      // check if it's negative number
  1024      // it is, return two's complement
  1025      if (signedIsNegative(value)) {
  1026          return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);
  1027      }
  1028      return new BigNumber(value, 16);
  1029  };
  1030  
  1031  /**
  1032   * Formats right-aligned output bytes to uint
  1033   *
  1034   * @method formatOutputUInt
  1035   * @param {SolidityParam}
  1036   * @returns {BigNumeber} right-aligned output bytes formatted to uint
  1037   */
  1038  var formatOutputUInt = function (param) {
  1039      var value = param.staticPart() || "0";
  1040      return new BigNumber(value, 16);
  1041  };
  1042  
  1043  /**
  1044   * Formats right-aligned output bytes to real
  1045   *
  1046   * @method formatOutputReal
  1047   * @param {SolidityParam}
  1048   * @returns {BigNumber} input bytes formatted to real
  1049   */
  1050  var formatOutputReal = function (param) {
  1051      return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128));
  1052  };
  1053  
  1054  /**
  1055   * Formats right-aligned output bytes to ureal
  1056   *
  1057   * @method formatOutputUReal
  1058   * @param {SolidityParam}
  1059   * @returns {BigNumber} input bytes formatted to ureal
  1060   */
  1061  var formatOutputUReal = function (param) {
  1062      return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128));
  1063  };
  1064  
  1065  /**
  1066   * Should be used to format output bool
  1067   *
  1068   * @method formatOutputBool
  1069   * @param {SolidityParam}
  1070   * @returns {Boolean} right-aligned input bytes formatted to bool
  1071   */
  1072  var formatOutputBool = function (param) {
  1073      return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false;
  1074  };
  1075  
  1076  /**
  1077   * Should be used to format output bytes
  1078   *
  1079   * @method formatOutputBytes
  1080   * @param {SolidityParam} left-aligned hex representation of string
  1081   * @param {String} name type name
  1082   * @returns {String} hex string
  1083   */
  1084  var formatOutputBytes = function (param, name) {
  1085      var matches = name.match(/^bytes([0-9]*)/);
  1086      var size = parseInt(matches[1]);
  1087      return '0x' + param.staticPart().slice(0, 2 * size);
  1088  };
  1089  
  1090  /**
  1091   * Should be used to format output bytes
  1092   *
  1093   * @method formatOutputDynamicBytes
  1094   * @param {SolidityParam} left-aligned hex representation of string
  1095   * @returns {String} hex string
  1096   */
  1097  var formatOutputDynamicBytes = function (param) {
  1098      var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
  1099      return '0x' + param.dynamicPart().substr(64, length);
  1100  };
  1101  
  1102  /**
  1103   * Should be used to format output string
  1104   *
  1105   * @method formatOutputString
  1106   * @param {SolidityParam} left-aligned hex representation of string
  1107   * @returns {String} ascii string
  1108   */
  1109  var formatOutputString = function (param) {
  1110      var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
  1111      return utils.toUtf8(param.dynamicPart().substr(64, length));
  1112  };
  1113  
  1114  /**
  1115   * Should be used to format output address
  1116   *
  1117   * @method formatOutputAddress
  1118   * @param {SolidityParam} right-aligned input bytes
  1119   * @returns {String} address
  1120   */
  1121  var formatOutputAddress = function (param) {
  1122      var value = param.staticPart();
  1123      return "0x" + value.slice(value.length - 40, value.length);
  1124  };
  1125  
  1126  module.exports = {
  1127      formatInputInt: formatInputInt,
  1128      formatInputBytes: formatInputBytes,
  1129      formatInputDynamicBytes: formatInputDynamicBytes,
  1130      formatInputString: formatInputString,
  1131      formatInputBool: formatInputBool,
  1132      formatInputReal: formatInputReal,
  1133      formatOutputInt: formatOutputInt,
  1134      formatOutputUInt: formatOutputUInt,
  1135      formatOutputReal: formatOutputReal,
  1136      formatOutputUReal: formatOutputUReal,
  1137      formatOutputBool: formatOutputBool,
  1138      formatOutputBytes: formatOutputBytes,
  1139      formatOutputDynamicBytes: formatOutputDynamicBytes,
  1140      formatOutputString: formatOutputString,
  1141      formatOutputAddress: formatOutputAddress
  1142  };
  1143  
  1144  },{"../utils/config":18,"../utils/utils":20,"./param":11,"bignumber.js":"bignumber.js"}],10:[function(require,module,exports){
  1145  var f = require('./formatters');
  1146  var SolidityType = require('./type');
  1147  
  1148  /**
  1149   * SolidityTypeInt is a prototype that represents int type
  1150   * It matches:
  1151   * int
  1152   * int[]
  1153   * int[4]
  1154   * int[][]
  1155   * int[3][]
  1156   * int[][6][], ...
  1157   * int32
  1158   * int64[]
  1159   * int8[4]
  1160   * int256[][]
  1161   * int[3][]
  1162   * int64[][6][], ...
  1163   */
  1164  var SolidityTypeInt = function () {
  1165      this._inputFormatter = f.formatInputInt;
  1166      this._outputFormatter = f.formatOutputInt;
  1167  };
  1168  
  1169  SolidityTypeInt.prototype = new SolidityType({});
  1170  SolidityTypeInt.prototype.constructor = SolidityTypeInt;
  1171  
  1172  SolidityTypeInt.prototype.isType = function (name) {
  1173      return !!name.match(/^int([0-9]*)?(\[([0-9]*)\])*$/);
  1174  };
  1175  
  1176  module.exports = SolidityTypeInt;
  1177  
  1178  },{"./formatters":9,"./type":14}],11:[function(require,module,exports){
  1179  /*
  1180      This file is part of web3.js.
  1181  
  1182      web3.js is free software: you can redistribute it and/or modify
  1183      it under the terms of the GNU Lesser General Public License as published by
  1184      the Free Software Foundation, either version 3 of the License, or
  1185      (at your option) any later version.
  1186  
  1187      web3.js is distributed in the hope that it will be useful,
  1188      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1189      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1190      GNU Lesser General Public License for more details.
  1191  
  1192      You should have received a copy of the GNU Lesser General Public License
  1193      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1194  */
  1195  /** 
  1196   * @file param.js
  1197   * @author Marek Kotewicz <marek@ethdev.com>
  1198   * @date 2015
  1199   */
  1200  
  1201  var utils = require('../utils/utils');
  1202  
  1203  /**
  1204   * SolidityParam object prototype.
  1205   * Should be used when encoding, decoding solidity bytes
  1206   */
  1207  var SolidityParam = function (value, offset) {
  1208      this.value = value || '';
  1209      this.offset = offset; // offset in bytes
  1210  };
  1211  
  1212  /**
  1213   * This method should be used to get length of params's dynamic part
  1214   * 
  1215   * @method dynamicPartLength
  1216   * @returns {Number} length of dynamic part (in bytes)
  1217   */
  1218  SolidityParam.prototype.dynamicPartLength = function () {
  1219      return this.dynamicPart().length / 2;
  1220  };
  1221  
  1222  /**
  1223   * This method should be used to create copy of solidity param with different offset
  1224   *
  1225   * @method withOffset
  1226   * @param {Number} offset length in bytes
  1227   * @returns {SolidityParam} new solidity param with applied offset
  1228   */
  1229  SolidityParam.prototype.withOffset = function (offset) {
  1230      return new SolidityParam(this.value, offset);
  1231  };
  1232  
  1233  /**
  1234   * This method should be used to combine solidity params together
  1235   * eg. when appending an array
  1236   *
  1237   * @method combine
  1238   * @param {SolidityParam} param with which we should combine
  1239   * @param {SolidityParam} result of combination
  1240   */
  1241  SolidityParam.prototype.combine = function (param) {
  1242      return new SolidityParam(this.value + param.value); 
  1243  };
  1244  
  1245  /**
  1246   * This method should be called to check if param has dynamic size.
  1247   * If it has, it returns true, otherwise false
  1248   *
  1249   * @method isDynamic
  1250   * @returns {Boolean}
  1251   */
  1252  SolidityParam.prototype.isDynamic = function () {
  1253      return this.offset !== undefined;
  1254  };
  1255  
  1256  /**
  1257   * This method should be called to transform offset to bytes
  1258   *
  1259   * @method offsetAsBytes
  1260   * @returns {String} bytes representation of offset
  1261   */
  1262  SolidityParam.prototype.offsetAsBytes = function () {
  1263      return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64);
  1264  };
  1265  
  1266  /**
  1267   * This method should be called to get static part of param
  1268   *
  1269   * @method staticPart
  1270   * @returns {String} offset if it is a dynamic param, otherwise value
  1271   */
  1272  SolidityParam.prototype.staticPart = function () {
  1273      if (!this.isDynamic()) {
  1274          return this.value; 
  1275      } 
  1276      return this.offsetAsBytes();
  1277  };
  1278  
  1279  /**
  1280   * This method should be called to get dynamic part of param
  1281   *
  1282   * @method dynamicPart
  1283   * @returns {String} returns a value if it is a dynamic param, otherwise empty string
  1284   */
  1285  SolidityParam.prototype.dynamicPart = function () {
  1286      return this.isDynamic() ? this.value : '';
  1287  };
  1288  
  1289  /**
  1290   * This method should be called to encode param
  1291   *
  1292   * @method encode
  1293   * @returns {String}
  1294   */
  1295  SolidityParam.prototype.encode = function () {
  1296      return this.staticPart() + this.dynamicPart();
  1297  };
  1298  
  1299  /**
  1300   * This method should be called to encode array of params
  1301   *
  1302   * @method encodeList
  1303   * @param {Array[SolidityParam]} params
  1304   * @returns {String}
  1305   */
  1306  SolidityParam.encodeList = function (params) {
  1307      
  1308      // updating offsets
  1309      var totalOffset = params.length * 32;
  1310      var offsetParams = params.map(function (param) {
  1311          if (!param.isDynamic()) {
  1312              return param;
  1313          }
  1314          var offset = totalOffset;
  1315          totalOffset += param.dynamicPartLength();
  1316          return param.withOffset(offset);
  1317      });
  1318  
  1319      // encode everything!
  1320      return offsetParams.reduce(function (result, param) {
  1321          return result + param.dynamicPart();
  1322      }, offsetParams.reduce(function (result, param) {
  1323          return result + param.staticPart();
  1324      }, ''));
  1325  };
  1326  
  1327  
  1328  
  1329  module.exports = SolidityParam;
  1330  
  1331  
  1332  },{"../utils/utils":20}],12:[function(require,module,exports){
  1333  var f = require('./formatters');
  1334  var SolidityType = require('./type');
  1335  
  1336  /**
  1337   * SolidityTypeReal is a prototype that represents real type
  1338   * It matches:
  1339   * real
  1340   * real[]
  1341   * real[4]
  1342   * real[][]
  1343   * real[3][]
  1344   * real[][6][], ...
  1345   * real32
  1346   * real64[]
  1347   * real8[4]
  1348   * real256[][]
  1349   * real[3][]
  1350   * real64[][6][], ...
  1351   */
  1352  var SolidityTypeReal = function () {
  1353      this._inputFormatter = f.formatInputReal;
  1354      this._outputFormatter = f.formatOutputReal;
  1355  };
  1356  
  1357  SolidityTypeReal.prototype = new SolidityType({});
  1358  SolidityTypeReal.prototype.constructor = SolidityTypeReal;
  1359  
  1360  SolidityTypeReal.prototype.isType = function (name) {
  1361      return !!name.match(/real([0-9]*)?(\[([0-9]*)\])?/);
  1362  };
  1363  
  1364  module.exports = SolidityTypeReal;
  1365  
  1366  },{"./formatters":9,"./type":14}],13:[function(require,module,exports){
  1367  var f = require('./formatters');
  1368  var SolidityType = require('./type');
  1369  
  1370  var SolidityTypeString = function () {
  1371      this._inputFormatter = f.formatInputString;
  1372      this._outputFormatter = f.formatOutputString;
  1373  };
  1374  
  1375  SolidityTypeString.prototype = new SolidityType({});
  1376  SolidityTypeString.prototype.constructor = SolidityTypeString;
  1377  
  1378  SolidityTypeString.prototype.isType = function (name) {
  1379      return !!name.match(/^string(\[([0-9]*)\])*$/);
  1380  };
  1381  
  1382  SolidityTypeString.prototype.isDynamicType = function () {
  1383      return true;
  1384  };
  1385  
  1386  module.exports = SolidityTypeString;
  1387  
  1388  },{"./formatters":9,"./type":14}],14:[function(require,module,exports){
  1389  var f = require('./formatters');
  1390  var SolidityParam = require('./param');
  1391  
  1392  /**
  1393   * SolidityType prototype is used to encode/decode solidity params of certain type
  1394   */
  1395  var SolidityType = function (config) {
  1396      this._inputFormatter = config.inputFormatter;
  1397      this._outputFormatter = config.outputFormatter;
  1398  };
  1399  
  1400  /**
  1401   * Should be used to determine if this SolidityType do match given name
  1402   *
  1403   * @method isType
  1404   * @param {String} name
  1405   * @return {Bool} true if type match this SolidityType, otherwise false
  1406   */
  1407  SolidityType.prototype.isType = function (name) {
  1408      throw "this method should be overrwritten for type " + name;
  1409  };
  1410  
  1411  /**
  1412   * Should be used to determine what is the length of static part in given type
  1413   *
  1414   * @method staticPartLength
  1415   * @param {String} name
  1416   * @return {Number} length of static part in bytes
  1417   */
  1418  SolidityType.prototype.staticPartLength = function (name) {
  1419      // If name isn't an array then treat it like a single element array.
  1420      return (this.nestedTypes(name) || ['[1]'])
  1421          .map(function (type) {
  1422              // the length of the nested array
  1423              return parseInt(type.slice(1, -1), 10) || 1;
  1424          })
  1425          .reduce(function (previous, current) {
  1426              return previous * current;
  1427          // all basic types are 32 bytes long
  1428          }, 32);
  1429  };
  1430  
  1431  /**
  1432   * Should be used to determine if type is dynamic array
  1433   * eg:
  1434   * "type[]" => true
  1435   * "type[4]" => false
  1436   *
  1437   * @method isDynamicArray
  1438   * @param {String} name
  1439   * @return {Bool} true if the type is dynamic array
  1440   */
  1441  SolidityType.prototype.isDynamicArray = function (name) {
  1442      var nestedTypes = this.nestedTypes(name);
  1443      return !!nestedTypes && !nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g);
  1444  };
  1445  
  1446  /**
  1447   * Should be used to determine if type is static array
  1448   * eg:
  1449   * "type[]" => false
  1450   * "type[4]" => true
  1451   *
  1452   * @method isStaticArray
  1453   * @param {String} name
  1454   * @return {Bool} true if the type is static array
  1455   */
  1456  SolidityType.prototype.isStaticArray = function (name) {
  1457      var nestedTypes = this.nestedTypes(name);
  1458      return !!nestedTypes && !!nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g);
  1459  };
  1460  
  1461  /**
  1462   * Should return length of static array
  1463   * eg.
  1464   * "int[32]" => 32
  1465   * "int256[14]" => 14
  1466   * "int[2][3]" => 3
  1467   * "int" => 1
  1468   * "int[1]" => 1
  1469   * "int[]" => 1
  1470   *
  1471   * @method staticArrayLength
  1472   * @param {String} name
  1473   * @return {Number} static array length
  1474   */
  1475  SolidityType.prototype.staticArrayLength = function (name) {
  1476      var nestedTypes = this.nestedTypes(name);
  1477      if (nestedTypes) {
  1478         return parseInt(nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g) || 1);
  1479      }
  1480      return 1;
  1481  };
  1482  
  1483  /**
  1484   * Should return nested type
  1485   * eg.
  1486   * "int[32]" => "int"
  1487   * "int256[14]" => "int256"
  1488   * "int[2][3]" => "int[2]"
  1489   * "int" => "int"
  1490   * "int[]" => "int"
  1491   *
  1492   * @method nestedName
  1493   * @param {String} name
  1494   * @return {String} nested name
  1495   */
  1496  SolidityType.prototype.nestedName = function (name) {
  1497      // remove last [] in name
  1498      var nestedTypes = this.nestedTypes(name);
  1499      if (!nestedTypes) {
  1500          return name;
  1501      }
  1502  
  1503      return name.substr(0, name.length - nestedTypes[nestedTypes.length - 1].length);
  1504  };
  1505  
  1506  /**
  1507   * Should return true if type has dynamic size by default
  1508   * such types are "string", "bytes"
  1509   *
  1510   * @method isDynamicType
  1511   * @param {String} name
  1512   * @return {Bool} true if is dynamic, otherwise false
  1513   */
  1514  SolidityType.prototype.isDynamicType = function () {
  1515      return false;
  1516  };
  1517  
  1518  /**
  1519   * Should return array of nested types
  1520   * eg.
  1521   * "int[2][3][]" => ["[2]", "[3]", "[]"]
  1522   * "int[] => ["[]"]
  1523   * "int" => null
  1524   *
  1525   * @method nestedTypes
  1526   * @param {String} name
  1527   * @return {Array} array of nested types
  1528   */
  1529  SolidityType.prototype.nestedTypes = function (name) {
  1530      // return list of strings eg. "[]", "[3]", "[]", "[2]"
  1531      return name.match(/(\[[0-9]*\])/g);
  1532  };
  1533  
  1534  /**
  1535   * Should be used to encode the value
  1536   *
  1537   * @method encode
  1538   * @param {Object} value
  1539   * @param {String} name
  1540   * @return {String} encoded value
  1541   */
  1542  SolidityType.prototype.encode = function (value, name) {
  1543      var self = this;
  1544      if (this.isDynamicArray(name)) {
  1545  
  1546          return (function () {
  1547              var length = value.length;                          // in int
  1548              var nestedName = self.nestedName(name);
  1549  
  1550              var result = [];
  1551              result.push(f.formatInputInt(length).encode());
  1552  
  1553              value.forEach(function (v) {
  1554                  result.push(self.encode(v, nestedName));
  1555              });
  1556  
  1557              return result;
  1558          })();
  1559  
  1560      } else if (this.isStaticArray(name)) {
  1561  
  1562          return (function () {
  1563              var length = self.staticArrayLength(name);          // in int
  1564              var nestedName = self.nestedName(name);
  1565  
  1566              var result = [];
  1567              for (var i = 0; i < length; i++) {
  1568                  result.push(self.encode(value[i], nestedName));
  1569              }
  1570  
  1571              return result;
  1572          })();
  1573  
  1574      }
  1575  
  1576      return this._inputFormatter(value, name).encode();
  1577  };
  1578  
  1579  /**
  1580   * Should be used to decode value from bytes
  1581   *
  1582   * @method decode
  1583   * @param {String} bytes
  1584   * @param {Number} offset in bytes
  1585   * @param {String} name type name
  1586   * @returns {Object} decoded value
  1587   */
  1588  SolidityType.prototype.decode = function (bytes, offset, name) {
  1589      var self = this;
  1590  
  1591      if (this.isDynamicArray(name)) {
  1592  
  1593          return (function () {
  1594              var arrayOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes
  1595              var length = parseInt('0x' + bytes.substr(arrayOffset * 2, 64)); // in int
  1596              var arrayStart = arrayOffset + 32; // array starts after length; // in bytes
  1597  
  1598              var nestedName = self.nestedName(name);
  1599              var nestedStaticPartLength = self.staticPartLength(nestedName);  // in bytes
  1600              var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;
  1601              var result = [];
  1602  
  1603              for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {
  1604                  result.push(self.decode(bytes, arrayStart + i, nestedName));
  1605              }
  1606  
  1607              return result;
  1608          })();
  1609  
  1610      } else if (this.isStaticArray(name)) {
  1611  
  1612          return (function () {
  1613              var length = self.staticArrayLength(name);                      // in int
  1614              var arrayStart = offset;                                        // in bytes
  1615  
  1616              var nestedName = self.nestedName(name);
  1617              var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes
  1618              var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;
  1619              var result = [];
  1620  
  1621              for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {
  1622                  result.push(self.decode(bytes, arrayStart + i, nestedName));
  1623              }
  1624  
  1625              return result;
  1626          })();
  1627      } else if (this.isDynamicType(name)) {
  1628  
  1629          return (function () {
  1630              var dynamicOffset = parseInt('0x' + bytes.substr(offset * 2, 64));      // in bytes
  1631              var length = parseInt('0x' + bytes.substr(dynamicOffset * 2, 64));      // in bytes
  1632              var roundedLength = Math.floor((length + 31) / 32);                     // in int
  1633              var param = new SolidityParam(bytes.substr(dynamicOffset * 2, ( 1 + roundedLength) * 64), 0);
  1634              return self._outputFormatter(param, name);
  1635          })();
  1636      }
  1637  
  1638      var length = this.staticPartLength(name);
  1639      var param = new SolidityParam(bytes.substr(offset * 2, length * 2));
  1640      return this._outputFormatter(param, name);
  1641  };
  1642  
  1643  module.exports = SolidityType;
  1644  
  1645  },{"./formatters":9,"./param":11}],15:[function(require,module,exports){
  1646  var f = require('./formatters');
  1647  var SolidityType = require('./type');
  1648  
  1649  /**
  1650   * SolidityTypeUInt is a prototype that represents uint type
  1651   * It matches:
  1652   * uint
  1653   * uint[]
  1654   * uint[4]
  1655   * uint[][]
  1656   * uint[3][]
  1657   * uint[][6][], ...
  1658   * uint32
  1659   * uint64[]
  1660   * uint8[4]
  1661   * uint256[][]
  1662   * uint[3][]
  1663   * uint64[][6][], ...
  1664   */
  1665  var SolidityTypeUInt = function () {
  1666      this._inputFormatter = f.formatInputInt;
  1667      this._outputFormatter = f.formatOutputUInt;
  1668  };
  1669  
  1670  SolidityTypeUInt.prototype = new SolidityType({});
  1671  SolidityTypeUInt.prototype.constructor = SolidityTypeUInt;
  1672  
  1673  SolidityTypeUInt.prototype.isType = function (name) {
  1674      return !!name.match(/^uint([0-9]*)?(\[([0-9]*)\])*$/);
  1675  };
  1676  
  1677  module.exports = SolidityTypeUInt;
  1678  
  1679  },{"./formatters":9,"./type":14}],16:[function(require,module,exports){
  1680  var f = require('./formatters');
  1681  var SolidityType = require('./type');
  1682  
  1683  /**
  1684   * SolidityTypeUReal is a prototype that represents ureal type
  1685   * It matches:
  1686   * ureal
  1687   * ureal[]
  1688   * ureal[4]
  1689   * ureal[][]
  1690   * ureal[3][]
  1691   * ureal[][6][], ...
  1692   * ureal32
  1693   * ureal64[]
  1694   * ureal8[4]
  1695   * ureal256[][]
  1696   * ureal[3][]
  1697   * ureal64[][6][], ...
  1698   */
  1699  var SolidityTypeUReal = function () {
  1700      this._inputFormatter = f.formatInputReal;
  1701      this._outputFormatter = f.formatOutputUReal;
  1702  };
  1703  
  1704  SolidityTypeUReal.prototype = new SolidityType({});
  1705  SolidityTypeUReal.prototype.constructor = SolidityTypeUReal;
  1706  
  1707  SolidityTypeUReal.prototype.isType = function (name) {
  1708      return !!name.match(/^ureal([0-9]*)?(\[([0-9]*)\])*$/);
  1709  };
  1710  
  1711  module.exports = SolidityTypeUReal;
  1712  
  1713  },{"./formatters":9,"./type":14}],17:[function(require,module,exports){
  1714  'use strict';
  1715  
  1716  // go env doesn't have and need XMLHttpRequest
  1717  if (typeof XMLHttpRequest === 'undefined') {
  1718      exports.XMLHttpRequest = {};
  1719  } else {
  1720      exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line
  1721  }
  1722  
  1723  
  1724  },{}],18:[function(require,module,exports){
  1725  /*
  1726      This file is part of web3.js.
  1727  
  1728      web3.js is free software: you can redistribute it and/or modify
  1729      it under the terms of the GNU Lesser General Public License as published by
  1730      the Free Software Foundation, either version 3 of the License, or
  1731      (at your option) any later version.
  1732  
  1733      web3.js is distributed in the hope that it will be useful,
  1734      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1735      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1736      GNU Lesser General Public License for more details.
  1737  
  1738      You should have received a copy of the GNU Lesser General Public License
  1739      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1740  */
  1741  /** @file config.js
  1742   * @authors:
  1743   *   Marek Kotewicz <marek@ethdev.com>
  1744   * @date 2015
  1745   */
  1746  
  1747  /**
  1748   * Utils
  1749   * 
  1750   * @module utils
  1751   */
  1752  
  1753  /**
  1754   * Utility functions
  1755   * 
  1756   * @class [utils] config
  1757   * @constructor
  1758   */
  1759  
  1760  
  1761  /// required to define ETH_BIGNUMBER_ROUNDING_MODE
  1762  var BigNumber = require('bignumber.js');
  1763  
  1764  var ETH_UNITS = [
  1765      'wei',
  1766      'kwei',
  1767      'Mwei',
  1768      'Gwei',
  1769      'szabo',
  1770      'finney',
  1771      'femtoether',
  1772      'picoether',
  1773      'nanoether',
  1774      'microether',
  1775      'milliether',
  1776      'nano',
  1777      'micro',
  1778      'milli',
  1779      'ether',
  1780      'grand',
  1781      'Mether',
  1782      'Gether',
  1783      'Tether',
  1784      'Pether',
  1785      'Eether',
  1786      'Zether',
  1787      'Yether',
  1788      'Nether',
  1789      'Dether',
  1790      'Vether',
  1791      'Uether'
  1792  ];
  1793  
  1794  module.exports = {
  1795      ETH_PADDING: 32,
  1796      ETH_SIGNATURE_LENGTH: 4,
  1797      ETH_UNITS: ETH_UNITS,
  1798      ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN },
  1799      ETH_POLLING_TIMEOUT: 1000/2,
  1800      defaultBlock: 'latest',
  1801      defaultAccount: undefined
  1802  };
  1803  
  1804  
  1805  },{"bignumber.js":"bignumber.js"}],19:[function(require,module,exports){
  1806  /*
  1807      This file is part of web3.js.
  1808  
  1809      web3.js is free software: you can redistribute it and/or modify
  1810      it under the terms of the GNU Lesser General Public License as published by
  1811      the Free Software Foundation, either version 3 of the License, or
  1812      (at your option) any later version.
  1813  
  1814      web3.js is distributed in the hope that it will be useful,
  1815      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1816      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1817      GNU Lesser General Public License for more details.
  1818  
  1819      You should have received a copy of the GNU Lesser General Public License
  1820      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1821  */
  1822  /** 
  1823   * @file sha3.js
  1824   * @author Marek Kotewicz <marek@ethdev.com>
  1825   * @date 2015
  1826   */
  1827  
  1828  var CryptoJS = require('crypto-js');
  1829  var sha3 = require('crypto-js/sha3');
  1830  
  1831  module.exports = function (value, options) {
  1832      if (options && options.encoding === 'hex') {
  1833          if (value.length > 2 && value.substr(0, 2) === '0x') {
  1834              value = value.substr(2);
  1835          }
  1836          value = CryptoJS.enc.Hex.parse(value);
  1837      }
  1838  
  1839      return sha3(value, {
  1840          outputLength: 256
  1841      }).toString();
  1842  };
  1843  
  1844  
  1845  },{"crypto-js":59,"crypto-js/sha3":80}],20:[function(require,module,exports){
  1846  /*
  1847      This file is part of web3.js.
  1848  
  1849      web3.js is free software: you can redistribute it and/or modify
  1850      it under the terms of the GNU Lesser General Public License as published by
  1851      the Free Software Foundation, either version 3 of the License, or
  1852      (at your option) any later version.
  1853  
  1854      web3.js is distributed in the hope that it will be useful,
  1855      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1856      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1857      GNU Lesser General Public License for more details.
  1858  
  1859      You should have received a copy of the GNU Lesser General Public License
  1860      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1861  */
  1862  /**
  1863   * @file utils.js
  1864   * @author Marek Kotewicz <marek@ethdev.com>
  1865   * @date 2015
  1866   */
  1867  
  1868  /**
  1869   * Utils
  1870   *
  1871   * @module utils
  1872   */
  1873  
  1874  /**
  1875   * Utility functions
  1876   *
  1877   * @class [utils] utils
  1878   * @constructor
  1879   */
  1880  
  1881  
  1882  var BigNumber = require('bignumber.js');
  1883  var sha3 = require('./sha3.js');
  1884  var utf8 = require('utf8');
  1885  
  1886  var unitMap = {
  1887      'noether':      '0',
  1888      'wei':          '1',
  1889      'kwei':         '1000',
  1890      'Kwei':         '1000',
  1891      'babbage':      '1000',
  1892      'femtoether':   '1000',
  1893      'mwei':         '1000000',
  1894      'Mwei':         '1000000',
  1895      'lovelace':     '1000000',
  1896      'picoether':    '1000000',
  1897      'gwei':         '1000000000',
  1898      'Gwei':         '1000000000',
  1899      'shannon':      '1000000000',
  1900      'nanoether':    '1000000000',
  1901      'nano':         '1000000000',
  1902      'szabo':        '1000000000000',
  1903      'microether':   '1000000000000',
  1904      'micro':        '1000000000000',
  1905      'finney':       '1000000000000000',
  1906      'milliether':    '1000000000000000',
  1907      'milli':         '1000000000000000',
  1908      'ether':        '1000000000000000000',
  1909      'kether':       '1000000000000000000000',
  1910      'grand':        '1000000000000000000000',
  1911      'mether':       '1000000000000000000000000',
  1912      'gether':       '1000000000000000000000000000',
  1913      'tether':       '1000000000000000000000000000000'
  1914  };
  1915  
  1916  /**
  1917   * Should be called to pad string to expected length
  1918   *
  1919   * @method padLeft
  1920   * @param {String} string to be padded
  1921   * @param {Number} characters that result string should have
  1922   * @param {String} sign, by default 0
  1923   * @returns {String} right aligned string
  1924   */
  1925  var padLeft = function (string, chars, sign) {
  1926      return new Array(chars - string.length + 1).join(sign ? sign : "0") + string;
  1927  };
  1928  
  1929  /**
  1930   * Should be called to pad string to expected length
  1931   *
  1932   * @method padRight
  1933   * @param {String} string to be padded
  1934   * @param {Number} characters that result string should have
  1935   * @param {String} sign, by default 0
  1936   * @returns {String} right aligned string
  1937   */
  1938  var padRight = function (string, chars, sign) {
  1939      return string + (new Array(chars - string.length + 1).join(sign ? sign : "0"));
  1940  };
  1941  
  1942  /**
  1943   * Should be called to get utf8 from it's hex representation
  1944   *
  1945   * @method toUtf8
  1946   * @param {String} string in hex
  1947   * @returns {String} ascii string representation of hex value
  1948   */
  1949  var toUtf8 = function(hex) {
  1950  // Find termination
  1951      var str = "";
  1952      var i = 0, l = hex.length;
  1953      if (hex.substring(0, 2) === '0x') {
  1954          i = 2;
  1955      }
  1956      for (; i < l; i+=2) {
  1957          var code = parseInt(hex.substr(i, 2), 16);
  1958          if (code === 0)
  1959              break;
  1960          str += String.fromCharCode(code);
  1961      }
  1962  
  1963      return utf8.decode(str);
  1964  };
  1965  
  1966  /**
  1967   * Should be called to get ascii from it's hex representation
  1968   *
  1969   * @method toAscii
  1970   * @param {String} string in hex
  1971   * @returns {String} ascii string representation of hex value
  1972   */
  1973  var toAscii = function(hex) {
  1974  // Find termination
  1975      var str = "";
  1976      var i = 0, l = hex.length;
  1977      if (hex.substring(0, 2) === '0x') {
  1978          i = 2;
  1979      }
  1980      for (; i < l; i+=2) {
  1981          var code = parseInt(hex.substr(i, 2), 16);
  1982          str += String.fromCharCode(code);
  1983      }
  1984  
  1985      return str;
  1986  };
  1987  
  1988  /**
  1989   * Should be called to get hex representation (prefixed by 0x) of utf8 string
  1990   *
  1991   * @method fromUtf8
  1992   * @param {String} string
  1993   * @param {Number} optional padding
  1994   * @returns {String} hex representation of input string
  1995   */
  1996  var fromUtf8 = function(str) {
  1997      str = utf8.encode(str);
  1998      var hex = "";
  1999      for(var i = 0; i < str.length; i++) {
  2000          var code = str.charCodeAt(i);
  2001          if (code === 0)
  2002              break;
  2003          var n = code.toString(16);
  2004          hex += n.length < 2 ? '0' + n : n;
  2005      }
  2006  
  2007      return "0x" + hex;
  2008  };
  2009  
  2010  /**
  2011   * Should be called to get hex representation (prefixed by 0x) of ascii string
  2012   *
  2013   * @method fromAscii
  2014   * @param {String} string
  2015   * @param {Number} optional padding
  2016   * @returns {String} hex representation of input string
  2017   */
  2018  var fromAscii = function(str) {
  2019      var hex = "";
  2020      for(var i = 0; i < str.length; i++) {
  2021          var code = str.charCodeAt(i);
  2022          var n = code.toString(16);
  2023          hex += n.length < 2 ? '0' + n : n;
  2024      }
  2025  
  2026      return "0x" + hex;
  2027  };
  2028  
  2029  /**
  2030   * Should be used to create full function/event name from json abi
  2031   *
  2032   * @method transformToFullName
  2033   * @param {Object} json-abi
  2034   * @return {String} full fnction/event name
  2035   */
  2036  var transformToFullName = function (json) {
  2037      if (json.name.indexOf('(') !== -1) {
  2038          return json.name;
  2039      }
  2040  
  2041      var typeName = json.inputs.map(function(i){return i.type; }).join();
  2042      return json.name + '(' + typeName + ')';
  2043  };
  2044  
  2045  /**
  2046   * Should be called to get display name of contract function
  2047   *
  2048   * @method extractDisplayName
  2049   * @param {String} name of function/event
  2050   * @returns {String} display name for function/event eg. multiply(uint256) -> multiply
  2051   */
  2052  var extractDisplayName = function (name) {
  2053      var length = name.indexOf('(');
  2054      return length !== -1 ? name.substr(0, length) : name;
  2055  };
  2056  
  2057  /// @returns overloaded part of function/event name
  2058  var extractTypeName = function (name) {
  2059      /// TODO: make it invulnerable
  2060      var length = name.indexOf('(');
  2061      return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : "";
  2062  };
  2063  
  2064  /**
  2065   * Converts value to it's decimal representation in string
  2066   *
  2067   * @method toDecimal
  2068   * @param {String|Number|BigNumber}
  2069   * @return {String}
  2070   */
  2071  var toDecimal = function (value) {
  2072      return toBigNumber(value).toNumber();
  2073  };
  2074  
  2075  /**
  2076   * Converts value to it's hex representation
  2077   *
  2078   * @method fromDecimal
  2079   * @param {String|Number|BigNumber}
  2080   * @return {String}
  2081   */
  2082  var fromDecimal = function (value) {
  2083      var number = toBigNumber(value);
  2084      var result = number.toString(16);
  2085  
  2086      return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result;
  2087  };
  2088  
  2089  /**
  2090   * Auto converts any given value into it's hex representation.
  2091   *
  2092   * And even stringifys objects before.
  2093   *
  2094   * @method toHex
  2095   * @param {String|Number|BigNumber|Object}
  2096   * @return {String}
  2097   */
  2098  var toHex = function (val) {
  2099      /*jshint maxcomplexity: 8 */
  2100  
  2101      if (isBoolean(val))
  2102          return fromDecimal(+val);
  2103  
  2104      if (isBigNumber(val))
  2105          return fromDecimal(val);
  2106  
  2107      if (typeof val === 'object')
  2108          return fromUtf8(JSON.stringify(val));
  2109  
  2110      // if its a negative number, pass it through fromDecimal
  2111      if (isString(val)) {
  2112          if (val.indexOf('-0x') === 0)
  2113              return fromDecimal(val);
  2114          else if(val.indexOf('0x') === 0)
  2115              return val;
  2116          else if (!isFinite(val))
  2117              return fromAscii(val);
  2118      }
  2119  
  2120      return fromDecimal(val);
  2121  };
  2122  
  2123  /**
  2124   * Returns value of unit in Wei
  2125   *
  2126   * @method getValueOfUnit
  2127   * @param {String} unit the unit to convert to, default ether
  2128   * @returns {BigNumber} value of the unit (in Wei)
  2129   * @throws error if the unit is not correct:w
  2130   */
  2131  var getValueOfUnit = function (unit) {
  2132      unit = unit ? unit.toLowerCase() : 'ether';
  2133      var unitValue = unitMap[unit];
  2134      if (unitValue === undefined) {
  2135          throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2));
  2136      }
  2137      return new BigNumber(unitValue, 10);
  2138  };
  2139  
  2140  /**
  2141   * Takes a number of wei and converts it to any other ether unit.
  2142   *
  2143   * Possible units are:
  2144   *   SI Short   SI Full        Effigy       Other
  2145   * - kwei       femtoether     babbage
  2146   * - mwei       picoether      lovelace
  2147   * - gwei       nanoether      shannon      nano
  2148   * - --         microether     szabo        micro
  2149   * - --         milliether     finney       milli
  2150   * - ether      --             --
  2151   * - kether                    --           grand
  2152   * - mether
  2153   * - gether
  2154   * - tether
  2155   *
  2156   * @method fromWei
  2157   * @param {Number|String} number can be a number, number string or a HEX of a decimal
  2158   * @param {String} unit the unit to convert to, default ether
  2159   * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number
  2160  */
  2161  var fromWei = function(number, unit) {
  2162      var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit));
  2163  
  2164      return isBigNumber(number) ? returnValue : returnValue.toString(10);
  2165  };
  2166  
  2167  /**
  2168   * Takes a number of a unit and converts it to wei.
  2169   *
  2170   * Possible units are:
  2171   *   SI Short   SI Full        Effigy       Other
  2172   * - kwei       femtoether     babbage
  2173   * - mwei       picoether      lovelace
  2174   * - gwei       nanoether      shannon      nano
  2175   * - --         microether     szabo        micro
  2176   * - --         microether     szabo        micro
  2177   * - --         milliether     finney       milli
  2178   * - ether      --             --
  2179   * - kether                    --           grand
  2180   * - mether
  2181   * - gether
  2182   * - tether
  2183   *
  2184   * @method toWei
  2185   * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal
  2186   * @param {String} unit the unit to convert from, default ether
  2187   * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number
  2188  */
  2189  var toWei = function(number, unit) {
  2190      var returnValue = toBigNumber(number).times(getValueOfUnit(unit));
  2191  
  2192      return isBigNumber(number) ? returnValue : returnValue.toString(10);
  2193  };
  2194  
  2195  /**
  2196   * Takes an input and transforms it into a bignumber
  2197   *
  2198   * @method toBigNumber
  2199   * @param {Number|String|BigNumber} a number, string, HEX string or BigNumber
  2200   * @return {BigNumber} BigNumber
  2201  */
  2202  var toBigNumber = function(number) {
  2203      /*jshint maxcomplexity:5 */
  2204      number = number || 0;
  2205      if (isBigNumber(number))
  2206          return number;
  2207  
  2208      if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) {
  2209          return new BigNumber(number.replace('0x',''), 16);
  2210      }
  2211  
  2212      return new BigNumber(number.toString(10), 10);
  2213  };
  2214  
  2215  /**
  2216   * Takes and input transforms it into bignumber and if it is negative value, into two's complement
  2217   *
  2218   * @method toTwosComplement
  2219   * @param {Number|String|BigNumber}
  2220   * @return {BigNumber}
  2221   */
  2222  var toTwosComplement = function (number) {
  2223      var bigNumber = toBigNumber(number).round();
  2224      if (bigNumber.lessThan(0)) {
  2225          return new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(bigNumber).plus(1);
  2226      }
  2227      return bigNumber;
  2228  };
  2229  
  2230  /**
  2231   * Checks if the given string is strictly an address
  2232   *
  2233   * @method isStrictAddress
  2234   * @param {String} address the given HEX address
  2235   * @return {Boolean}
  2236  */
  2237  var isStrictAddress = function (address) {
  2238      return /^0x[0-9a-f]{40}$/i.test(address);
  2239  };
  2240  
  2241  /**
  2242   * Checks if the given string is an address
  2243   *
  2244   * @method isAddress
  2245   * @param {String} address the given HEX address
  2246   * @return {Boolean}
  2247  */
  2248  var isAddress = function (address) {
  2249      if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) {
  2250          // check if it has the basic requirements of an address
  2251          return false;
  2252      } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) {
  2253          // If it's all small caps or all caps, return true
  2254          return true;
  2255      } else {
  2256          // Otherwise check each case
  2257          return isChecksumAddress(address);
  2258      }
  2259  };
  2260  
  2261  /**
  2262   * Checks if the given string is a checksummed address
  2263   *
  2264   * @method isChecksumAddress
  2265   * @param {String} address the given HEX address
  2266   * @return {Boolean}
  2267  */
  2268  var isChecksumAddress = function (address) {
  2269      // Check each case
  2270      address = address.replace('0x','');
  2271      var addressHash = sha3(address.toLowerCase());
  2272  
  2273      for (var i = 0; i < 40; i++ ) {
  2274          // the nth letter should be uppercase if the nth digit of casemap is 1
  2275          if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) {
  2276              return false;
  2277          }
  2278      }
  2279      return true;
  2280  };
  2281  
  2282  
  2283  
  2284  /**
  2285   * Makes a checksum address
  2286   *
  2287   * @method toChecksumAddress
  2288   * @param {String} address the given HEX address
  2289   * @return {String}
  2290  */
  2291  var toChecksumAddress = function (address) {
  2292      if (typeof address === 'undefined') return '';
  2293  
  2294      address = address.toLowerCase().replace('0x','');
  2295      var addressHash = sha3(address);
  2296      var checksumAddress = '0x';
  2297  
  2298      for (var i = 0; i < address.length; i++ ) {
  2299          // If ith character is 9 to f then make it uppercase
  2300          if (parseInt(addressHash[i], 16) > 7) {
  2301            checksumAddress += address[i].toUpperCase();
  2302          } else {
  2303              checksumAddress += address[i];
  2304          }
  2305      }
  2306      return checksumAddress;
  2307  };
  2308  
  2309  /**
  2310   * Transforms given string to valid 20 bytes-length address with 0x prefix
  2311   *
  2312   * @method toAddress
  2313   * @param {String} address
  2314   * @return {String} formatted address
  2315   */
  2316  var toAddress = function (address) {
  2317      if (isStrictAddress(address)) {
  2318          return address;
  2319      }
  2320  
  2321      if (/^[0-9a-f]{40}$/.test(address)) {
  2322          return '0x' + address;
  2323      }
  2324  
  2325      return '0x' + padLeft(toHex(address).substr(2), 40);
  2326  };
  2327  
  2328  /**
  2329   * Returns true if object is BigNumber, otherwise false
  2330   *
  2331   * @method isBigNumber
  2332   * @param {Object}
  2333   * @return {Boolean}
  2334   */
  2335  var isBigNumber = function (object) {
  2336      return object instanceof BigNumber ||
  2337          (object && object.constructor && object.constructor.name === 'BigNumber');
  2338  };
  2339  
  2340  /**
  2341   * Returns true if object is string, otherwise false
  2342   *
  2343   * @method isString
  2344   * @param {Object}
  2345   * @return {Boolean}
  2346   */
  2347  var isString = function (object) {
  2348      return typeof object === 'string' ||
  2349          (object && object.constructor && object.constructor.name === 'String');
  2350  };
  2351  
  2352  /**
  2353   * Returns true if object is function, otherwise false
  2354   *
  2355   * @method isFunction
  2356   * @param {Object}
  2357   * @return {Boolean}
  2358   */
  2359  var isFunction = function (object) {
  2360      return typeof object === 'function';
  2361  };
  2362  
  2363  /**
  2364   * Returns true if object is Objet, otherwise false
  2365   *
  2366   * @method isObject
  2367   * @param {Object}
  2368   * @return {Boolean}
  2369   */
  2370  var isObject = function (object) {
  2371      return object !== null && !(object instanceof Array) && typeof object === 'object';
  2372  };
  2373  
  2374  /**
  2375   * Returns true if object is boolean, otherwise false
  2376   *
  2377   * @method isBoolean
  2378   * @param {Object}
  2379   * @return {Boolean}
  2380   */
  2381  var isBoolean = function (object) {
  2382      return typeof object === 'boolean';
  2383  };
  2384  
  2385  /**
  2386   * Returns true if object is array, otherwise false
  2387   *
  2388   * @method isArray
  2389   * @param {Object}
  2390   * @return {Boolean}
  2391   */
  2392  var isArray = function (object) {
  2393      return object instanceof Array;
  2394  };
  2395  
  2396  /**
  2397   * Returns true if given string is valid json object
  2398   *
  2399   * @method isJson
  2400   * @param {String}
  2401   * @return {Boolean}
  2402   */
  2403  var isJson = function (str) {
  2404      try {
  2405          return !!JSON.parse(str);
  2406      } catch (e) {
  2407          return false;
  2408      }
  2409  };
  2410  
  2411  /**
  2412   * Returns true if given string is a valid Ethereum block header bloom.
  2413   *
  2414   * @method isBloom
  2415   * @param {String} hex encoded bloom filter
  2416   * @return {Boolean}
  2417   */
  2418  var isBloom = function (bloom) {
  2419      if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) {
  2420          return false;
  2421      } else if (/^(0x)?[0-9a-f]{512}$/.test(bloom) || /^(0x)?[0-9A-F]{512}$/.test(bloom)) {
  2422          return true;
  2423      }
  2424      return false;
  2425  };
  2426  
  2427  /**
  2428   * Returns true if given string is a valid log topic.
  2429   *
  2430   * @method isTopic
  2431   * @param {String} hex encoded topic
  2432   * @return {Boolean}
  2433   */
  2434  var isTopic = function (topic) {
  2435      if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) {
  2436          return false;
  2437      } else if (/^(0x)?[0-9a-f]{64}$/.test(topic) || /^(0x)?[0-9A-F]{64}$/.test(topic)) {
  2438          return true;
  2439      }
  2440      return false;
  2441  };
  2442  
  2443  module.exports = {
  2444      padLeft: padLeft,
  2445      padRight: padRight,
  2446      toHex: toHex,
  2447      toDecimal: toDecimal,
  2448      fromDecimal: fromDecimal,
  2449      toUtf8: toUtf8,
  2450      toAscii: toAscii,
  2451      fromUtf8: fromUtf8,
  2452      fromAscii: fromAscii,
  2453      transformToFullName: transformToFullName,
  2454      extractDisplayName: extractDisplayName,
  2455      extractTypeName: extractTypeName,
  2456      toWei: toWei,
  2457      fromWei: fromWei,
  2458      toBigNumber: toBigNumber,
  2459      toTwosComplement: toTwosComplement,
  2460      toAddress: toAddress,
  2461      isBigNumber: isBigNumber,
  2462      isStrictAddress: isStrictAddress,
  2463      isAddress: isAddress,
  2464      isChecksumAddress: isChecksumAddress,
  2465      toChecksumAddress: toChecksumAddress,
  2466      isFunction: isFunction,
  2467      isString: isString,
  2468      isObject: isObject,
  2469      isBoolean: isBoolean,
  2470      isArray: isArray,
  2471      isJson: isJson,
  2472      isBloom: isBloom,
  2473      isTopic: isTopic,
  2474  };
  2475  
  2476  },{"./sha3.js":19,"bignumber.js":"bignumber.js","utf8":85}],21:[function(require,module,exports){
  2477  module.exports={
  2478      "version": "0.20.1"
  2479  }
  2480  
  2481  },{}],22:[function(require,module,exports){
  2482  /*
  2483      This file is part of web3.js.
  2484  
  2485      web3.js is free software: you can redistribute it and/or modify
  2486      it under the terms of the GNU Lesser General Public License as published by
  2487      the Free Software Foundation, either version 3 of the License, or
  2488      (at your option) any later version.
  2489  
  2490      web3.js is distributed in the hope that it will be useful,
  2491      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2492      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2493      GNU Lesser General Public License for more details.
  2494  
  2495      You should have received a copy of the GNU Lesser General Public License
  2496      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2497  */
  2498  /**
  2499   * @file web3.js
  2500   * @authors:
  2501   *   Jeffrey Wilcke <jeff@ethdev.com>
  2502   *   Marek Kotewicz <marek@ethdev.com>
  2503   *   Marian Oancea <marian@ethdev.com>
  2504   *   Fabian Vogelsteller <fabian@ethdev.com>
  2505   *   Gav Wood <g@ethdev.com>
  2506   * @date 2014
  2507   */
  2508  
  2509  var RequestManager = require('./web3/requestmanager');
  2510  var Iban = require('./web3/iban');
  2511  var Zond = require('./web3/methods/zond');
  2512  var DB = require('./web3/methods/db');
  2513  var Shh = require('./web3/methods/shh');
  2514  var Net = require('./web3/methods/net');
  2515  var Personal = require('./web3/methods/personal');
  2516  var Swarm = require('./web3/methods/swarm');
  2517  var Settings = require('./web3/settings');
  2518  var version = require('./version.json');
  2519  var utils = require('./utils/utils');
  2520  var sha3 = require('./utils/sha3');
  2521  var extend = require('./web3/extend');
  2522  var Batch = require('./web3/batch');
  2523  var Property = require('./web3/property');
  2524  var HttpProvider = require('./web3/httpprovider');
  2525  var IpcProvider = require('./web3/ipcprovider');
  2526  var BigNumber = require('bignumber.js');
  2527  
  2528  
  2529  
  2530  function Web3 (provider) {
  2531      this._requestManager = new RequestManager(provider);
  2532      this.currentProvider = provider;
  2533      this.zond = new Zond(this);
  2534      this.db = new DB(this);
  2535      this.shh = new Shh(this);
  2536      this.net = new Net(this);
  2537      this.personal = new Personal(this);
  2538      this.bzz = new Swarm(this);
  2539      this.settings = new Settings();
  2540      this.version = {
  2541          api: version.version
  2542      };
  2543      this.providers = {
  2544          HttpProvider: HttpProvider,
  2545          IpcProvider: IpcProvider
  2546      };
  2547      this._extend = extend(this);
  2548      this._extend({
  2549          properties: properties()
  2550      });
  2551  }
  2552  
  2553  // expose providers on the class
  2554  Web3.providers = {
  2555      HttpProvider: HttpProvider,
  2556      IpcProvider: IpcProvider
  2557  };
  2558  
  2559  Web3.prototype.setProvider = function (provider) {
  2560      this._requestManager.setProvider(provider);
  2561      this.currentProvider = provider;
  2562  };
  2563  
  2564  Web3.prototype.reset = function (keepIsSyncing) {
  2565      this._requestManager.reset(keepIsSyncing);
  2566      this.settings = new Settings();
  2567  };
  2568  
  2569  Web3.prototype.BigNumber = BigNumber;
  2570  Web3.prototype.toHex = utils.toHex;
  2571  Web3.prototype.toAscii = utils.toAscii;
  2572  Web3.prototype.toUtf8 = utils.toUtf8;
  2573  Web3.prototype.fromAscii = utils.fromAscii;
  2574  Web3.prototype.fromUtf8 = utils.fromUtf8;
  2575  Web3.prototype.toDecimal = utils.toDecimal;
  2576  Web3.prototype.fromDecimal = utils.fromDecimal;
  2577  Web3.prototype.toBigNumber = utils.toBigNumber;
  2578  Web3.prototype.toWei = utils.toWei;
  2579  Web3.prototype.fromWei = utils.fromWei;
  2580  Web3.prototype.isAddress = utils.isAddress;
  2581  Web3.prototype.isChecksumAddress = utils.isChecksumAddress;
  2582  Web3.prototype.toChecksumAddress = utils.toChecksumAddress;
  2583  Web3.prototype.isIBAN = utils.isIBAN;
  2584  Web3.prototype.padLeft = utils.padLeft;
  2585  Web3.prototype.padRight = utils.padRight;
  2586  
  2587  
  2588  Web3.prototype.sha3 = function(string, options) {
  2589      return '0x' + sha3(string, options);
  2590  };
  2591  
  2592  /**
  2593   * Transforms direct icap to address
  2594   */
  2595  Web3.prototype.fromICAP = function (icap) {
  2596      var iban = new Iban(icap);
  2597      return iban.address();
  2598  };
  2599  
  2600  var properties = function () {
  2601      return [
  2602          new Property({
  2603              name: 'version.node',
  2604              getter: 'web3_clientVersion'
  2605          }),
  2606          new Property({
  2607              name: 'version.network',
  2608              getter: 'net_version',
  2609              inputFormatter: utils.toDecimal
  2610          }),
  2611          new Property({
  2612              name: 'version.ethereum',
  2613              getter: 'zond_protocolVersion',
  2614              inputFormatter: utils.toDecimal
  2615          }),
  2616          new Property({
  2617              name: 'version.whisper',
  2618              getter: 'shh_version',
  2619              inputFormatter: utils.toDecimal
  2620          })
  2621      ];
  2622  };
  2623  
  2624  Web3.prototype.isConnected = function(){
  2625      return (this.currentProvider && this.currentProvider.isConnected());
  2626  };
  2627  
  2628  Web3.prototype.createBatch = function () {
  2629      return new Batch(this);
  2630  };
  2631  
  2632  module.exports = Web3;
  2633  
  2634  
  2635  },{"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/extend":28,"./web3/httpprovider":32,"./web3/iban":33,"./web3/ipcprovider":34,"./web3/methods/db":37,"./web3/methods/zond":38,"./web3/methods/net":39,"./web3/methods/personal":40,"./web3/methods/shh":41,"./web3/methods/swarm":42,"./web3/property":45,"./web3/requestmanager":46,"./web3/settings":47,"bignumber.js":"bignumber.js"}],23:[function(require,module,exports){
  2636  /*
  2637      This file is part of web3.js.
  2638  
  2639      web3.js is free software: you can redistribute it and/or modify
  2640      it under the terms of the GNU Lesser General Public License as published by
  2641      the Free Software Foundation, either version 3 of the License, or
  2642      (at your option) any later version.
  2643  
  2644      web3.js is distributed in the hope that it will be useful,
  2645      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2646      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2647      GNU Lesser General Public License for more details.
  2648  
  2649      You should have received a copy of the GNU Lesser General Public License
  2650      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2651  */
  2652  /**
  2653   * @file allevents.js
  2654   * @author Marek Kotewicz <marek@ethdev.com>
  2655   * @date 2014
  2656   */
  2657  
  2658  var sha3 = require('../utils/sha3');
  2659  var SolidityEvent = require('./event');
  2660  var formatters = require('./formatters');
  2661  var utils = require('../utils/utils');
  2662  var Filter = require('./filter');
  2663  var watches = require('./methods/watches');
  2664  
  2665  var AllSolidityEvents = function (requestManager, json, address) {
  2666      this._requestManager = requestManager;
  2667      this._json = json;
  2668      this._address = address;
  2669  };
  2670  
  2671  AllSolidityEvents.prototype.encode = function (options) {
  2672      options = options || {};
  2673      var result = {};
  2674  
  2675      ['fromBlock', 'toBlock'].filter(function (f) {
  2676          return options[f] !== undefined;
  2677      }).forEach(function (f) {
  2678          result[f] = formatters.inputBlockNumberFormatter(options[f]);
  2679      });
  2680  
  2681      result.address = this._address;
  2682  
  2683      return result;
  2684  };
  2685  
  2686  AllSolidityEvents.prototype.decode = function (data) {
  2687      data.data = data.data || '';
  2688      data.topics = data.topics || [];
  2689  
  2690      var eventTopic = data.topics[0].slice(2);
  2691      var match = this._json.filter(function (j) {
  2692          return eventTopic === sha3(utils.transformToFullName(j));
  2693      })[0];
  2694  
  2695      if (!match) { // cannot find matching event?
  2696          console.warn('cannot find event for log');
  2697          return data;
  2698      }
  2699  
  2700      var event = new SolidityEvent(this._requestManager, match, this._address);
  2701      return event.decode(data);
  2702  };
  2703  
  2704  AllSolidityEvents.prototype.execute = function (options, callback) {
  2705  
  2706      if (utils.isFunction(arguments[arguments.length - 1])) {
  2707          callback = arguments[arguments.length - 1];
  2708          if(arguments.length === 1)
  2709              options = null;
  2710      }
  2711  
  2712      var o = this.encode(options);
  2713      var formatter = this.decode.bind(this);
  2714      return new Filter(o, 'zond', this._requestManager, watches.zond(), formatter, callback);
  2715  };
  2716  
  2717  AllSolidityEvents.prototype.attachToContract = function (contract) {
  2718      var execute = this.execute.bind(this);
  2719      contract.allEvents = execute;
  2720  };
  2721  
  2722  module.exports = AllSolidityEvents;
  2723  
  2724  
  2725  },{"../utils/sha3":19,"../utils/utils":20,"./event":27,"./filter":29,"./formatters":30,"./methods/watches":43}],24:[function(require,module,exports){
  2726  /*
  2727      This file is part of web3.js.
  2728  
  2729      web3.js is free software: you can redistribute it and/or modify
  2730      it under the terms of the GNU Lesser General Public License as published by
  2731      the Free Software Foundation, either version 3 of the License, or
  2732      (at your option) any later version.
  2733  
  2734      web3.js is distributed in the hope that it will be useful,
  2735      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2736      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2737      GNU Lesser General Public License for more details.
  2738  
  2739      You should have received a copy of the GNU Lesser General Public License
  2740      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2741  */
  2742  /** 
  2743   * @file batch.js
  2744   * @author Marek Kotewicz <marek@ethdev.com>
  2745   * @date 2015
  2746   */
  2747  
  2748  var Jsonrpc = require('./jsonrpc');
  2749  var errors = require('./errors');
  2750  
  2751  var Batch = function (web3) {
  2752      this.requestManager = web3._requestManager;
  2753      this.requests = [];
  2754  };
  2755  
  2756  /**
  2757   * Should be called to add create new request to batch request
  2758   *
  2759   * @method add
  2760   * @param {Object} jsonrpc requet object
  2761   */
  2762  Batch.prototype.add = function (request) {
  2763      this.requests.push(request);
  2764  };
  2765  
  2766  /**
  2767   * Should be called to execute batch request
  2768   *
  2769   * @method execute
  2770   */
  2771  Batch.prototype.execute = function () {
  2772      var requests = this.requests;
  2773      this.requestManager.sendBatch(requests, function (err, results) {
  2774          results = results || [];
  2775          requests.map(function (request, index) {
  2776              return results[index] || {};
  2777          }).forEach(function (result, index) {
  2778              if (requests[index].callback) {
  2779  
  2780                  if (!Jsonrpc.isValidResponse(result)) {
  2781                      return requests[index].callback(errors.InvalidResponse(result));
  2782                  }
  2783  
  2784                  requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result));
  2785              }
  2786          });
  2787      }); 
  2788  };
  2789  
  2790  module.exports = Batch;
  2791  
  2792  
  2793  },{"./errors":26,"./jsonrpc":35}],25:[function(require,module,exports){
  2794  /*
  2795      This file is part of web3.js.
  2796  
  2797      web3.js is free software: you can redistribute it and/or modify
  2798      it under the terms of the GNU Lesser General Public License as published by
  2799      the Free Software Foundation, either version 3 of the License, or
  2800      (at your option) any later version.
  2801  
  2802      web3.js is distributed in the hope that it will be useful,
  2803      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2804      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2805      GNU Lesser General Public License for more details.
  2806  
  2807      You should have received a copy of the GNU Lesser General Public License
  2808      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2809  */
  2810  /**
  2811   * @file contract.js
  2812   * @author Marek Kotewicz <marek@ethdev.com>
  2813   * @date 2014
  2814   */
  2815  
  2816  var utils = require('../utils/utils');
  2817  var coder = require('../solidity/coder');
  2818  var SolidityEvent = require('./event');
  2819  var SolidityFunction = require('./function');
  2820  var AllEvents = require('./allevents');
  2821  
  2822  /**
  2823   * Should be called to encode constructor params
  2824   *
  2825   * @method encodeConstructorParams
  2826   * @param {Array} abi
  2827   * @param {Array} constructor params
  2828   */
  2829  var encodeConstructorParams = function (abi, params) {
  2830      return abi.filter(function (json) {
  2831          return json.type === 'constructor' && json.inputs.length === params.length;
  2832      }).map(function (json) {
  2833          return json.inputs.map(function (input) {
  2834              return input.type;
  2835          });
  2836      }).map(function (types) {
  2837          return coder.encodeParams(types, params);
  2838      })[0] || '';
  2839  };
  2840  
  2841  /**
  2842   * Should be called to add functions to contract object
  2843   *
  2844   * @method addFunctionsToContract
  2845   * @param {Contract} contract
  2846   * @param {Array} abi
  2847   */
  2848  var addFunctionsToContract = function (contract) {
  2849      contract.abi.filter(function (json) {
  2850          return json.type === 'function';
  2851      }).map(function (json) {
  2852          return new SolidityFunction(contract._zond, json, contract.address);
  2853      }).forEach(function (f) {
  2854          f.attachToContract(contract);
  2855      });
  2856  };
  2857  
  2858  /**
  2859   * Should be called to add events to contract object
  2860   *
  2861   * @method addEventsToContract
  2862   * @param {Contract} contract
  2863   * @param {Array} abi
  2864   */
  2865  var addEventsToContract = function (contract) {
  2866      var events = contract.abi.filter(function (json) {
  2867          return json.type === 'event';
  2868      });
  2869  
  2870      var All = new AllEvents(contract._zond._requestManager, events, contract.address);
  2871      All.attachToContract(contract);
  2872  
  2873      events.map(function (json) {
  2874          return new SolidityEvent(contract._zond._requestManager, json, contract.address);
  2875      }).forEach(function (e) {
  2876          e.attachToContract(contract);
  2877      });
  2878  };
  2879  
  2880  
  2881  /**
  2882   * Should be called to check if the contract gets properly deployed on the blockchain.
  2883   *
  2884   * @method checkForContractAddress
  2885   * @param {Object} contract
  2886   * @param {Function} callback
  2887   * @returns {Undefined}
  2888   */
  2889  var checkForContractAddress = function(contract, callback){
  2890      var count = 0,
  2891          callbackFired = false;
  2892  
  2893      // wait for receipt
  2894      var filter = contract._zond.filter('latest', function(e){
  2895          if (!e && !callbackFired) {
  2896              count++;
  2897  
  2898              // stop watching after 50 blocks (timeout)
  2899              if (count > 50) {
  2900  
  2901                  filter.stopWatching(function() {});
  2902                  callbackFired = true;
  2903  
  2904                  if (callback)
  2905                      callback(new Error('Contract transaction couldn\'t be found after 50 blocks'));
  2906                  else
  2907                      throw new Error('Contract transaction couldn\'t be found after 50 blocks');
  2908  
  2909  
  2910              } else {
  2911  
  2912                  contract._zond.getTransactionReceipt(contract.transactionHash, function(e, receipt){
  2913                      if(receipt && !callbackFired) {
  2914  
  2915                          contract._zond.getCode(receipt.contractAddress, function(e, code){
  2916                              /*jshint maxcomplexity: 6 */
  2917  
  2918                              if(callbackFired || !code)
  2919                                  return;
  2920  
  2921                              filter.stopWatching(function() {});
  2922                              callbackFired = true;
  2923  
  2924                              if(code.length > 3) {
  2925  
  2926                                  // console.log('Contract code deployed!');
  2927  
  2928                                  contract.address = receipt.contractAddress;
  2929  
  2930                                  // attach events and methods again after we have
  2931                                  addFunctionsToContract(contract);
  2932                                  addEventsToContract(contract);
  2933  
  2934                                  // call callback for the second time
  2935                                  if(callback)
  2936                                      callback(null, contract);
  2937  
  2938                              } else {
  2939                                  if(callback)
  2940                                      callback(new Error('The contract code couldn\'t be stored, please check your gas amount.'));
  2941                                  else
  2942                                      throw new Error('The contract code couldn\'t be stored, please check your gas amount.');
  2943                              }
  2944                          });
  2945                      }
  2946                  });
  2947              }
  2948          }
  2949      });
  2950  };
  2951  
  2952  /**
  2953   * Should be called to create new ContractFactory instance
  2954   *
  2955   * @method ContractFactory
  2956   * @param {Array} abi
  2957   */
  2958  var ContractFactory = function (zond, abi) {
  2959      this.zond = zond;
  2960      this.abi = abi;
  2961  
  2962      /**
  2963       * Should be called to create new contract on a blockchain
  2964       *
  2965       * @method new
  2966       * @param {Any} contract constructor param1 (optional)
  2967       * @param {Any} contract constructor param2 (optional)
  2968       * @param {Object} contract transaction object (required)
  2969       * @param {Function} callback
  2970       * @returns {Contract} returns contract instance
  2971       */
  2972      this.new = function () {
  2973          /*jshint maxcomplexity: 7 */
  2974          
  2975          var contract = new Contract(this.zond, this.abi);
  2976  
  2977          // parse arguments
  2978          var options = {}; // required!
  2979          var callback;
  2980  
  2981          var args = Array.prototype.slice.call(arguments);
  2982          if (utils.isFunction(args[args.length - 1])) {
  2983              callback = args.pop();
  2984          }
  2985  
  2986          var last = args[args.length - 1];
  2987          if (utils.isObject(last) && !utils.isArray(last)) {
  2988              options = args.pop();
  2989          }
  2990  
  2991          if (options.value > 0) {
  2992              var constructorAbi = abi.filter(function (json) {
  2993                  return json.type === 'constructor' && json.inputs.length === args.length;
  2994              })[0] || {};
  2995  
  2996              if (!constructorAbi.payable) {
  2997                  throw new Error('Cannot send value to non-payable constructor');
  2998              }
  2999          }
  3000  
  3001          var bytes = encodeConstructorParams(this.abi, args);
  3002          options.data += bytes;
  3003  
  3004          if (callback) {
  3005  
  3006              // wait for the contract address and check if the code was deployed
  3007              this.zond.sendTransaction(options, function (err, hash) {
  3008                  if (err) {
  3009                      callback(err);
  3010                  } else {
  3011                      // add the transaction hash
  3012                      contract.transactionHash = hash;
  3013  
  3014                      // call callback for the first time
  3015                      callback(null, contract);
  3016  
  3017                      checkForContractAddress(contract, callback);
  3018                  }
  3019              });
  3020          } else {
  3021              var hash = this.zond.sendTransaction(options);
  3022              // add the transaction hash
  3023              contract.transactionHash = hash;
  3024              checkForContractAddress(contract);
  3025          }
  3026  
  3027          return contract;
  3028      };
  3029  
  3030      this.new.getData = this.getData.bind(this);
  3031  };
  3032  
  3033  /**
  3034   * Should be called to create new ContractFactory
  3035   *
  3036   * @method contract
  3037   * @param {Array} abi
  3038   * @returns {ContractFactory} new contract factory
  3039   */
  3040  //var contract = function (abi) {
  3041      //return new ContractFactory(abi);
  3042  //};
  3043  
  3044  
  3045  
  3046  /**
  3047   * Should be called to get access to existing contract on a blockchain
  3048   *
  3049   * @method at
  3050   * @param {Address} contract address (required)
  3051   * @param {Function} callback {optional)
  3052   * @returns {Contract} returns contract if no callback was passed,
  3053   * otherwise calls callback function (err, contract)
  3054   */
  3055  ContractFactory.prototype.at = function (address, callback) {
  3056      var contract = new Contract(this.zond, this.abi, address);
  3057  
  3058      // this functions are not part of prototype,
  3059      // because we don't want to spoil the interface
  3060      addFunctionsToContract(contract);
  3061      addEventsToContract(contract);
  3062  
  3063      if (callback) {
  3064          callback(null, contract);
  3065      }
  3066      return contract;
  3067  };
  3068  
  3069  /**
  3070   * Gets the data, which is data to deploy plus constructor params
  3071   *
  3072   * @method getData
  3073   */
  3074  ContractFactory.prototype.getData = function () {
  3075      var options = {}; // required!
  3076      var args = Array.prototype.slice.call(arguments);
  3077  
  3078      var last = args[args.length - 1];
  3079      if (utils.isObject(last) && !utils.isArray(last)) {
  3080          options = args.pop();
  3081      }
  3082  
  3083      var bytes = encodeConstructorParams(this.abi, args);
  3084      options.data += bytes;
  3085  
  3086      return options.data;
  3087  };
  3088  
  3089  /**
  3090   * Should be called to create new contract instance
  3091   *
  3092   * @method Contract
  3093   * @param {Array} abi
  3094   * @param {Address} contract address
  3095   */
  3096  var Contract = function (zond, abi, address) {
  3097      this._zond = zond;
  3098      this.transactionHash = null;
  3099      this.address = address;
  3100      this.abi = abi;
  3101  };
  3102  
  3103  module.exports = ContractFactory;
  3104  
  3105  },{"../solidity/coder":7,"../utils/utils":20,"./allevents":23,"./event":27,"./function":31}],26:[function(require,module,exports){
  3106  /*
  3107      This file is part of web3.js.
  3108  
  3109      web3.js is free software: you can redistribute it and/or modify
  3110      it under the terms of the GNU Lesser General Public License as published by
  3111      the Free Software Foundation, either version 3 of the License, or
  3112      (at your option) any later version.
  3113  
  3114      web3.js is distributed in the hope that it will be useful,
  3115      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3116      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3117      GNU Lesser General Public License for more details.
  3118  
  3119      You should have received a copy of the GNU Lesser General Public License
  3120      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3121  */
  3122  /** 
  3123   * @file errors.js
  3124   * @author Marek Kotewicz <marek@ethdev.com>
  3125   * @date 2015
  3126   */
  3127  
  3128  module.exports = {
  3129      InvalidNumberOfSolidityArgs: function () {
  3130          return new Error('Invalid number of arguments to Solidity function');
  3131      },
  3132      InvalidNumberOfRPCParams: function () {
  3133          return new Error('Invalid number of input parameters to RPC method');
  3134      },
  3135      InvalidConnection: function (host){
  3136          return new Error('CONNECTION ERROR: Couldn\'t connect to node '+ host +'.');
  3137      },
  3138      InvalidProvider: function () {
  3139          return new Error('Provider not set or invalid');
  3140      },
  3141      InvalidResponse: function (result){
  3142          var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: ' + JSON.stringify(result);
  3143          return new Error(message);
  3144      },
  3145      ConnectionTimeout: function (ms){
  3146          return new Error('CONNECTION TIMEOUT: timeout of ' + ms + ' ms achived');
  3147      }
  3148  };
  3149  
  3150  },{}],27:[function(require,module,exports){
  3151  /*
  3152      This file is part of web3.js.
  3153  
  3154      web3.js is free software: you can redistribute it and/or modify
  3155      it under the terms of the GNU Lesser General Public License as published by
  3156      the Free Software Foundation, either version 3 of the License, or
  3157      (at your option) any later version.
  3158  
  3159      web3.js is distributed in the hope that it will be useful,
  3160      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3161      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3162      GNU Lesser General Public License for more details.
  3163  
  3164      You should have received a copy of the GNU Lesser General Public License
  3165      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3166  */
  3167  /**
  3168   * @file event.js
  3169   * @author Marek Kotewicz <marek@ethdev.com>
  3170   * @date 2014
  3171   */
  3172  
  3173  var utils = require('../utils/utils');
  3174  var coder = require('../solidity/coder');
  3175  var formatters = require('./formatters');
  3176  var sha3 = require('../utils/sha3');
  3177  var Filter = require('./filter');
  3178  var watches = require('./methods/watches');
  3179  
  3180  /**
  3181   * This prototype should be used to create event filters
  3182   */
  3183  var SolidityEvent = function (requestManager, json, address) {
  3184      this._requestManager = requestManager;
  3185      this._params = json.inputs;
  3186      this._name = utils.transformToFullName(json);
  3187      this._address = address;
  3188      this._anonymous = json.anonymous;
  3189  };
  3190  
  3191  /**
  3192   * Should be used to get filtered param types
  3193   *
  3194   * @method types
  3195   * @param {Bool} decide if returned typed should be indexed
  3196   * @return {Array} array of types
  3197   */
  3198  SolidityEvent.prototype.types = function (indexed) {
  3199      return this._params.filter(function (i) {
  3200          return i.indexed === indexed;
  3201      }).map(function (i) {
  3202          return i.type;
  3203      });
  3204  };
  3205  
  3206  /**
  3207   * Should be used to get event display name
  3208   *
  3209   * @method displayName
  3210   * @return {String} event display name
  3211   */
  3212  SolidityEvent.prototype.displayName = function () {
  3213      return utils.extractDisplayName(this._name);
  3214  };
  3215  
  3216  /**
  3217   * Should be used to get event type name
  3218   *
  3219   * @method typeName
  3220   * @return {String} event type name
  3221   */
  3222  SolidityEvent.prototype.typeName = function () {
  3223      return utils.extractTypeName(this._name);
  3224  };
  3225  
  3226  /**
  3227   * Should be used to get event signature
  3228   *
  3229   * @method signature
  3230   * @return {String} event signature
  3231   */
  3232  SolidityEvent.prototype.signature = function () {
  3233      return sha3(this._name);
  3234  };
  3235  
  3236  /**
  3237   * Should be used to encode indexed params and options to one final object
  3238   *
  3239   * @method encode
  3240   * @param {Object} indexed
  3241   * @param {Object} options
  3242   * @return {Object} everything combined together and encoded
  3243   */
  3244  SolidityEvent.prototype.encode = function (indexed, options) {
  3245      indexed = indexed || {};
  3246      options = options || {};
  3247      var result = {};
  3248  
  3249      ['fromBlock', 'toBlock'].filter(function (f) {
  3250          return options[f] !== undefined;
  3251      }).forEach(function (f) {
  3252          result[f] = formatters.inputBlockNumberFormatter(options[f]);
  3253      });
  3254  
  3255      result.topics = [];
  3256  
  3257      result.address = this._address;
  3258      if (!this._anonymous) {
  3259          result.topics.push('0x' + this.signature());
  3260      }
  3261  
  3262      var indexedTopics = this._params.filter(function (i) {
  3263          return i.indexed === true;
  3264      }).map(function (i) {
  3265          var value = indexed[i.name];
  3266          if (value === undefined || value === null) {
  3267              return null;
  3268          }
  3269  
  3270          if (utils.isArray(value)) {
  3271              return value.map(function (v) {
  3272                  return '0x' + coder.encodeParam(i.type, v);
  3273              });
  3274          }
  3275          return '0x' + coder.encodeParam(i.type, value);
  3276      });
  3277  
  3278      result.topics = result.topics.concat(indexedTopics);
  3279  
  3280      return result;
  3281  };
  3282  
  3283  /**
  3284   * Should be used to decode indexed params and options
  3285   *
  3286   * @method decode
  3287   * @param {Object} data
  3288   * @return {Object} result object with decoded indexed && not indexed params
  3289   */
  3290  SolidityEvent.prototype.decode = function (data) {
  3291  
  3292      data.data = data.data || '';
  3293      data.topics = data.topics || [];
  3294  
  3295      var argTopics = this._anonymous ? data.topics : data.topics.slice(1);
  3296      var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join("");
  3297      var indexedParams = coder.decodeParams(this.types(true), indexedData);
  3298  
  3299      var notIndexedData = data.data.slice(2);
  3300      var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData);
  3301  
  3302      var result = formatters.outputLogFormatter(data);
  3303      result.event = this.displayName();
  3304      result.address = data.address;
  3305  
  3306      result.args = this._params.reduce(function (acc, current) {
  3307          acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift();
  3308          return acc;
  3309      }, {});
  3310  
  3311      delete result.data;
  3312      delete result.topics;
  3313  
  3314      return result;
  3315  };
  3316  
  3317  /**
  3318   * Should be used to create new filter object from event
  3319   *
  3320   * @method execute
  3321   * @param {Object} indexed
  3322   * @param {Object} options
  3323   * @return {Object} filter object
  3324   */
  3325  SolidityEvent.prototype.execute = function (indexed, options, callback) {
  3326  
  3327      if (utils.isFunction(arguments[arguments.length - 1])) {
  3328          callback = arguments[arguments.length - 1];
  3329          if(arguments.length === 2)
  3330              options = null;
  3331          if(arguments.length === 1) {
  3332              options = null;
  3333              indexed = {};
  3334          }
  3335      }
  3336  
  3337      var o = this.encode(indexed, options);
  3338      var formatter = this.decode.bind(this);
  3339      return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback);
  3340  };
  3341  
  3342  /**
  3343   * Should be used to attach event to contract object
  3344   *
  3345   * @method attachToContract
  3346   * @param {Contract}
  3347   */
  3348  SolidityEvent.prototype.attachToContract = function (contract) {
  3349      var execute = this.execute.bind(this);
  3350      var displayName = this.displayName();
  3351      if (!contract[displayName]) {
  3352          contract[displayName] = execute;
  3353      }
  3354      contract[displayName][this.typeName()] = this.execute.bind(this, contract);
  3355  };
  3356  
  3357  module.exports = SolidityEvent;
  3358  
  3359  
  3360  },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./filter":29,"./formatters":30,"./methods/watches":43}],28:[function(require,module,exports){
  3361  var formatters = require('./formatters');
  3362  var utils = require('./../utils/utils');
  3363  var Method = require('./method');
  3364  var Property = require('./property');
  3365  
  3366  // TODO: refactor, so the input params are not altered.
  3367  // it's necessary to make same 'extension' work with multiple providers
  3368  var extend = function (web3) {
  3369      /* jshint maxcomplexity:5 */
  3370      var ex = function (extension) {
  3371  
  3372          var extendedObject;
  3373          if (extension.property) {
  3374              if (!web3[extension.property]) {
  3375                  web3[extension.property] = {};
  3376              }
  3377              extendedObject = web3[extension.property];
  3378          } else {
  3379              extendedObject = web3;
  3380          }
  3381  
  3382          if (extension.methods) {
  3383              extension.methods.forEach(function (method) {
  3384                  method.attachToObject(extendedObject);
  3385                  method.setRequestManager(web3._requestManager);
  3386              });
  3387          }
  3388  
  3389          if (extension.properties) {
  3390              extension.properties.forEach(function (property) {
  3391                  property.attachToObject(extendedObject);
  3392                  property.setRequestManager(web3._requestManager);
  3393              });
  3394          }
  3395      };
  3396  
  3397      ex.formatters = formatters; 
  3398      ex.utils = utils;
  3399      ex.Method = Method;
  3400      ex.Property = Property;
  3401  
  3402      return ex;
  3403  };
  3404  
  3405  
  3406  
  3407  module.exports = extend;
  3408  
  3409  
  3410  },{"./../utils/utils":20,"./formatters":30,"./method":36,"./property":45}],29:[function(require,module,exports){
  3411  /*
  3412      This file is part of web3.js.
  3413  
  3414      web3.js is free software: you can redistribute it and/or modify
  3415      it under the terms of the GNU Lesser General Public License as published by
  3416      the Free Software Foundation, either version 3 of the License, or
  3417      (at your option) any later version.
  3418  
  3419      web3.js is distributed in the hope that it will be useful,
  3420      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3421      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3422      GNU Lesser General Public License for more details.
  3423  
  3424      You should have received a copy of the GNU Lesser General Public License
  3425      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3426  */
  3427  /** @file filter.js
  3428   * @authors:
  3429   *   Jeffrey Wilcke <jeff@ethdev.com>
  3430   *   Marek Kotewicz <marek@ethdev.com>
  3431   *   Marian Oancea <marian@ethdev.com>
  3432   *   Fabian Vogelsteller <fabian@ethdev.com>
  3433   *   Gav Wood <g@ethdev.com>
  3434   * @date 2014
  3435   */
  3436  
  3437  var formatters = require('./formatters');
  3438  var utils = require('../utils/utils');
  3439  
  3440  /**
  3441  * Converts a given topic to a hex string, but also allows null values.
  3442  *
  3443  * @param {Mixed} value
  3444  * @return {String}
  3445  */
  3446  var toTopic = function(value){
  3447  
  3448      if(value === null || typeof value === 'undefined')
  3449          return null;
  3450  
  3451      value = String(value);
  3452  
  3453      if(value.indexOf('0x') === 0)
  3454          return value;
  3455      else
  3456          return utils.fromUtf8(value);
  3457  };
  3458  
  3459  /// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones
  3460  /// @param should be string or object
  3461  /// @returns options string or object
  3462  var getOptions = function (options, type) {
  3463      /*jshint maxcomplexity: 6 */
  3464  
  3465      if (utils.isString(options)) {
  3466          return options;
  3467      }
  3468  
  3469      options = options || {};
  3470  
  3471  
  3472      switch(type) {
  3473          case 'eth':
  3474  
  3475              // make sure topics, get converted to hex
  3476              options.topics = options.topics || [];
  3477              options.topics = options.topics.map(function(topic){
  3478                  return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic);
  3479              });
  3480  
  3481              return {
  3482                  topics: options.topics,
  3483                  from: options.from,
  3484                  to: options.to,
  3485                  address: options.address,
  3486                  fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock),
  3487                  toBlock: formatters.inputBlockNumberFormatter(options.toBlock)
  3488              };
  3489          case 'shh':
  3490              return options;
  3491      }
  3492  };
  3493  
  3494  /**
  3495  Adds the callback and sets up the methods, to iterate over the results.
  3496  
  3497  @method getLogsAtStart
  3498  @param {Object} self
  3499  @param {function} callback
  3500  */
  3501  var getLogsAtStart = function(self, callback){
  3502      // call getFilterLogs for the first watch callback start
  3503      if (!utils.isString(self.options)) {
  3504          self.get(function (err, messages) {
  3505              // don't send all the responses to all the watches again... just to self one
  3506              if (err) {
  3507                  callback(err);
  3508              }
  3509  
  3510              if(utils.isArray(messages)) {
  3511                  messages.forEach(function (message) {
  3512                      callback(null, message);
  3513                  });
  3514              }
  3515          });
  3516      }
  3517  };
  3518  
  3519  /**
  3520  Adds the callback and sets up the methods, to iterate over the results.
  3521  
  3522  @method pollFilter
  3523  @param {Object} self
  3524  */
  3525  var pollFilter = function(self) {
  3526  
  3527      var onMessage = function (error, messages) {
  3528          if (error) {
  3529              return self.callbacks.forEach(function (callback) {
  3530                  callback(error);
  3531              });
  3532          }
  3533  
  3534          if(utils.isArray(messages)) {
  3535              messages.forEach(function (message) {
  3536                  message = self.formatter ? self.formatter(message) : message;
  3537                  self.callbacks.forEach(function (callback) {
  3538                      callback(null, message);
  3539                  });
  3540              });
  3541          }
  3542      };
  3543  
  3544      self.requestManager.startPolling({
  3545          method: self.implementation.poll.call,
  3546          params: [self.filterId],
  3547      }, self.filterId, onMessage, self.stopWatching.bind(self));
  3548  
  3549  };
  3550  
  3551  var Filter = function (options, type, requestManager, methods, formatter, callback, filterCreationErrorCallback) {
  3552      var self = this;
  3553      var implementation = {};
  3554      methods.forEach(function (method) {
  3555          method.setRequestManager(requestManager);
  3556          method.attachToObject(implementation);
  3557      });
  3558      this.requestManager = requestManager;
  3559      this.options = getOptions(options, type);
  3560      this.implementation = implementation;
  3561      this.filterId = null;
  3562      this.callbacks = [];
  3563      this.getLogsCallbacks = [];
  3564      this.pollFilters = [];
  3565      this.formatter = formatter;
  3566      this.implementation.newFilter(this.options, function(error, id){
  3567          if(error) {
  3568              self.callbacks.forEach(function(cb){
  3569                  cb(error);
  3570              });
  3571              if (typeof filterCreationErrorCallback === 'function') {
  3572                filterCreationErrorCallback(error);
  3573              }
  3574          } else {
  3575              self.filterId = id;
  3576  
  3577              // check if there are get pending callbacks as a consequence
  3578              // of calling get() with filterId unassigned.
  3579              self.getLogsCallbacks.forEach(function (cb){
  3580                  self.get(cb);
  3581              });
  3582              self.getLogsCallbacks = [];
  3583  
  3584              // get filter logs for the already existing watch calls
  3585              self.callbacks.forEach(function(cb){
  3586                  getLogsAtStart(self, cb);
  3587              });
  3588              if(self.callbacks.length > 0)
  3589                  pollFilter(self);
  3590  
  3591              // start to watch immediately
  3592              if(typeof callback === 'function') {
  3593                  return self.watch(callback);
  3594              }
  3595          }
  3596      });
  3597  
  3598      return this;
  3599  };
  3600  
  3601  Filter.prototype.watch = function (callback) {
  3602      this.callbacks.push(callback);
  3603  
  3604      if(this.filterId) {
  3605          getLogsAtStart(this, callback);
  3606          pollFilter(this);
  3607      }
  3608  
  3609      return this;
  3610  };
  3611  
  3612  Filter.prototype.stopWatching = function (callback) {
  3613      this.requestManager.stopPolling(this.filterId);
  3614      this.callbacks = [];
  3615      // remove filter async
  3616      if (callback) {
  3617          this.implementation.uninstallFilter(this.filterId, callback);
  3618      } else {
  3619          return this.implementation.uninstallFilter(this.filterId);
  3620      }
  3621  };
  3622  
  3623  Filter.prototype.get = function (callback) {
  3624      var self = this;
  3625      if (utils.isFunction(callback)) {
  3626          if (this.filterId === null) {
  3627              // If filterId is not set yet, call it back
  3628              // when newFilter() assigns it.
  3629              this.getLogsCallbacks.push(callback);
  3630          } else {
  3631              this.implementation.getLogs(this.filterId, function(err, res){
  3632                  if (err) {
  3633                      callback(err);
  3634                  } else {
  3635                      callback(null, res.map(function (log) {
  3636                          return self.formatter ? self.formatter(log) : log;
  3637                      }));
  3638                  }
  3639              });
  3640          }
  3641      } else {
  3642          if (this.filterId === null) {
  3643              throw new Error('Filter ID Error: filter().get() can\'t be chained synchronous, please provide a callback for the get() method.');
  3644          }
  3645          var logs = this.implementation.getLogs(this.filterId);
  3646          return logs.map(function (log) {
  3647              return self.formatter ? self.formatter(log) : log;
  3648          });
  3649      }
  3650  
  3651      return this;
  3652  };
  3653  
  3654  module.exports = Filter;
  3655  
  3656  
  3657  },{"../utils/utils":20,"./formatters":30}],30:[function(require,module,exports){
  3658  'use strict'
  3659  
  3660  /*
  3661      This file is part of web3.js.
  3662  
  3663      web3.js is free software: you can redistribute it and/or modify
  3664      it under the terms of the GNU Lesser General Public License as published by
  3665      the Free Software Foundation, either version 3 of the License, or
  3666      (at your option) any later version.
  3667  
  3668      web3.js is distributed in the hope that it will be useful,
  3669      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3670      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3671      GNU Lesser General Public License for more details.
  3672  
  3673      You should have received a copy of the GNU Lesser General Public License
  3674      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3675  */
  3676  /**
  3677   * @file formatters.js
  3678   * @author Marek Kotewicz <marek@ethdev.com>
  3679   * @author Fabian Vogelsteller <fabian@ethdev.com>
  3680   * @date 2015
  3681   */
  3682  
  3683  var utils = require('../utils/utils');
  3684  var config = require('../utils/config');
  3685  var Iban = require('./iban');
  3686  
  3687  /**
  3688   * Should the format output to a big number
  3689   *
  3690   * @method outputBigNumberFormatter
  3691   * @param {String|Number|BigNumber}
  3692   * @returns {BigNumber} object
  3693   */
  3694  var outputBigNumberFormatter = function (number) {
  3695      return utils.toBigNumber(number);
  3696  };
  3697  
  3698  var isPredefinedBlockNumber = function (blockNumber) {
  3699      return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest' || blockNumber === 'finalized' || blockNumber === 'safe';
  3700  };
  3701  
  3702  var inputDefaultBlockNumberFormatter = function (blockNumber) {
  3703      if (blockNumber === undefined) {
  3704          return config.defaultBlock;
  3705      }
  3706      return inputBlockNumberFormatter(blockNumber);
  3707  };
  3708  
  3709  var inputBlockNumberFormatter = function (blockNumber) {
  3710      if (blockNumber === undefined) {
  3711          return undefined;
  3712      } else if (isPredefinedBlockNumber(blockNumber)) {
  3713          return blockNumber;
  3714      }
  3715      return utils.toHex(blockNumber);
  3716  };
  3717  
  3718  /**
  3719   * Formats the input of a transaction and converts all values to HEX
  3720   *
  3721   * @method inputCallFormatter
  3722   * @param {Object} transaction options
  3723   * @returns object
  3724  */
  3725  var inputCallFormatter = function (options){
  3726  
  3727      options.from = options.from || config.defaultAccount;
  3728  
  3729      if (options.from) {
  3730          options.from = inputAddressFormatter(options.from);
  3731      }
  3732  
  3733      if (options.to) { // it might be contract creation
  3734          options.to = inputAddressFormatter(options.to);
  3735      }
  3736  
  3737      ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
  3738          return options[key] !== undefined;
  3739      }).forEach(function(key){
  3740          options[key] = utils.fromDecimal(options[key]);
  3741      });
  3742  
  3743      return options;
  3744  };
  3745  
  3746  /**
  3747   * Formats the input of a transaction and converts all values to HEX
  3748   *
  3749   * @method inputTransactionFormatter
  3750   * @param {Object} transaction options
  3751   * @returns object
  3752  */
  3753  var inputTransactionFormatter = function (options){
  3754  
  3755      options.from = options.from || config.defaultAccount;
  3756      options.from = inputAddressFormatter(options.from);
  3757  
  3758      if (options.to) { // it might be contract creation
  3759          options.to = inputAddressFormatter(options.to);
  3760      }
  3761  
  3762      ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
  3763          return options[key] !== undefined;
  3764      }).forEach(function(key){
  3765          options[key] = utils.fromDecimal(options[key]);
  3766      });
  3767  
  3768      return options;
  3769  };
  3770  
  3771  /**
  3772   * Formats the output of a transaction to its proper values
  3773   *
  3774   * @method outputTransactionFormatter
  3775   * @param {Object} tx
  3776   * @returns {Object}
  3777  */
  3778  var outputTransactionFormatter = function (tx){
  3779      if(tx.blockNumber !== null)
  3780          tx.blockNumber = utils.toDecimal(tx.blockNumber);
  3781      if(tx.transactionIndex !== null)
  3782          tx.transactionIndex = utils.toDecimal(tx.transactionIndex);
  3783      tx.nonce = utils.toDecimal(tx.nonce);
  3784      tx.gas = utils.toDecimal(tx.gas);
  3785      tx.gasPrice = utils.toBigNumber(tx.gasPrice);
  3786      if(tx.maxFeePerGas !== undefined) {
  3787        tx.maxFeePerGas = utils.toBigNumber(tx.maxFeePerGas);
  3788      }
  3789      if(tx.maxPriorityFeePerGas !== undefined) {
  3790        tx.maxPriorityFeePerGas = utils.toBigNumber(tx.maxPriorityFeePerGas);
  3791      }
  3792      tx.value = utils.toBigNumber(tx.value);
  3793      return tx;
  3794  };
  3795  
  3796  /**
  3797   * Formats the output of a transaction receipt to its proper values
  3798   *
  3799   * @method outputTransactionReceiptFormatter
  3800   * @param {Object} receipt
  3801   * @returns {Object}
  3802  */
  3803  var outputTransactionReceiptFormatter = function (receipt){
  3804      if(receipt.blockNumber !== null)
  3805          receipt.blockNumber = utils.toDecimal(receipt.blockNumber);
  3806      if(receipt.transactionIndex !== null)
  3807          receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex);
  3808      receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed);
  3809      receipt.gasUsed = utils.toDecimal(receipt.gasUsed);
  3810      if(receipt.effectiveGasPrice !== undefined) {
  3811        receipt.effectiveGasPrice = utils.toBigNumber(receipt.effectiveGasPrice);
  3812      }
  3813      if(utils.isArray(receipt.logs)) {
  3814          receipt.logs = receipt.logs.map(function(log){
  3815              return outputLogFormatter(log);
  3816          });
  3817      }
  3818  
  3819      return receipt;
  3820  };
  3821  
  3822  /**
  3823   * Formats the output of a block to its proper values
  3824   *
  3825   * @method outputBlockFormatter
  3826   * @param {Object} block
  3827   * @returns {Object}
  3828  */
  3829  var outputBlockFormatter = function(block) {
  3830      // transform to number
  3831      if (block.baseFeePerGas !== undefined) {
  3832        block.baseFeePerGas = utils.toBigNumber(block.baseFeePerGas);
  3833      }
  3834      block.gasLimit = utils.toDecimal(block.gasLimit);
  3835      block.gasUsed = utils.toDecimal(block.gasUsed);
  3836      block.size = utils.toDecimal(block.size);
  3837      block.timestamp = utils.toDecimal(block.timestamp);
  3838      if(block.number !== null)
  3839          block.number = utils.toDecimal(block.number);
  3840  
  3841      block.difficulty = utils.toBigNumber(block.difficulty);
  3842      block.totalDifficulty = utils.toBigNumber(block.totalDifficulty);
  3843  
  3844      if (utils.isArray(block.transactions)) {
  3845          block.transactions.forEach(function(item){
  3846              if(!utils.isString(item))
  3847                  return outputTransactionFormatter(item);
  3848          });
  3849      }
  3850  
  3851      return block;
  3852  };
  3853  
  3854  /**
  3855   * Formats the output of a log
  3856   *
  3857   * @method outputLogFormatter
  3858   * @param {Object} log object
  3859   * @returns {Object} log
  3860  */
  3861  var outputLogFormatter = function(log) {
  3862      if(log.blockNumber)
  3863          log.blockNumber = utils.toDecimal(log.blockNumber);
  3864      if(log.transactionIndex)
  3865          log.transactionIndex = utils.toDecimal(log.transactionIndex);
  3866      if(log.logIndex)
  3867          log.logIndex = utils.toDecimal(log.logIndex);
  3868  
  3869      return log;
  3870  };
  3871  
  3872  /**
  3873   * Formats the input of a whisper post and converts all values to HEX
  3874   *
  3875   * @method inputPostFormatter
  3876   * @param {Object} transaction object
  3877   * @returns {Object}
  3878  */
  3879  var inputPostFormatter = function(post) {
  3880  
  3881      // post.payload = utils.toHex(post.payload);
  3882      post.ttl = utils.fromDecimal(post.ttl);
  3883      post.workToProve = utils.fromDecimal(post.workToProve);
  3884      post.priority = utils.fromDecimal(post.priority);
  3885  
  3886      // fallback
  3887      if (!utils.isArray(post.topics)) {
  3888          post.topics = post.topics ? [post.topics] : [];
  3889      }
  3890  
  3891      // format the following options
  3892      post.topics = post.topics.map(function(topic){
  3893          // convert only if not hex
  3894          return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic);
  3895      });
  3896  
  3897      return post;
  3898  };
  3899  
  3900  /**
  3901   * Formats the output of a received post message
  3902   *
  3903   * @method outputPostFormatter
  3904   * @param {Object}
  3905   * @returns {Object}
  3906   */
  3907  var outputPostFormatter = function(post){
  3908  
  3909      post.expiry = utils.toDecimal(post.expiry);
  3910      post.sent = utils.toDecimal(post.sent);
  3911      post.ttl = utils.toDecimal(post.ttl);
  3912      post.workProved = utils.toDecimal(post.workProved);
  3913      // post.payloadRaw = post.payload;
  3914      // post.payload = utils.toAscii(post.payload);
  3915  
  3916      // if (utils.isJson(post.payload)) {
  3917      //     post.payload = JSON.parse(post.payload);
  3918      // }
  3919  
  3920      // format the following options
  3921      if (!post.topics) {
  3922          post.topics = [];
  3923      }
  3924      post.topics = post.topics.map(function(topic){
  3925          return utils.toAscii(topic);
  3926      });
  3927  
  3928      return post;
  3929  };
  3930  
  3931  var inputAddressFormatter = function (address) {
  3932      var iban = new Iban(address);
  3933      if (iban.isValid() && iban.isDirect()) {
  3934          return '0x' + iban.address();
  3935      } else if (utils.isStrictAddress(address)) {
  3936          return address;
  3937      } else if (utils.isAddress(address)) {
  3938          return '0x' + address;
  3939      }
  3940      throw new Error('invalid address');
  3941  };
  3942  
  3943  
  3944  var outputSyncingFormatter = function(result) {
  3945      if (!result) {
  3946          return result;
  3947      }
  3948  
  3949      result.startingBlock = utils.toDecimal(result.startingBlock);
  3950      result.currentBlock = utils.toDecimal(result.currentBlock);
  3951      result.highestBlock = utils.toDecimal(result.highestBlock);
  3952      result.syncedAccounts = utils.toDecimal(result.syncedAccounts);
  3953      result.syncedAccountBytes = utils.toDecimal(result.syncedAccountBytes);
  3954      result.syncedBytecodes = utils.toDecimal(result.syncedBytecodes);
  3955      result.syncedBytecodeBytes = utils.toDecimal(result.syncedBytecodeBytes);
  3956      result.syncedStorage = utils.toDecimal(result.syncedStorage);
  3957      result.syncedStorageBytes = utils.toDecimal(result.syncedStorageBytes);
  3958      result.healedTrienodes = utils.toDecimal(result.healedTrienodes);
  3959      result.healedTrienodeBytes = utils.toDecimal(result.healedTrienodeBytes);
  3960      result.healedBytecodes = utils.toDecimal(result.healedBytecodes);
  3961      result.healedBytecodeBytes = utils.toDecimal(result.healedBytecodeBytes);
  3962      result.healingTrienodes = utils.toDecimal(result.healingTrienodes);
  3963      result.healingBytecode = utils.toDecimal(result.healingBytecode);
  3964  
  3965      return result;
  3966  };
  3967  
  3968  module.exports = {
  3969      inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,
  3970      inputBlockNumberFormatter: inputBlockNumberFormatter,
  3971      inputCallFormatter: inputCallFormatter,
  3972      inputTransactionFormatter: inputTransactionFormatter,
  3973      inputAddressFormatter: inputAddressFormatter,
  3974      inputPostFormatter: inputPostFormatter,
  3975      outputBigNumberFormatter: outputBigNumberFormatter,
  3976      outputTransactionFormatter: outputTransactionFormatter,
  3977      outputTransactionReceiptFormatter: outputTransactionReceiptFormatter,
  3978      outputBlockFormatter: outputBlockFormatter,
  3979      outputLogFormatter: outputLogFormatter,
  3980      outputPostFormatter: outputPostFormatter,
  3981      outputSyncingFormatter: outputSyncingFormatter
  3982  };
  3983  
  3984  
  3985  },{"../utils/config":18,"../utils/utils":20,"./iban":33}],31:[function(require,module,exports){
  3986  /*
  3987      This file is part of web3.js.
  3988  
  3989      web3.js is free software: you can redistribute it and/or modify
  3990      it under the terms of the GNU Lesser General Public License as published by
  3991      the Free Software Foundation, either version 3 of the License, or
  3992      (at your option) any later version.
  3993  
  3994      web3.js is distributed in the hope that it will be useful,
  3995      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3996      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3997      GNU Lesser General Public License for more details.
  3998  
  3999      You should have received a copy of the GNU Lesser General Public License
  4000      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4001  */
  4002  /**
  4003   * @file function.js
  4004   * @author Marek Kotewicz <marek@ethdev.com>
  4005   * @date 2015
  4006   */
  4007  
  4008  var coder = require('../solidity/coder');
  4009  var utils = require('../utils/utils');
  4010  var errors = require('./errors');
  4011  var formatters = require('./formatters');
  4012  var sha3 = require('../utils/sha3');
  4013  
  4014  /**
  4015   * This prototype should be used to call/sendTransaction to solidity functions
  4016   */
  4017  var SolidityFunction = function (zond, json, address) {
  4018      this._zond = zond;
  4019      this._inputTypes = json.inputs.map(function (i) {
  4020          return i.type;
  4021      });
  4022      this._outputTypes = json.outputs.map(function (i) {
  4023          return i.type;
  4024      });
  4025      this._constant = json.constant;
  4026      this._payable = json.payable;
  4027      this._name = utils.transformToFullName(json);
  4028      this._address = address;
  4029  };
  4030  
  4031  SolidityFunction.prototype.extractCallback = function (args) {
  4032      if (utils.isFunction(args[args.length - 1])) {
  4033          return args.pop(); // modify the args array!
  4034      }
  4035  };
  4036  
  4037  SolidityFunction.prototype.extractDefaultBlock = function (args) {
  4038      if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) {
  4039          return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array!
  4040      }
  4041  };
  4042  
  4043  /**
  4044   * Should be called to check if the number of arguments is correct
  4045   *
  4046   * @method validateArgs
  4047   * @param {Array} arguments
  4048   * @throws {Error} if it is not
  4049   */
  4050  SolidityFunction.prototype.validateArgs = function (args) {
  4051      var inputArgs = args.filter(function (a) {
  4052        // filter the options object but not arguments that are arrays
  4053        return !( (utils.isObject(a) === true) &&
  4054                  (utils.isArray(a) === false) &&
  4055                  (utils.isBigNumber(a) === false)
  4056                );
  4057      });
  4058      if (inputArgs.length !== this._inputTypes.length) {
  4059          throw errors.InvalidNumberOfSolidityArgs();
  4060      }
  4061  };
  4062  
  4063  /**
  4064   * Should be used to create payload from arguments
  4065   *
  4066   * @method toPayload
  4067   * @param {Array} solidity function params
  4068   * @param {Object} optional payload options
  4069   */
  4070  SolidityFunction.prototype.toPayload = function (args) {
  4071      var options = {};
  4072      if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {
  4073          options = args[args.length - 1];
  4074      }
  4075      this.validateArgs(args);
  4076      options.to = this._address;
  4077      options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args);
  4078      return options;
  4079  };
  4080  
  4081  /**
  4082   * Should be used to get function signature
  4083   *
  4084   * @method signature
  4085   * @return {String} function signature
  4086   */
  4087  SolidityFunction.prototype.signature = function () {
  4088      return sha3(this._name).slice(0, 8);
  4089  };
  4090  
  4091  
  4092  SolidityFunction.prototype.unpackOutput = function (output) {
  4093      if (!output) {
  4094          return;
  4095      }
  4096  
  4097      output = output.length >= 2 ? output.slice(2) : output;
  4098      var result = coder.decodeParams(this._outputTypes, output);
  4099      return result.length === 1 ? result[0] : result;
  4100  };
  4101  
  4102  /**
  4103   * Calls a contract function.
  4104   *
  4105   * @method call
  4106   * @param {...Object} Contract function arguments
  4107   * @param {function} If the last argument is a function, the contract function
  4108   *   call will be asynchronous, and the callback will be passed the
  4109   *   error and result.
  4110   * @return {String} output bytes
  4111   */
  4112  SolidityFunction.prototype.call = function () {
  4113      var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
  4114      var callback = this.extractCallback(args);
  4115      var defaultBlock = this.extractDefaultBlock(args);
  4116      var payload = this.toPayload(args);
  4117  
  4118  
  4119      if (!callback) {
  4120          var output = this._zond.call(payload, defaultBlock);
  4121          return this.unpackOutput(output);
  4122      }
  4123  
  4124      var self = this;
  4125      this._zond.call(payload, defaultBlock, function (error, output) {
  4126          if (error) return callback(error, null);
  4127  
  4128          var unpacked = null;
  4129          try {
  4130              unpacked = self.unpackOutput(output);
  4131          }
  4132          catch (e) {
  4133              error = e;
  4134          }
  4135  
  4136          callback(error, unpacked);
  4137      });
  4138  };
  4139  
  4140  /**
  4141   * Should be used to sendTransaction to solidity function
  4142   *
  4143   * @method sendTransaction
  4144   */
  4145  SolidityFunction.prototype.sendTransaction = function () {
  4146      var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
  4147      var callback = this.extractCallback(args);
  4148      var payload = this.toPayload(args);
  4149  
  4150      if (payload.value > 0 && !this._payable) {
  4151          throw new Error('Cannot send value to non-payable function');
  4152      }
  4153  
  4154      if (!callback) {
  4155          return this._zond.sendTransaction(payload);
  4156      }
  4157  
  4158      this._zond.sendTransaction(payload, callback);
  4159  };
  4160  
  4161  /**
  4162   * Should be used to estimateGas of solidity function
  4163   *
  4164   * @method estimateGas
  4165   */
  4166  SolidityFunction.prototype.estimateGas = function () {
  4167      var args = Array.prototype.slice.call(arguments);
  4168      var callback = this.extractCallback(args);
  4169      var payload = this.toPayload(args);
  4170  
  4171      if (!callback) {
  4172          return this._zond.estimateGas(payload);
  4173      }
  4174  
  4175      this._zond.estimateGas(payload, callback);
  4176  };
  4177  
  4178  /**
  4179   * Return the encoded data of the call
  4180   *
  4181   * @method getData
  4182   * @return {String} the encoded data
  4183   */
  4184  SolidityFunction.prototype.getData = function () {
  4185      var args = Array.prototype.slice.call(arguments);
  4186      var payload = this.toPayload(args);
  4187  
  4188      return payload.data;
  4189  };
  4190  
  4191  /**
  4192   * Should be used to get function display name
  4193   *
  4194   * @method displayName
  4195   * @return {String} display name of the function
  4196   */
  4197  SolidityFunction.prototype.displayName = function () {
  4198      return utils.extractDisplayName(this._name);
  4199  };
  4200  
  4201  /**
  4202   * Should be used to get function type name
  4203   *
  4204   * @method typeName
  4205   * @return {String} type name of the function
  4206   */
  4207  SolidityFunction.prototype.typeName = function () {
  4208      return utils.extractTypeName(this._name);
  4209  };
  4210  
  4211  /**
  4212   * Should be called to get rpc requests from solidity function
  4213   *
  4214   * @method request
  4215   * @returns {Object}
  4216   */
  4217  SolidityFunction.prototype.request = function () {
  4218      var args = Array.prototype.slice.call(arguments);
  4219      var callback = this.extractCallback(args);
  4220      var payload = this.toPayload(args);
  4221      var format = this.unpackOutput.bind(this);
  4222  
  4223      return {
  4224          method: this._constant ? 'zond_call' : 'zond_sendTransaction',
  4225          callback: callback,
  4226          params: [payload],
  4227          format: format
  4228      };
  4229  };
  4230  
  4231  /**
  4232   * Should be called to execute function
  4233   *
  4234   * @method execute
  4235   */
  4236  SolidityFunction.prototype.execute = function () {
  4237      var transaction = !this._constant;
  4238  
  4239      // send transaction
  4240      if (transaction) {
  4241          return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));
  4242      }
  4243  
  4244      // call
  4245      return this.call.apply(this, Array.prototype.slice.call(arguments));
  4246  };
  4247  
  4248  /**
  4249   * Should be called to attach function to contract
  4250   *
  4251   * @method attachToContract
  4252   * @param {Contract}
  4253   */
  4254  SolidityFunction.prototype.attachToContract = function (contract) {
  4255      var execute = this.execute.bind(this);
  4256      execute.request = this.request.bind(this);
  4257      execute.call = this.call.bind(this);
  4258      execute.sendTransaction = this.sendTransaction.bind(this);
  4259      execute.estimateGas = this.estimateGas.bind(this);
  4260      execute.getData = this.getData.bind(this);
  4261      var displayName = this.displayName();
  4262      if (!contract[displayName]) {
  4263          contract[displayName] = execute;
  4264      }
  4265      contract[displayName][this.typeName()] = execute; // circular!!!!
  4266  };
  4267  
  4268  module.exports = SolidityFunction;
  4269  
  4270  },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./errors":26,"./formatters":30}],32:[function(require,module,exports){
  4271  /*
  4272      This file is part of web3.js.
  4273  
  4274      web3.js is free software: you can redistribute it and/or modify
  4275      it under the terms of the GNU Lesser General Public License as published by
  4276      the Free Software Foundation, either version 3 of the License, or
  4277      (at your option) any later version.
  4278  
  4279      web3.js is distributed in the hope that it will be useful,
  4280      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4281      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4282      GNU Lesser General Public License for more details.
  4283  
  4284      You should have received a copy of the GNU Lesser General Public License
  4285      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4286  */
  4287  /** @file httpprovider.js
  4288   * @authors:
  4289   *   Marek Kotewicz <marek@ethdev.com>
  4290   *   Marian Oancea <marian@ethdev.com>
  4291   *   Fabian Vogelsteller <fabian@ethdev.com>
  4292   * @date 2015
  4293   */
  4294  
  4295  var errors = require('./errors');
  4296  
  4297  // workaround to use httpprovider in different envs
  4298  
  4299  // browser
  4300  if (typeof window !== 'undefined' && window.XMLHttpRequest) {
  4301    XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line
  4302  // node
  4303  } else {
  4304    XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line
  4305  }
  4306  
  4307  var XHR2 = require('xhr2'); // jshint ignore: line
  4308  
  4309  /**
  4310   * HttpProvider should be used to send rpc calls over http
  4311   */
  4312  var HttpProvider = function (host, timeout, user, password) {
  4313    this.host = host || 'http://localhost:8545';
  4314    this.timeout = timeout || 0;
  4315    this.user = user;
  4316    this.password = password;
  4317  };
  4318  
  4319  /**
  4320   * Should be called to prepare new XMLHttpRequest
  4321   *
  4322   * @method prepareRequest
  4323   * @param {Boolean} true if request should be async
  4324   * @return {XMLHttpRequest} object
  4325   */
  4326  HttpProvider.prototype.prepareRequest = function (async) {
  4327    var request;
  4328  
  4329    if (async) {
  4330      request = new XHR2();
  4331      request.timeout = this.timeout;
  4332    } else {
  4333      request = new XMLHttpRequest();
  4334    }
  4335  
  4336    request.open('POST', this.host, async);
  4337    if (this.user && this.password) {
  4338      var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64');
  4339      request.setRequestHeader('Authorization', auth);
  4340    } request.setRequestHeader('Content-Type', 'application/json');
  4341    return request;
  4342  };
  4343  
  4344  /**
  4345   * Should be called to make sync request
  4346   *
  4347   * @method send
  4348   * @param {Object} payload
  4349   * @return {Object} result
  4350   */
  4351  HttpProvider.prototype.send = function (payload) {
  4352    var request = this.prepareRequest(false);
  4353  
  4354    try {
  4355      request.send(JSON.stringify(payload));
  4356    } catch (error) {
  4357      throw errors.InvalidConnection(this.host);
  4358    }
  4359  
  4360    var result = request.responseText;
  4361  
  4362    try {
  4363      result = JSON.parse(result);
  4364    } catch (e) {
  4365      throw errors.InvalidResponse(request.responseText);
  4366    }
  4367  
  4368    return result;
  4369  };
  4370  
  4371  /**
  4372   * Should be used to make async request
  4373   *
  4374   * @method sendAsync
  4375   * @param {Object} payload
  4376   * @param {Function} callback triggered on end with (err, result)
  4377   */
  4378  HttpProvider.prototype.sendAsync = function (payload, callback) {
  4379    var request = this.prepareRequest(true);
  4380  
  4381    request.onreadystatechange = function () {
  4382      if (request.readyState === 4 && request.timeout !== 1) {
  4383        var result = request.responseText;
  4384        var error = null;
  4385  
  4386        try {
  4387          result = JSON.parse(result);
  4388        } catch (e) {
  4389          error = errors.InvalidResponse(request.responseText);
  4390        }
  4391  
  4392        callback(error, result);
  4393      }
  4394    };
  4395  
  4396    request.ontimeout = function () {
  4397      callback(errors.ConnectionTimeout(this.timeout));
  4398    };
  4399  
  4400    try {
  4401      request.send(JSON.stringify(payload));
  4402    } catch (error) {
  4403      callback(errors.InvalidConnection(this.host));
  4404    }
  4405  };
  4406  
  4407  /**
  4408   * Synchronously tries to make Http request
  4409   *
  4410   * @method isConnected
  4411   * @return {Boolean} returns true if request haven't failed. Otherwise false
  4412   */
  4413  HttpProvider.prototype.isConnected = function () {
  4414    try {
  4415      this.send({
  4416        id: 9999999999,
  4417        jsonrpc: '2.0',
  4418        method: 'net_listening',
  4419        params: []
  4420      });
  4421      return true;
  4422    } catch (e) {
  4423      return false;
  4424    }
  4425  };
  4426  
  4427  module.exports = HttpProvider;
  4428  
  4429  },{"./errors":26,"xhr2":86,"xmlhttprequest":17}],33:[function(require,module,exports){
  4430  /*
  4431      This file is part of web3.js.
  4432  
  4433      web3.js is free software: you can redistribute it and/or modify
  4434      it under the terms of the GNU Lesser General Public License as published by
  4435      the Free Software Foundation, either version 3 of the License, or
  4436      (at your option) any later version.
  4437  
  4438      web3.js is distributed in the hope that it will be useful,
  4439      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4440      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4441      GNU Lesser General Public License for more details.
  4442  
  4443      You should have received a copy of the GNU Lesser General Public License
  4444      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4445  */
  4446  /** 
  4447   * @file iban.js
  4448   * @author Marek Kotewicz <marek@ethdev.com>
  4449   * @date 2015
  4450   */
  4451  
  4452  var BigNumber = require('bignumber.js');
  4453  
  4454  var padLeft = function (string, bytes) {
  4455      var result = string;
  4456      while (result.length < bytes * 2) {
  4457          result = '0' + result;
  4458      }
  4459      return result;
  4460  };
  4461  
  4462  /**
  4463   * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to
  4464   * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.
  4465   *
  4466   * @method iso13616Prepare
  4467   * @param {String} iban the IBAN
  4468   * @returns {String} the prepared IBAN
  4469   */
  4470  var iso13616Prepare = function (iban) {
  4471      var A = 'A'.charCodeAt(0);
  4472      var Z = 'Z'.charCodeAt(0);
  4473  
  4474      iban = iban.toUpperCase();
  4475      iban = iban.substr(4) + iban.substr(0,4);
  4476  
  4477      return iban.split('').map(function(n){
  4478          var code = n.charCodeAt(0);
  4479          if (code >= A && code <= Z){
  4480              // A = 10, B = 11, ... Z = 35
  4481              return code - A + 10;
  4482          } else {
  4483              return n;
  4484          }
  4485      }).join('');
  4486  };
  4487  
  4488  /**
  4489   * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064.
  4490   *
  4491   * @method mod9710
  4492   * @param {String} iban
  4493   * @returns {Number}
  4494   */
  4495  var mod9710 = function (iban) {
  4496      var remainder = iban,
  4497          block;
  4498  
  4499      while (remainder.length > 2){
  4500          block = remainder.slice(0, 9);
  4501          remainder = parseInt(block, 10) % 97 + remainder.slice(block.length);
  4502      }
  4503  
  4504      return parseInt(remainder, 10) % 97;
  4505  };
  4506  
  4507  /**
  4508   * This prototype should be used to create iban object from iban correct string
  4509   *
  4510   * @param {String} iban
  4511   */
  4512  var Iban = function (iban) {
  4513      this._iban = iban;
  4514  };
  4515  
  4516  /**
  4517   * This method should be used to create iban object from ethereum address
  4518   *
  4519   * @method fromAddress
  4520   * @param {String} address
  4521   * @return {Iban} the IBAN object
  4522   */
  4523  Iban.fromAddress = function (address) {
  4524      var asBn = new BigNumber(address, 16);
  4525      var base36 = asBn.toString(36);
  4526      var padded = padLeft(base36, 15);
  4527      return Iban.fromBban(padded.toUpperCase());
  4528  };
  4529  
  4530  /**
  4531   * Convert the passed BBAN to an IBAN for this country specification.
  4532   * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>.
  4533   * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits
  4534   *
  4535   * @method fromBban
  4536   * @param {String} bban the BBAN to convert to IBAN
  4537   * @returns {Iban} the IBAN object
  4538   */
  4539  Iban.fromBban = function (bban) {
  4540      var countryCode = 'XE';
  4541  
  4542      var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban));
  4543      var checkDigit = ('0' + (98 - remainder)).slice(-2);
  4544  
  4545      return new Iban(countryCode + checkDigit + bban);
  4546  };
  4547  
  4548  /**
  4549   * Should be used to create IBAN object for given institution and identifier
  4550   *
  4551   * @method createIndirect
  4552   * @param {Object} options, required options are "institution" and "identifier"
  4553   * @return {Iban} the IBAN object
  4554   */
  4555  Iban.createIndirect = function (options) {
  4556      return Iban.fromBban('ETH' + options.institution + options.identifier);
  4557  };
  4558  
  4559  /**
  4560   * Thos method should be used to check if given string is valid iban object
  4561   *
  4562   * @method isValid
  4563   * @param {String} iban string
  4564   * @return {Boolean} true if it is valid IBAN
  4565   */
  4566  Iban.isValid = function (iban) {
  4567      var i = new Iban(iban);
  4568      return i.isValid();
  4569  };
  4570  
  4571  /**
  4572   * Should be called to check if iban is correct
  4573   *
  4574   * @method isValid
  4575   * @returns {Boolean} true if it is, otherwise false
  4576   */
  4577  Iban.prototype.isValid = function () {
  4578      return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) &&
  4579          mod9710(iso13616Prepare(this._iban)) === 1;
  4580  };
  4581  
  4582  /**
  4583   * Should be called to check if iban number is direct
  4584   *
  4585   * @method isDirect
  4586   * @returns {Boolean} true if it is, otherwise false
  4587   */
  4588  Iban.prototype.isDirect = function () {
  4589      return this._iban.length === 34 || this._iban.length === 35;
  4590  };
  4591  
  4592  /**
  4593   * Should be called to check if iban number if indirect
  4594   *
  4595   * @method isIndirect
  4596   * @returns {Boolean} true if it is, otherwise false
  4597   */
  4598  Iban.prototype.isIndirect = function () {
  4599      return this._iban.length === 20;
  4600  };
  4601  
  4602  /**
  4603   * Should be called to get iban checksum
  4604   * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003)
  4605   *
  4606   * @method checksum
  4607   * @returns {String} checksum
  4608   */
  4609  Iban.prototype.checksum = function () {
  4610      return this._iban.substr(2, 2);
  4611  };
  4612  
  4613  /**
  4614   * Should be called to get institution identifier
  4615   * eg. XREG
  4616   *
  4617   * @method institution
  4618   * @returns {String} institution identifier
  4619   */
  4620  Iban.prototype.institution = function () {
  4621      return this.isIndirect() ? this._iban.substr(7, 4) : '';
  4622  };
  4623  
  4624  /**
  4625   * Should be called to get client identifier within institution
  4626   * eg. GAVOFYORK
  4627   *
  4628   * @method client
  4629   * @returns {String} client identifier
  4630   */
  4631  Iban.prototype.client = function () {
  4632      return this.isIndirect() ? this._iban.substr(11) : '';
  4633  };
  4634  
  4635  /**
  4636   * Should be called to get client direct address
  4637   *
  4638   * @method address
  4639   * @returns {String} client direct address
  4640   */
  4641  Iban.prototype.address = function () {
  4642      if (this.isDirect()) {
  4643          var base36 = this._iban.substr(4);
  4644          var asBn = new BigNumber(base36, 36);
  4645          return padLeft(asBn.toString(16), 20);
  4646      } 
  4647  
  4648      return '';
  4649  };
  4650  
  4651  Iban.prototype.toString = function () {
  4652      return this._iban;
  4653  };
  4654  
  4655  module.exports = Iban;
  4656  
  4657  
  4658  },{"bignumber.js":"bignumber.js"}],34:[function(require,module,exports){
  4659  /*
  4660      This file is part of web3.js.
  4661  
  4662      web3.js is free software: you can redistribute it and/or modify
  4663      it under the terms of the GNU Lesser General Public License as published by
  4664      the Free Software Foundation, either version 3 of the License, or
  4665      (at your option) any later version.
  4666  
  4667      web3.js is distributed in the hope that it will be useful,
  4668      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4669      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4670      GNU Lesser General Public License for more details.
  4671  
  4672      You should have received a copy of the GNU Lesser General Public License
  4673      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4674  */
  4675  /** @file ipcprovider.js
  4676   * @authors:
  4677   *   Fabian Vogelsteller <fabian@ethdev.com>
  4678   * @date 2015
  4679   */
  4680  
  4681  "use strict";
  4682  
  4683  var utils = require('../utils/utils');
  4684  var errors = require('./errors');
  4685  
  4686  
  4687  var IpcProvider = function (path, net) {
  4688      var _this = this;
  4689      this.responseCallbacks = {};
  4690      this.path = path;
  4691      
  4692      this.connection = net.connect({path: this.path});
  4693  
  4694      this.connection.on('error', function(e){
  4695          console.error('IPC Connection Error', e);
  4696          _this._timeout();
  4697      });
  4698  
  4699      this.connection.on('end', function(){
  4700          _this._timeout();
  4701      }); 
  4702  
  4703  
  4704      // LISTEN FOR CONNECTION RESPONSES
  4705      this.connection.on('data', function(data) {
  4706          /*jshint maxcomplexity: 6 */
  4707  
  4708          _this._parseResponse(data.toString()).forEach(function(result){
  4709  
  4710              var id = null;
  4711  
  4712              // get the id which matches the returned id
  4713              if(utils.isArray(result)) {
  4714                  result.forEach(function(load){
  4715                      if(_this.responseCallbacks[load.id])
  4716                          id = load.id;
  4717                  });
  4718              } else {
  4719                  id = result.id;
  4720              }
  4721  
  4722              // fire the callback
  4723              if(_this.responseCallbacks[id]) {
  4724                  _this.responseCallbacks[id](null, result);
  4725                  delete _this.responseCallbacks[id];
  4726              }
  4727          });
  4728      });
  4729  };
  4730  
  4731  /**
  4732  Will parse the response and make an array out of it.
  4733  
  4734  @method _parseResponse
  4735  @param {String} data
  4736  */
  4737  IpcProvider.prototype._parseResponse = function(data) {
  4738      var _this = this,
  4739          returnValues = [];
  4740      
  4741      // DE-CHUNKER
  4742      var dechunkedData = data
  4743          .replace(/\}[\n\r]?\{/g,'}|--|{') // }{
  4744          .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{
  4745          .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{
  4746          .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{
  4747          .split('|--|');
  4748  
  4749      dechunkedData.forEach(function(data){
  4750  
  4751          // prepend the last chunk
  4752          if(_this.lastChunk)
  4753              data = _this.lastChunk + data;
  4754  
  4755          var result = null;
  4756  
  4757          try {
  4758              result = JSON.parse(data);
  4759  
  4760          } catch(e) {
  4761  
  4762              _this.lastChunk = data;
  4763  
  4764              // start timeout to cancel all requests
  4765              clearTimeout(_this.lastChunkTimeout);
  4766              _this.lastChunkTimeout = setTimeout(function(){
  4767                  _this._timeout();
  4768                  throw errors.InvalidResponse(data);
  4769              }, 1000 * 15);
  4770  
  4771              return;
  4772          }
  4773  
  4774          // cancel timeout and set chunk to null
  4775          clearTimeout(_this.lastChunkTimeout);
  4776          _this.lastChunk = null;
  4777  
  4778          if(result)
  4779              returnValues.push(result);
  4780      });
  4781  
  4782      return returnValues;
  4783  };
  4784  
  4785  
  4786  /**
  4787  Get the adds a callback to the responseCallbacks object,
  4788  which will be called if a response matching the response Id will arrive.
  4789  
  4790  @method _addResponseCallback
  4791  */
  4792  IpcProvider.prototype._addResponseCallback = function(payload, callback) {
  4793      var id = payload.id || payload[0].id;
  4794      var method = payload.method || payload[0].method;
  4795  
  4796      this.responseCallbacks[id] = callback;
  4797      this.responseCallbacks[id].method = method;
  4798  };
  4799  
  4800  /**
  4801  Timeout all requests when the end/error event is fired
  4802  
  4803  @method _timeout
  4804  */
  4805  IpcProvider.prototype._timeout = function() {
  4806      for(var key in this.responseCallbacks) {
  4807          if(this.responseCallbacks.hasOwnProperty(key)){
  4808              this.responseCallbacks[key](errors.InvalidConnection('on IPC'));
  4809              delete this.responseCallbacks[key];
  4810          }
  4811      }
  4812  };
  4813  
  4814  
  4815  /**
  4816  Check if the current connection is still valid.
  4817  
  4818  @method isConnected
  4819  */
  4820  IpcProvider.prototype.isConnected = function() {
  4821      var _this = this;
  4822  
  4823      // try reconnect, when connection is gone
  4824      if(!_this.connection.writable)
  4825          _this.connection.connect({path: _this.path});
  4826  
  4827      return !!this.connection.writable;
  4828  };
  4829  
  4830  IpcProvider.prototype.send = function (payload) {
  4831  
  4832      if(this.connection.writeSync) {
  4833          var result;
  4834  
  4835          // try reconnect, when connection is gone
  4836          if(!this.connection.writable)
  4837              this.connection.connect({path: this.path});
  4838  
  4839          var data = this.connection.writeSync(JSON.stringify(payload));
  4840  
  4841          try {
  4842              result = JSON.parse(data);
  4843          } catch(e) {
  4844              throw errors.InvalidResponse(data);                
  4845          }
  4846  
  4847          return result;
  4848  
  4849      } else {
  4850          throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.');
  4851      }
  4852  };
  4853  
  4854  IpcProvider.prototype.sendAsync = function (payload, callback) {
  4855      // try reconnect, when connection is gone
  4856      if(!this.connection.writable)
  4857          this.connection.connect({path: this.path});
  4858  
  4859  
  4860      this.connection.write(JSON.stringify(payload));
  4861      this._addResponseCallback(payload, callback);
  4862  };
  4863  
  4864  module.exports = IpcProvider;
  4865  
  4866  
  4867  },{"../utils/utils":20,"./errors":26}],35:[function(require,module,exports){
  4868  /*
  4869      This file is part of web3.js.
  4870  
  4871      web3.js is free software: you can redistribute it and/or modify
  4872      it under the terms of the GNU Lesser General Public License as published by
  4873      the Free Software Foundation, either version 3 of the License, or
  4874      (at your option) any later version.
  4875  
  4876      web3.js is distributed in the hope that it will be useful,
  4877      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4878      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4879      GNU Lesser General Public License for more details.
  4880  
  4881      You should have received a copy of the GNU Lesser General Public License
  4882      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4883  */
  4884  /** @file jsonrpc.js
  4885   * @authors:
  4886   *   Marek Kotewicz <marek@ethdev.com>
  4887   *   Aaron Kumavis <aaron@kumavis.me>
  4888   * @date 2015
  4889   */
  4890  
  4891  // Initialize Jsonrpc as a simple object with utility functions.
  4892  var Jsonrpc = {
  4893      messageId: 0
  4894  };
  4895  
  4896  /**
  4897   * Should be called to valid json create payload object
  4898   *
  4899   * @method toPayload
  4900   * @param {Function} method of jsonrpc call, required
  4901   * @param {Array} params, an array of method params, optional
  4902   * @returns {Object} valid jsonrpc payload object
  4903   */
  4904  Jsonrpc.toPayload = function (method, params) {
  4905      if (!method)
  4906          console.error('jsonrpc method should be specified!');
  4907  
  4908      // advance message ID
  4909      Jsonrpc.messageId++;
  4910  
  4911      return {
  4912          jsonrpc: '2.0',
  4913          id: Jsonrpc.messageId,
  4914          method: method,
  4915          params: params || []
  4916      };
  4917  };
  4918  
  4919  /**
  4920   * Should be called to check if jsonrpc response is valid
  4921   *
  4922   * @method isValidResponse
  4923   * @param {Object}
  4924   * @returns {Boolean} true if response is valid, otherwise false
  4925   */
  4926  Jsonrpc.isValidResponse = function (response) {
  4927      return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response);
  4928  
  4929      function validateSingleMessage(message){
  4930        return !!message &&
  4931          !message.error &&
  4932          message.jsonrpc === '2.0' &&
  4933          typeof message.id === 'number' &&
  4934          message.result !== undefined; // only undefined is not valid json object
  4935      }
  4936  };
  4937  
  4938  /**
  4939   * Should be called to create batch payload object
  4940   *
  4941   * @method toBatchPayload
  4942   * @param {Array} messages, an array of objects with method (required) and params (optional) fields
  4943   * @returns {Array} batch payload
  4944   */
  4945  Jsonrpc.toBatchPayload = function (messages) {
  4946      return messages.map(function (message) {
  4947          return Jsonrpc.toPayload(message.method, message.params);
  4948      });
  4949  };
  4950  
  4951  module.exports = Jsonrpc;
  4952  
  4953  
  4954  },{}],36:[function(require,module,exports){
  4955  /*
  4956      This file is part of web3.js.
  4957  
  4958      web3.js is free software: you can redistribute it and/or modify
  4959      it under the terms of the GNU Lesser General Public License as published by
  4960      the Free Software Foundation, either version 3 of the License, or
  4961      (at your option) any later version.
  4962  
  4963      web3.js is distributed in the hope that it will be useful,
  4964      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4965      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4966      GNU Lesser General Public License for more details.
  4967  
  4968      You should have received a copy of the GNU Lesser General Public License
  4969      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4970  */
  4971  /**
  4972   * @file method.js
  4973   * @author Marek Kotewicz <marek@ethdev.com>
  4974   * @date 2015
  4975   */
  4976  
  4977  var utils = require('../utils/utils');
  4978  var errors = require('./errors');
  4979  
  4980  var Method = function (options) {
  4981      this.name = options.name;
  4982      this.call = options.call;
  4983      this.params = options.params || 0;
  4984      this.inputFormatter = options.inputFormatter;
  4985      this.outputFormatter = options.outputFormatter;
  4986      this.requestManager = null;
  4987  };
  4988  
  4989  Method.prototype.setRequestManager = function (rm) {
  4990      this.requestManager = rm;
  4991  };
  4992  
  4993  /**
  4994   * Should be used to determine name of the jsonrpc method based on arguments
  4995   *
  4996   * @method getCall
  4997   * @param {Array} arguments
  4998   * @return {String} name of jsonrpc method
  4999   */
  5000  Method.prototype.getCall = function (args) {
  5001      return utils.isFunction(this.call) ? this.call(args) : this.call;
  5002  };
  5003  
  5004  /**
  5005   * Should be used to extract callback from array of arguments. Modifies input param
  5006   *
  5007   * @method extractCallback
  5008   * @param {Array} arguments
  5009   * @return {Function|Null} callback, if exists
  5010   */
  5011  Method.prototype.extractCallback = function (args) {
  5012      if (utils.isFunction(args[args.length - 1])) {
  5013          return args.pop(); // modify the args array!
  5014      }
  5015  };
  5016  
  5017  /**
  5018   * Should be called to check if the number of arguments is correct
  5019   * 
  5020   * @method validateArgs
  5021   * @param {Array} arguments
  5022   * @throws {Error} if it is not
  5023   */
  5024  Method.prototype.validateArgs = function (args) {
  5025      if (args.length !== this.params) {
  5026          throw errors.InvalidNumberOfRPCParams();
  5027      }
  5028  };
  5029  
  5030  /**
  5031   * Should be called to format input args of method
  5032   * 
  5033   * @method formatInput
  5034   * @param {Array}
  5035   * @return {Array}
  5036   */
  5037  Method.prototype.formatInput = function (args) {
  5038      if (!this.inputFormatter) {
  5039          return args;
  5040      }
  5041  
  5042      return this.inputFormatter.map(function (formatter, index) {
  5043          return formatter ? formatter(args[index]) : args[index];
  5044      });
  5045  };
  5046  
  5047  /**
  5048   * Should be called to format output(result) of method
  5049   *
  5050   * @method formatOutput
  5051   * @param {Object}
  5052   * @return {Object}
  5053   */
  5054  Method.prototype.formatOutput = function (result) {
  5055      return this.outputFormatter && result ? this.outputFormatter(result) : result;
  5056  };
  5057  
  5058  /**
  5059   * Should create payload from given input args
  5060   *
  5061   * @method toPayload
  5062   * @param {Array} args
  5063   * @return {Object}
  5064   */
  5065  Method.prototype.toPayload = function (args) {
  5066      var call = this.getCall(args);
  5067      var callback = this.extractCallback(args);
  5068      var params = this.formatInput(args);
  5069      this.validateArgs(params);
  5070  
  5071      return {
  5072          method: call,
  5073          params: params,
  5074          callback: callback
  5075      };
  5076  };
  5077  
  5078  Method.prototype.attachToObject = function (obj) {
  5079      var func = this.buildCall();
  5080      func.call = this.call; // TODO!!! that's ugly. filter.js uses it
  5081      var name = this.name.split('.');
  5082      if (name.length > 1) {
  5083          obj[name[0]] = obj[name[0]] || {};
  5084          obj[name[0]][name[1]] = func;
  5085      } else {
  5086          obj[name[0]] = func; 
  5087      }
  5088  };
  5089  
  5090  Method.prototype.buildCall = function() {
  5091      var method = this;
  5092      var send = function () {
  5093          var payload = method.toPayload(Array.prototype.slice.call(arguments));
  5094          if (payload.callback) {
  5095              return method.requestManager.sendAsync(payload, function (err, result) {
  5096                  payload.callback(err, method.formatOutput(result));
  5097              });
  5098          }
  5099          return method.formatOutput(method.requestManager.send(payload));
  5100      };
  5101      send.request = this.request.bind(this);
  5102      return send;
  5103  };
  5104  
  5105  /**
  5106   * Should be called to create pure JSONRPC request which can be used in batch request
  5107   *
  5108   * @method request
  5109   * @param {...} params
  5110   * @return {Object} jsonrpc request
  5111   */
  5112  Method.prototype.request = function () {
  5113      var payload = this.toPayload(Array.prototype.slice.call(arguments));
  5114      payload.format = this.formatOutput.bind(this);
  5115      return payload;
  5116  };
  5117  
  5118  module.exports = Method;
  5119  
  5120  },{"../utils/utils":20,"./errors":26}],37:[function(require,module,exports){
  5121  /*
  5122      This file is part of web3.js.
  5123  
  5124      web3.js is free software: you can redistribute it and/or modify
  5125      it under the terms of the GNU Lesser General Public License as published by
  5126      the Free Software Foundation, either version 3 of the License, or
  5127      (at your option) any later version.
  5128  
  5129      web3.js is distributed in the hope that it will be useful,
  5130      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5131      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5132      GNU Lesser General Public License for more details.
  5133  
  5134      You should have received a copy of the GNU Lesser General Public License
  5135      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5136  */
  5137  /** @file db.js
  5138   * @authors:
  5139   *   Marek Kotewicz <marek@ethdev.com>
  5140   * @date 2015
  5141   */
  5142  
  5143  var Method = require('../method');
  5144  
  5145  var DB = function (web3) {
  5146      this._requestManager = web3._requestManager;
  5147  
  5148      var self = this;
  5149      
  5150      methods().forEach(function(method) { 
  5151          method.attachToObject(self);
  5152          method.setRequestManager(web3._requestManager);
  5153      });
  5154  };
  5155  
  5156  var methods = function () {
  5157      var putString = new Method({
  5158          name: 'putString',
  5159          call: 'db_putString',
  5160          params: 3
  5161      });
  5162  
  5163      var getString = new Method({
  5164          name: 'getString',
  5165          call: 'db_getString',
  5166          params: 2
  5167      });
  5168  
  5169      var putHex = new Method({
  5170          name: 'putHex',
  5171          call: 'db_putHex',
  5172          params: 3
  5173      });
  5174  
  5175      var getHex = new Method({
  5176          name: 'getHex',
  5177          call: 'db_getHex',
  5178          params: 2
  5179      });
  5180  
  5181      return [
  5182          putString, getString, putHex, getHex
  5183      ];
  5184  };
  5185  
  5186  module.exports = DB;
  5187  
  5188  },{"../method":36}],38:[function(require,module,exports){
  5189  /*
  5190      This file is part of web3.js.
  5191  
  5192      web3.js is free software: you can redistribute it and/or modify
  5193      it under the terms of the GNU Lesser General Public License as published by
  5194      the Free Software Foundation, either version 3 of the License, or
  5195      (at your option) any later version.
  5196  
  5197      web3.js is distributed in the hope that it will be useful,
  5198      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5199      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5200      GNU Lesser General Public License for more details.
  5201  
  5202      You should have received a copy of the GNU Lesser General Public License
  5203      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5204  */
  5205  /**
  5206   * @file zond.js
  5207   * @author Marek Kotewicz <marek@ethdev.com>
  5208   * @author Fabian Vogelsteller <fabian@ethdev.com>
  5209   * @date 2015
  5210   */
  5211  
  5212  "use strict";
  5213  
  5214  var formatters = require('../formatters');
  5215  var utils = require('../../utils/utils');
  5216  var Method = require('../method');
  5217  var Property = require('../property');
  5218  var c = require('../../utils/config');
  5219  var Contract = require('../contract');
  5220  var watches = require('./watches');
  5221  var Filter = require('../filter');
  5222  var IsSyncing = require('../syncing');
  5223  var namereg = require('../namereg');
  5224  var Iban = require('../iban');
  5225  var transfer = require('../transfer');
  5226  
  5227  var blockCall = function (args) {
  5228      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "zond_getBlockByHash" : "zond_getBlockByNumber";
  5229  };
  5230  
  5231  var transactionFromBlockCall = function (args) {
  5232      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'zond_getTransactionByBlockHashAndIndex' : 'zond_getTransactionByBlockNumberAndIndex';
  5233  };
  5234  
  5235  var uncleCall = function (args) {
  5236      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'zond_getUncleByBlockHashAndIndex' : 'zond_getUncleByBlockNumberAndIndex';
  5237  };
  5238  
  5239  var getBlockTransactionCountCall = function (args) {
  5240      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'zond_getBlockTransactionCountByHash' : 'zond_getBlockTransactionCountByNumber';
  5241  };
  5242  
  5243  var uncleCountCall = function (args) {
  5244      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'zond_getUncleCountByBlockHash' : 'zond_getUncleCountByBlockNumber';
  5245  };
  5246  
  5247  function Zond(web3) {
  5248      this._requestManager = web3._requestManager;
  5249  
  5250      var self = this;
  5251  
  5252      methods().forEach(function(method) {
  5253          method.attachToObject(self);
  5254          method.setRequestManager(self._requestManager);
  5255      });
  5256  
  5257      properties().forEach(function(p) {
  5258          p.attachToObject(self);
  5259          p.setRequestManager(self._requestManager);
  5260      });
  5261  
  5262  
  5263      this.iban = Iban;
  5264      this.sendIBANTransaction = transfer.bind(null, this);
  5265  }
  5266  
  5267  Object.defineProperty(Zond.prototype, 'defaultBlock', {
  5268      get: function () {
  5269          return c.defaultBlock;
  5270      },
  5271      set: function (val) {
  5272          c.defaultBlock = val;
  5273          return val;
  5274      }
  5275  });
  5276  
  5277  Object.defineProperty(Zond.prototype, 'defaultAccount', {
  5278      get: function () {
  5279          return c.defaultAccount;
  5280      },
  5281      set: function (val) {
  5282          c.defaultAccount = val;
  5283          return val;
  5284      }
  5285  });
  5286  
  5287  var methods = function () {
  5288      var getBalance = new Method({
  5289          name: 'getBalance',
  5290          call: 'zond_getBalance',
  5291          params: 2,
  5292          inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter],
  5293          outputFormatter: formatters.outputBigNumberFormatter
  5294      });
  5295  
  5296      var getStorageAt = new Method({
  5297          name: 'getStorageAt',
  5298          call: 'zond_getStorageAt',
  5299          params: 3,
  5300          inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter]
  5301      });
  5302  
  5303      var getCode = new Method({
  5304          name: 'getCode',
  5305          call: 'zond_getCode',
  5306          params: 2,
  5307          inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter]
  5308      });
  5309  
  5310      var getBlock = new Method({
  5311          name: 'getBlock',
  5312          call: blockCall,
  5313          params: 2,
  5314          inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }],
  5315          outputFormatter: formatters.outputBlockFormatter
  5316      });
  5317  
  5318      var getUncle = new Method({
  5319          name: 'getUncle',
  5320          call: uncleCall,
  5321          params: 2,
  5322          inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
  5323          outputFormatter: formatters.outputBlockFormatter,
  5324  
  5325      });
  5326  
  5327      var getCompilers = new Method({
  5328          name: 'getCompilers',
  5329          call: 'zond_getCompilers',
  5330          params: 0
  5331      });
  5332  
  5333      var getBlockTransactionCount = new Method({
  5334          name: 'getBlockTransactionCount',
  5335          call: getBlockTransactionCountCall,
  5336          params: 1,
  5337          inputFormatter: [formatters.inputBlockNumberFormatter],
  5338          outputFormatter: utils.toDecimal
  5339      });
  5340  
  5341      var getBlockUncleCount = new Method({
  5342          name: 'getBlockUncleCount',
  5343          call: uncleCountCall,
  5344          params: 1,
  5345          inputFormatter: [formatters.inputBlockNumberFormatter],
  5346          outputFormatter: utils.toDecimal
  5347      });
  5348  
  5349      var getTransaction = new Method({
  5350          name: 'getTransaction',
  5351          call: 'zond_getTransactionByHash',
  5352          params: 1,
  5353          outputFormatter: formatters.outputTransactionFormatter
  5354      });
  5355  
  5356      var getTransactionFromBlock = new Method({
  5357          name: 'getTransactionFromBlock',
  5358          call: transactionFromBlockCall,
  5359          params: 2,
  5360          inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
  5361          outputFormatter: formatters.outputTransactionFormatter
  5362      });
  5363  
  5364      var getTransactionReceipt = new Method({
  5365          name: 'getTransactionReceipt',
  5366          call: 'zond_getTransactionReceipt',
  5367          params: 1,
  5368          outputFormatter: formatters.outputTransactionReceiptFormatter
  5369      });
  5370  
  5371      var getTransactionCount = new Method({
  5372          name: 'getTransactionCount',
  5373          call: 'zond_getTransactionCount',
  5374          params: 2,
  5375          inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter],
  5376          outputFormatter: utils.toDecimal
  5377      });
  5378  
  5379      var sendRawTransaction = new Method({
  5380          name: 'sendRawTransaction',
  5381          call: 'zond_sendRawTransaction',
  5382          params: 1,
  5383          inputFormatter: [null]
  5384      });
  5385  
  5386      var sendTransaction = new Method({
  5387          name: 'sendTransaction',
  5388          call: 'zond_sendTransaction',
  5389          params: 1,
  5390          inputFormatter: [formatters.inputTransactionFormatter]
  5391      });
  5392  
  5393      var signTransaction = new Method({
  5394          name: 'signTransaction',
  5395          call: 'zond_signTransaction',
  5396          params: 1,
  5397          inputFormatter: [formatters.inputTransactionFormatter]
  5398      });
  5399  
  5400      var sign = new Method({
  5401          name: 'sign',
  5402          call: 'zond_sign',
  5403          params: 2,
  5404          inputFormatter: [formatters.inputAddressFormatter, null]
  5405      });
  5406  
  5407      var call = new Method({
  5408          name: 'call',
  5409          call: 'zond_call',
  5410          params: 2,
  5411          inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter]
  5412      });
  5413  
  5414      var estimateGas = new Method({
  5415          name: 'estimateGas',
  5416          call: 'zond_estimateGas',
  5417          params: 1,
  5418          inputFormatter: [formatters.inputCallFormatter],
  5419          outputFormatter: utils.toDecimal
  5420      });
  5421  
  5422      var compileSolidity = new Method({
  5423          name: 'compile.solidity',
  5424          call: 'zond_compileSolidity',
  5425          params: 1
  5426      });
  5427  
  5428      var compileLLL = new Method({
  5429          name: 'compile.lll',
  5430          call: 'zond_compileLLL',
  5431          params: 1
  5432      });
  5433  
  5434      var compileSerpent = new Method({
  5435          name: 'compile.serpent',
  5436          call: 'zond_compileSerpent',
  5437          params: 1
  5438      });
  5439  
  5440      var submitWork = new Method({
  5441          name: 'submitWork',
  5442          call: 'zond_submitWork',
  5443          params: 3
  5444      });
  5445  
  5446      var getWork = new Method({
  5447          name: 'getWork',
  5448          call: 'zond_getWork',
  5449          params: 0
  5450      });
  5451  
  5452      return [
  5453          getBalance,
  5454          getStorageAt,
  5455          getCode,
  5456          getBlock,
  5457          getUncle,
  5458          getCompilers,
  5459          getBlockTransactionCount,
  5460          getBlockUncleCount,
  5461          getTransaction,
  5462          getTransactionFromBlock,
  5463          getTransactionReceipt,
  5464          getTransactionCount,
  5465          call,
  5466          estimateGas,
  5467          sendRawTransaction,
  5468          signTransaction,
  5469          sendTransaction,
  5470          sign,
  5471          compileSolidity,
  5472          compileLLL,
  5473          compileSerpent,
  5474          submitWork,
  5475          getWork
  5476      ];
  5477  };
  5478  
  5479  
  5480  var properties = function () {
  5481      return [
  5482          new Property({
  5483              name: 'coinbase',
  5484              getter: 'zond_coinbase'
  5485          }),
  5486          new Property({
  5487              name: 'mining',
  5488              getter: 'zond_mining'
  5489          }),
  5490          new Property({
  5491              name: 'hashrate',
  5492              getter: 'zond_hashrate',
  5493              outputFormatter: utils.toDecimal
  5494          }),
  5495          new Property({
  5496              name: 'syncing',
  5497              getter: 'zond_syncing',
  5498              outputFormatter: formatters.outputSyncingFormatter
  5499          }),
  5500          new Property({
  5501              name: 'gasPrice',
  5502              getter: 'zond_gasPrice',
  5503              outputFormatter: formatters.outputBigNumberFormatter
  5504          }),
  5505          new Property({
  5506              name: 'accounts',
  5507              getter: 'zond_accounts'
  5508          }),
  5509          new Property({
  5510              name: 'blockNumber',
  5511              getter: 'zond_blockNumber',
  5512              outputFormatter: utils.toDecimal
  5513          }),
  5514          new Property({
  5515              name: 'protocolVersion',
  5516              getter: 'zond_protocolVersion'
  5517          })
  5518      ];
  5519  };
  5520  
  5521  Zond.prototype.contract = function (abi) {
  5522      var factory = new Contract(this, abi);
  5523      return factory;
  5524  };
  5525  
  5526  Zond.prototype.filter = function (options, callback, filterCreationErrorCallback) {
  5527      return new Filter(options, 'eth', this._requestManager, watches.eth(), formatters.outputLogFormatter, callback, filterCreationErrorCallback);
  5528  };
  5529  
  5530  Zond.prototype.namereg = function () {
  5531      return this.contract(namereg.global.abi).at(namereg.global.address);
  5532  };
  5533  
  5534  Zond.prototype.icapNamereg = function () {
  5535      return this.contract(namereg.icap.abi).at(namereg.icap.address);
  5536  };
  5537  
  5538  Zond.prototype.isSyncing = function (callback) {
  5539      return new IsSyncing(this._requestManager, callback);
  5540  };
  5541  
  5542  module.exports = Zond;
  5543  
  5544  },{"../../utils/config":18,"../../utils/utils":20,"../contract":25,"../filter":29,"../formatters":30,"../iban":33,"../method":36,"../namereg":44,"../property":45,"../syncing":48,"../transfer":49,"./watches":43}],39:[function(require,module,exports){
  5545  /*
  5546      This file is part of web3.js.
  5547  
  5548      web3.js is free software: you can redistribute it and/or modify
  5549      it under the terms of the GNU Lesser General Public License as published by
  5550      the Free Software Foundation, either version 3 of the License, or
  5551      (at your option) any later version.
  5552  
  5553      web3.js is distributed in the hope that it will be useful,
  5554      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5555      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5556      GNU Lesser General Public License for more details.
  5557  
  5558      You should have received a copy of the GNU Lesser General Public License
  5559      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5560  */
  5561  /** @file zond.js
  5562   * @authors:
  5563   *   Marek Kotewicz <marek@ethdev.com>
  5564   * @date 2015
  5565   */
  5566  
  5567  var utils = require('../../utils/utils');
  5568  var Property = require('../property');
  5569  
  5570  var Net = function (web3) {
  5571      this._requestManager = web3._requestManager;
  5572  
  5573      var self = this;
  5574  
  5575      properties().forEach(function(p) { 
  5576          p.attachToObject(self);
  5577          p.setRequestManager(web3._requestManager);
  5578      });
  5579  };
  5580  
  5581  /// @returns an array of objects describing web3.zond api properties
  5582  var properties = function () {
  5583      return [
  5584          new Property({
  5585              name: 'listening',
  5586              getter: 'net_listening'
  5587          }),
  5588          new Property({
  5589              name: 'peerCount',
  5590              getter: 'net_peerCount',
  5591              outputFormatter: utils.toDecimal
  5592          })
  5593      ];
  5594  };
  5595  
  5596  module.exports = Net;
  5597  
  5598  },{"../../utils/utils":20,"../property":45}],40:[function(require,module,exports){
  5599  /*
  5600      This file is part of web3.js.
  5601  
  5602      web3.js is free software: you can redistribute it and/or modify
  5603      it under the terms of the GNU Lesser General Public License as published by
  5604      the Free Software Foundation, either version 3 of the License, or
  5605      (at your option) any later version.
  5606  
  5607      web3.js is distributed in the hope that it will be useful,
  5608      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5609      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5610      GNU Lesser General Public License for more details.
  5611  
  5612      You should have received a copy of the GNU Lesser General Public License
  5613      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5614  */
  5615  /**
  5616   * @file zond.js
  5617   * @author Marek Kotewicz <marek@ethdev.com>
  5618   * @author Fabian Vogelsteller <fabian@ethdev.com>
  5619   * @date 2015
  5620   */
  5621  
  5622  "use strict";
  5623  
  5624  var Method = require('../method');
  5625  var Property = require('../property');
  5626  var formatters = require('../formatters');
  5627  
  5628  function Personal(web3) {
  5629      this._requestManager = web3._requestManager;
  5630  
  5631      var self = this;
  5632  
  5633      methods().forEach(function(method) {
  5634          method.attachToObject(self);
  5635          method.setRequestManager(self._requestManager);
  5636      });
  5637  
  5638      properties().forEach(function(p) {
  5639          p.attachToObject(self);
  5640          p.setRequestManager(self._requestManager);
  5641      });
  5642  }
  5643  
  5644  var methods = function () {
  5645      var newAccount = new Method({
  5646          name: 'newAccount',
  5647          call: 'personal_newAccount',
  5648          params: 1,
  5649          inputFormatter: [null]
  5650      });
  5651  
  5652      var importRawKey = new Method({
  5653          name: 'importRawKey',
  5654  		call: 'personal_importRawKey',
  5655  		params: 2
  5656      });
  5657  
  5658      var sign = new Method({
  5659          name: 'sign',
  5660  		call: 'personal_sign',
  5661  		params: 3,
  5662  		inputFormatter: [null, formatters.inputAddressFormatter, null]
  5663      });
  5664  
  5665      var ecRecover = new Method({
  5666          name: 'ecRecover',
  5667  		call: 'personal_ecRecover',
  5668  		params: 2
  5669      });
  5670  
  5671      var unlockAccount = new Method({
  5672          name: 'unlockAccount',
  5673          call: 'personal_unlockAccount',
  5674          params: 3,
  5675          inputFormatter: [formatters.inputAddressFormatter, null, null]
  5676      });
  5677  
  5678      var sendTransaction = new Method({
  5679          name: 'sendTransaction',
  5680          call: 'personal_sendTransaction',
  5681          params: 2,
  5682          inputFormatter: [formatters.inputTransactionFormatter, null]
  5683      });
  5684  
  5685      var lockAccount = new Method({
  5686          name: 'lockAccount',
  5687          call: 'personal_lockAccount',
  5688          params: 1,
  5689          inputFormatter: [formatters.inputAddressFormatter]
  5690      });
  5691  
  5692      return [
  5693          newAccount,
  5694          importRawKey,
  5695          unlockAccount,
  5696          ecRecover,
  5697          sign,
  5698          sendTransaction,
  5699          lockAccount
  5700      ];
  5701  };
  5702  
  5703  var properties = function () {
  5704      return [
  5705          new Property({
  5706              name: 'listAccounts',
  5707              getter: 'personal_listAccounts'
  5708          })
  5709      ];
  5710  };
  5711  
  5712  
  5713  module.exports = Personal;
  5714  
  5715  },{"../formatters":30,"../method":36,"../property":45}],41:[function(require,module,exports){
  5716  /*
  5717      This file is part of web3.js.
  5718  
  5719      web3.js is free software: you can redistribute it and/or modify
  5720      it under the terms of the GNU Lesser General Public License as published by
  5721      the Free Software Foundation, either version 3 of the License, or
  5722      (at your option) any later version.
  5723  
  5724      web3.js is distributed in the hope that it will be useful,
  5725      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5726      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5727      GNU Lesser General Public License for more details.
  5728  
  5729      You should have received a copy of the GNU Lesser General Public License
  5730      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5731  */
  5732  /** @file shh.js
  5733   * @authors:
  5734   *   Fabian Vogelsteller <fabian@ethereum.org>
  5735   *   Marek Kotewicz <marek@ethcore.io>
  5736   * @date 2017
  5737   */
  5738  
  5739  var Method = require('../method');
  5740  var Filter = require('../filter');
  5741  var watches = require('./watches');
  5742  
  5743  var Shh = function (web3) {
  5744      this._requestManager = web3._requestManager;
  5745  
  5746      var self = this;
  5747  
  5748      methods().forEach(function(method) {
  5749          method.attachToObject(self);
  5750          method.setRequestManager(self._requestManager);
  5751      });
  5752  };
  5753  
  5754  Shh.prototype.newMessageFilter = function (options, callback, filterCreationErrorCallback) {
  5755      return new Filter(options, 'shh', this._requestManager, watches.shh(), null, callback, filterCreationErrorCallback);
  5756  };
  5757  
  5758  var methods = function () {
  5759  
  5760      return [
  5761          new Method({
  5762              name: 'version',
  5763              call: 'shh_version',
  5764              params: 0
  5765          }),
  5766          new Method({
  5767              name: 'info',
  5768              call: 'shh_info',
  5769              params: 0
  5770          }),
  5771          new Method({
  5772              name: 'setMaxMessageSize',
  5773              call: 'shh_setMaxMessageSize',
  5774              params: 1
  5775          }),
  5776          new Method({
  5777              name: 'setMinPoW',
  5778              call: 'shh_setMinPoW',
  5779              params: 1
  5780          }),
  5781          new Method({
  5782              name: 'markTrustedPeer',
  5783              call: 'shh_markTrustedPeer',
  5784              params: 1
  5785          }),
  5786          new Method({
  5787              name: 'newKeyPair',
  5788              call: 'shh_newKeyPair',
  5789              params: 0
  5790          }),
  5791          new Method({
  5792              name: 'addPrivateKey',
  5793              call: 'shh_addPrivateKey',
  5794              params: 1
  5795          }),
  5796          new Method({
  5797              name: 'deleteKeyPair',
  5798              call: 'shh_deleteKeyPair',
  5799              params: 1
  5800          }),
  5801          new Method({
  5802              name: 'hasKeyPair',
  5803              call: 'shh_hasKeyPair',
  5804              params: 1
  5805          }),
  5806          new Method({
  5807              name: 'getPublicKey',
  5808              call: 'shh_getPublicKey',
  5809              params: 1
  5810          }),
  5811          new Method({
  5812              name: 'getPrivateKey',
  5813              call: 'shh_getPrivateKey',
  5814              params: 1
  5815          }),
  5816          new Method({
  5817              name: 'newSymKey',
  5818              call: 'shh_newSymKey',
  5819              params: 0
  5820          }),
  5821          new Method({
  5822              name: 'addSymKey',
  5823              call: 'shh_addSymKey',
  5824              params: 1
  5825          }),
  5826          new Method({
  5827              name: 'generateSymKeyFromPassword',
  5828              call: 'shh_generateSymKeyFromPassword',
  5829              params: 1
  5830          }),
  5831          new Method({
  5832              name: 'hasSymKey',
  5833              call: 'shh_hasSymKey',
  5834              params: 1
  5835          }),
  5836          new Method({
  5837              name: 'getSymKey',
  5838              call: 'shh_getSymKey',
  5839              params: 1
  5840          }),
  5841          new Method({
  5842              name: 'deleteSymKey',
  5843              call: 'shh_deleteSymKey',
  5844              params: 1
  5845          }),
  5846  
  5847          // subscribe and unsubscribe missing
  5848  
  5849          new Method({
  5850              name: 'post',
  5851              call: 'shh_post',
  5852              params: 1,
  5853              inputFormatter: [null]
  5854          })
  5855      ];
  5856  };
  5857  
  5858  module.exports = Shh;
  5859  
  5860  
  5861  },{"../filter":29,"../method":36,"./watches":43}],42:[function(require,module,exports){
  5862  /*
  5863      This file is part of web3.js.
  5864  
  5865      web3.js is free software: you can redistribute it and/or modify
  5866      it under the terms of the GNU Lesser General Public License as published by
  5867      the Free Software Foundation, either version 3 of the License, or
  5868      (at your option) any later version.
  5869  
  5870      web3.js is distributed in the hope that it will be useful,
  5871      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5872      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5873      GNU Lesser General Public License for more details.
  5874  
  5875      You should have received a copy of the GNU Lesser General Public License
  5876      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5877  */
  5878  /**
  5879   * @file bzz.js
  5880   * @author Alex Beregszaszi <alex@rtfs.hu>
  5881   * @date 2016
  5882   *
  5883   * Reference: https://github.com/theQRL/go-zond/blob/swarm/internal/web3ext/web3ext.go#L33
  5884   */
  5885  
  5886  "use strict";
  5887  
  5888  var Method = require('../method');
  5889  var Property = require('../property');
  5890  
  5891  function Swarm(web3) {
  5892      this._requestManager = web3._requestManager;
  5893  
  5894      var self = this;
  5895  
  5896      methods().forEach(function(method) {
  5897          method.attachToObject(self);
  5898          method.setRequestManager(self._requestManager);
  5899      });
  5900  
  5901      properties().forEach(function(p) {
  5902          p.attachToObject(self);
  5903          p.setRequestManager(self._requestManager);
  5904      });
  5905  }
  5906  
  5907  var methods = function () {
  5908      var blockNetworkRead = new Method({
  5909          name: 'blockNetworkRead',
  5910          call: 'bzz_blockNetworkRead',
  5911          params: 1,
  5912          inputFormatter: [null]
  5913      });
  5914  
  5915      var syncEnabled = new Method({
  5916          name: 'syncEnabled',
  5917          call: 'bzz_syncEnabled',
  5918          params: 1,
  5919          inputFormatter: [null]
  5920      });
  5921  
  5922      var swapEnabled = new Method({
  5923          name: 'swapEnabled',
  5924          call: 'bzz_swapEnabled',
  5925          params: 1,
  5926          inputFormatter: [null]
  5927      });
  5928  
  5929      var download = new Method({
  5930          name: 'download',
  5931          call: 'bzz_download',
  5932          params: 2,
  5933          inputFormatter: [null, null]
  5934      });
  5935  
  5936      var upload = new Method({
  5937          name: 'upload',
  5938          call: 'bzz_upload',
  5939          params: 2,
  5940          inputFormatter: [null, null]
  5941      });
  5942  
  5943      var retrieve = new Method({
  5944          name: 'retrieve',
  5945          call: 'bzz_retrieve',
  5946          params: 1,
  5947          inputFormatter: [null]
  5948      });
  5949  
  5950      var store = new Method({
  5951          name: 'store',
  5952          call: 'bzz_store',
  5953          params: 2,
  5954          inputFormatter: [null, null]
  5955      });
  5956  
  5957      var get = new Method({
  5958          name: 'get',
  5959          call: 'bzz_get',
  5960          params: 1,
  5961          inputFormatter: [null]
  5962      });
  5963  
  5964      var put = new Method({
  5965          name: 'put',
  5966          call: 'bzz_put',
  5967          params: 2,
  5968          inputFormatter: [null, null]
  5969      });
  5970  
  5971      var modify = new Method({
  5972          name: 'modify',
  5973          call: 'bzz_modify',
  5974          params: 4,
  5975          inputFormatter: [null, null, null, null]
  5976      });
  5977  
  5978      return [
  5979          blockNetworkRead,
  5980          syncEnabled,
  5981          swapEnabled,
  5982          download,
  5983          upload,
  5984          retrieve,
  5985          store,
  5986          get,
  5987          put,
  5988          modify
  5989      ];
  5990  };
  5991  
  5992  var properties = function () {
  5993      return [
  5994          new Property({
  5995              name: 'hive',
  5996              getter: 'bzz_hive'
  5997          }),
  5998          new Property({
  5999              name: 'info',
  6000              getter: 'bzz_info'
  6001          })
  6002      ];
  6003  };
  6004  
  6005  
  6006  module.exports = Swarm;
  6007  
  6008  },{"../method":36,"../property":45}],43:[function(require,module,exports){
  6009  /*
  6010      This file is part of web3.js.
  6011  
  6012      web3.js is free software: you can redistribute it and/or modify
  6013      it under the terms of the GNU Lesser General Public License as published by
  6014      the Free Software Foundation, either version 3 of the License, or
  6015      (at your option) any later version.
  6016  
  6017      web3.js is distributed in the hope that it will be useful,
  6018      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6019      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6020      GNU Lesser General Public License for more details.
  6021  
  6022      You should have received a copy of the GNU Lesser General Public License
  6023      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6024  */
  6025  /** @file watches.js
  6026   * @authors:
  6027   *   Marek Kotewicz <marek@ethdev.com>
  6028   * @date 2015
  6029   */
  6030  
  6031  var Method = require('../method');
  6032  
  6033  /// @returns an array of objects describing web3.zond.filter api methods
  6034  var zond = function () {
  6035      var newFilterCall = function (args) {
  6036          var type = args[0];
  6037  
  6038          switch(type) {
  6039              case 'latest':
  6040                  args.shift();
  6041                  this.params = 0;
  6042                  return 'zond_newBlockFilter';
  6043              case 'pending':
  6044                  args.shift();
  6045                  this.params = 0;
  6046                  return 'zond_newPendingTransactionFilter';
  6047              default:
  6048                  return 'zond_newFilter';
  6049          }
  6050      };
  6051  
  6052      var newFilter = new Method({
  6053          name: 'newFilter',
  6054          call: newFilterCall,
  6055          params: 1
  6056      });
  6057  
  6058      var uninstallFilter = new Method({
  6059          name: 'uninstallFilter',
  6060          call: 'zond_uninstallFilter',
  6061          params: 1
  6062      });
  6063  
  6064      var getLogs = new Method({
  6065          name: 'getLogs',
  6066          call: 'zond_getFilterLogs',
  6067          params: 1
  6068      });
  6069  
  6070      var poll = new Method({
  6071          name: 'poll',
  6072          call: 'zond_getFilterChanges',
  6073          params: 1
  6074      });
  6075  
  6076      return [
  6077          newFilter,
  6078          uninstallFilter,
  6079          getLogs,
  6080          poll
  6081      ];
  6082  };
  6083  
  6084  /// @returns an array of objects describing web3.shh.watch api methods
  6085  var shh = function () {
  6086  
  6087      return [
  6088          new Method({
  6089              name: 'newFilter',
  6090              call: 'shh_newMessageFilter',
  6091              params: 1
  6092          }),
  6093          new Method({
  6094              name: 'uninstallFilter',
  6095              call: 'shh_deleteMessageFilter',
  6096              params: 1
  6097          }),
  6098          new Method({
  6099              name: 'getLogs',
  6100              call: 'shh_getFilterMessages',
  6101              params: 1
  6102          }),
  6103          new Method({
  6104              name: 'poll',
  6105              call: 'shh_getFilterMessages',
  6106              params: 1
  6107          })
  6108      ];
  6109  };
  6110  
  6111  module.exports = {
  6112      zond: zond,
  6113      shh: shh
  6114  };
  6115  
  6116  
  6117  },{"../method":36}],44:[function(require,module,exports){
  6118  /*
  6119      This file is part of web3.js.
  6120  
  6121      web3.js is free software: you can redistribute it and/or modify
  6122      it under the terms of the GNU Lesser General Public License as published by
  6123      the Free Software Foundation, either version 3 of the License, or
  6124      (at your option) any later version.
  6125  
  6126      web3.js is distributed in the hope that it will be useful,
  6127      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6128      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6129      GNU Lesser General Public License for more details.
  6130  
  6131      You should have received a copy of the GNU Lesser General Public License
  6132      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6133  */
  6134  /** 
  6135   * @file namereg.js
  6136   * @author Marek Kotewicz <marek@ethdev.com>
  6137   * @date 2015
  6138   */
  6139  
  6140  var globalRegistrarAbi = require('../contracts/GlobalRegistrar.json');
  6141  var icapRegistrarAbi= require('../contracts/ICAPRegistrar.json');
  6142  
  6143  var globalNameregAddress = '0xc6d9d2cd449a754c494264e1809c50e34d64562b';
  6144  var icapNameregAddress = '0xa1a111bc074c9cfa781f0c38e63bd51c91b8af00';
  6145  
  6146  module.exports = {
  6147      global: {
  6148          abi: globalRegistrarAbi,
  6149          address: globalNameregAddress
  6150      },
  6151      icap: {
  6152          abi: icapRegistrarAbi,
  6153          address: icapNameregAddress
  6154      }
  6155  };
  6156  
  6157  
  6158  },{"../contracts/GlobalRegistrar.json":1,"../contracts/ICAPRegistrar.json":2}],45:[function(require,module,exports){
  6159  /*
  6160      This file is part of web3.js.
  6161  
  6162      web3.js is free software: you can redistribute it and/or modify
  6163      it under the terms of the GNU Lesser General Public License as published by
  6164      the Free Software Foundation, either version 3 of the License, or
  6165      (at your option) any later version.
  6166  
  6167      web3.js is distributed in the hope that it will be useful,
  6168      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6169      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6170      GNU Lesser General Public License for more details.
  6171  
  6172      You should have received a copy of the GNU Lesser General Public License
  6173      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6174  */
  6175  /**
  6176   * @file property.js
  6177   * @author Fabian Vogelsteller <fabian@frozeman.de>
  6178   * @author Marek Kotewicz <marek@ethdev.com>
  6179   * @date 2015
  6180   */
  6181  
  6182  var utils = require('../utils/utils');
  6183  
  6184  var Property = function (options) {
  6185      this.name = options.name;
  6186      this.getter = options.getter;
  6187      this.setter = options.setter;
  6188      this.outputFormatter = options.outputFormatter;
  6189      this.inputFormatter = options.inputFormatter;
  6190      this.requestManager = null;
  6191  };
  6192  
  6193  Property.prototype.setRequestManager = function (rm) {
  6194      this.requestManager = rm;
  6195  };
  6196  
  6197  /**
  6198   * Should be called to format input args of method
  6199   *
  6200   * @method formatInput
  6201   * @param {Array}
  6202   * @return {Array}
  6203   */
  6204  Property.prototype.formatInput = function (arg) {
  6205      return this.inputFormatter ? this.inputFormatter(arg) : arg;
  6206  };
  6207  
  6208  /**
  6209   * Should be called to format output(result) of method
  6210   *
  6211   * @method formatOutput
  6212   * @param {Object}
  6213   * @return {Object}
  6214   */
  6215  Property.prototype.formatOutput = function (result) {
  6216      return this.outputFormatter && result !== null && result !== undefined ? this.outputFormatter(result) : result;
  6217  };
  6218  
  6219  /**
  6220   * Should be used to extract callback from array of arguments. Modifies input param
  6221   *
  6222   * @method extractCallback
  6223   * @param {Array} arguments
  6224   * @return {Function|Null} callback, if exists
  6225   */
  6226  Property.prototype.extractCallback = function (args) {
  6227      if (utils.isFunction(args[args.length - 1])) {
  6228          return args.pop(); // modify the args array!
  6229      }
  6230  };
  6231  
  6232  
  6233  /**
  6234   * Should attach function to method
  6235   *
  6236   * @method attachToObject
  6237   * @param {Object}
  6238   * @param {Function}
  6239   */
  6240  Property.prototype.attachToObject = function (obj) {
  6241      var proto = {
  6242          get: this.buildGet(),
  6243          enumerable: true
  6244      };
  6245  
  6246      var names = this.name.split('.');
  6247      var name = names[0];
  6248      if (names.length > 1) {
  6249          obj[names[0]] = obj[names[0]] || {};
  6250          obj = obj[names[0]];
  6251          name = names[1];
  6252      }
  6253  
  6254      Object.defineProperty(obj, name, proto);
  6255      obj[asyncGetterName(name)] = this.buildAsyncGet();
  6256  };
  6257  
  6258  var asyncGetterName = function (name) {
  6259      return 'get' + name.charAt(0).toUpperCase() + name.slice(1);
  6260  };
  6261  
  6262  Property.prototype.buildGet = function () {
  6263      var property = this;
  6264      return function get() {
  6265          return property.formatOutput(property.requestManager.send({
  6266              method: property.getter
  6267          }));
  6268      };
  6269  };
  6270  
  6271  Property.prototype.buildAsyncGet = function () {
  6272      var property = this;
  6273      var get = function (callback) {
  6274          property.requestManager.sendAsync({
  6275              method: property.getter
  6276          }, function (err, result) {
  6277              callback(err, property.formatOutput(result));
  6278          });
  6279      };
  6280      get.request = this.request.bind(this);
  6281      return get;
  6282  };
  6283  
  6284  /**
  6285   * Should be called to create pure JSONRPC request which can be used in batch request
  6286   *
  6287   * @method request
  6288   * @param {...} params
  6289   * @return {Object} jsonrpc request
  6290   */
  6291  Property.prototype.request = function () {
  6292      var payload = {
  6293          method: this.getter,
  6294          params: [],
  6295          callback: this.extractCallback(Array.prototype.slice.call(arguments))
  6296      };
  6297      payload.format = this.formatOutput.bind(this);
  6298      return payload;
  6299  };
  6300  
  6301  module.exports = Property;
  6302  
  6303  
  6304  },{"../utils/utils":20}],46:[function(require,module,exports){
  6305  /*
  6306      This file is part of web3.js.
  6307  
  6308      web3.js is free software: you can redistribute it and/or modify
  6309      it under the terms of the GNU Lesser General Public License as published by
  6310      the Free Software Foundation, either version 3 of the License, or
  6311      (at your option) any later version.
  6312  
  6313      web3.js is distributed in the hope that it will be useful,
  6314      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6315      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6316      GNU Lesser General Public License for more details.
  6317  
  6318      You should have received a copy of the GNU Lesser General Public License
  6319      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6320  */
  6321  /** 
  6322   * @file requestmanager.js
  6323   * @author Jeffrey Wilcke <jeff@ethdev.com>
  6324   * @author Marek Kotewicz <marek@ethdev.com>
  6325   * @author Marian Oancea <marian@ethdev.com>
  6326   * @author Fabian Vogelsteller <fabian@ethdev.com>
  6327   * @author Gav Wood <g@ethdev.com>
  6328   * @date 2014
  6329   */
  6330  
  6331  var Jsonrpc = require('./jsonrpc');
  6332  var utils = require('../utils/utils');
  6333  var c = require('../utils/config');
  6334  var errors = require('./errors');
  6335  
  6336  /**
  6337   * It's responsible for passing messages to providers
  6338   * It's also responsible for polling the ethereum node for incoming messages
  6339   * Default poll timeout is 1 second
  6340   * Singleton
  6341   */
  6342  var RequestManager = function (provider) {
  6343      this.provider = provider;
  6344      this.polls = {};
  6345      this.timeout = null;
  6346  };
  6347  
  6348  /**
  6349   * Should be used to synchronously send request
  6350   *
  6351   * @method send
  6352   * @param {Object} data
  6353   * @return {Object}
  6354   */
  6355  RequestManager.prototype.send = function (data) {
  6356      if (!this.provider) {
  6357          console.error(errors.InvalidProvider());
  6358          return null;
  6359      }
  6360  
  6361      var payload = Jsonrpc.toPayload(data.method, data.params);
  6362      var result = this.provider.send(payload);
  6363  
  6364      if (!Jsonrpc.isValidResponse(result)) {
  6365          throw errors.InvalidResponse(result);
  6366      }
  6367  
  6368      return result.result;
  6369  };
  6370  
  6371  /**
  6372   * Should be used to asynchronously send request
  6373   *
  6374   * @method sendAsync
  6375   * @param {Object} data
  6376   * @param {Function} callback
  6377   */
  6378  RequestManager.prototype.sendAsync = function (data, callback) {
  6379      if (!this.provider) {
  6380          return callback(errors.InvalidProvider());
  6381      }
  6382  
  6383      var payload = Jsonrpc.toPayload(data.method, data.params);
  6384      this.provider.sendAsync(payload, function (err, result) {
  6385          if (err) {
  6386              return callback(err);
  6387          }
  6388          
  6389          if (!Jsonrpc.isValidResponse(result)) {
  6390              return callback(errors.InvalidResponse(result));
  6391          }
  6392  
  6393          callback(null, result.result);
  6394      });
  6395  };
  6396  
  6397  /**
  6398   * Should be called to asynchronously send batch request
  6399   *
  6400   * @method sendBatch
  6401   * @param {Array} batch data
  6402   * @param {Function} callback
  6403   */
  6404  RequestManager.prototype.sendBatch = function (data, callback) {
  6405      if (!this.provider) {
  6406          return callback(errors.InvalidProvider());
  6407      }
  6408  
  6409      var payload = Jsonrpc.toBatchPayload(data);
  6410  
  6411      this.provider.sendAsync(payload, function (err, results) {
  6412          if (err) {
  6413              return callback(err);
  6414          }
  6415  
  6416          if (!utils.isArray(results)) {
  6417              return callback(errors.InvalidResponse(results));
  6418          }
  6419  
  6420          callback(err, results);
  6421      }); 
  6422  };
  6423  
  6424  /**
  6425   * Should be used to set provider of request manager
  6426   *
  6427   * @method setProvider
  6428   * @param {Object}
  6429   */
  6430  RequestManager.prototype.setProvider = function (p) {
  6431      this.provider = p;
  6432  };
  6433  
  6434  /**
  6435   * Should be used to start polling
  6436   *
  6437   * @method startPolling
  6438   * @param {Object} data
  6439   * @param {Number} pollId
  6440   * @param {Function} callback
  6441   * @param {Function} uninstall
  6442   *
  6443   * @todo cleanup number of params
  6444   */
  6445  RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) {
  6446      this.polls[pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall};
  6447  
  6448  
  6449      // start polling
  6450      if (!this.timeout) {
  6451          this.poll();
  6452      }
  6453  };
  6454  
  6455  /**
  6456   * Should be used to stop polling for filter with given id
  6457   *
  6458   * @method stopPolling
  6459   * @param {Number} pollId
  6460   */
  6461  RequestManager.prototype.stopPolling = function (pollId) {
  6462      delete this.polls[pollId];
  6463  
  6464      // stop polling
  6465      if(Object.keys(this.polls).length === 0 && this.timeout) {
  6466          clearTimeout(this.timeout);
  6467          this.timeout = null;
  6468      }
  6469  };
  6470  
  6471  /**
  6472   * Should be called to reset the polling mechanism of the request manager
  6473   *
  6474   * @method reset
  6475   */
  6476  RequestManager.prototype.reset = function (keepIsSyncing) {
  6477      /*jshint maxcomplexity:5 */
  6478  
  6479      for (var key in this.polls) {
  6480          // remove all polls, except sync polls,
  6481          // they need to be removed manually by calling syncing.stopWatching()
  6482          if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) {
  6483              this.polls[key].uninstall();
  6484              delete this.polls[key];
  6485          }
  6486      }
  6487  
  6488      // stop polling
  6489      if(Object.keys(this.polls).length === 0 && this.timeout) {
  6490          clearTimeout(this.timeout);
  6491          this.timeout = null;
  6492      }
  6493  };
  6494  
  6495  /**
  6496   * Should be called to poll for changes on filter with given id
  6497   *
  6498   * @method poll
  6499   */
  6500  RequestManager.prototype.poll = function () {
  6501      /*jshint maxcomplexity: 6 */
  6502      this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT);
  6503  
  6504      if (Object.keys(this.polls).length === 0) {
  6505          return;
  6506      }
  6507  
  6508      if (!this.provider) {
  6509          console.error(errors.InvalidProvider());
  6510          return;
  6511      }
  6512  
  6513      var pollsData = [];
  6514      var pollsIds = [];
  6515      for (var key in this.polls) {
  6516          pollsData.push(this.polls[key].data);
  6517          pollsIds.push(key);
  6518      }
  6519  
  6520      if (pollsData.length === 0) {
  6521          return;
  6522      }
  6523  
  6524      var payload = Jsonrpc.toBatchPayload(pollsData);
  6525      
  6526      // map the request id to they poll id
  6527      var pollsIdMap = {};
  6528      payload.forEach(function(load, index){
  6529          pollsIdMap[load.id] = pollsIds[index];
  6530      });
  6531  
  6532  
  6533      var self = this;
  6534      this.provider.sendAsync(payload, function (error, results) {
  6535  
  6536  
  6537          // TODO: console log?
  6538          if (error) {
  6539              return;
  6540          }
  6541  
  6542          if (!utils.isArray(results)) {
  6543              throw errors.InvalidResponse(results);
  6544          }
  6545          results.map(function (result) {
  6546              var id = pollsIdMap[result.id];
  6547  
  6548              // make sure the filter is still installed after arrival of the request
  6549              if (self.polls[id]) {
  6550                  result.callback = self.polls[id].callback;
  6551                  return result;
  6552              } else
  6553                  return false;
  6554          }).filter(function (result) {
  6555              return !!result; 
  6556          }).filter(function (result) {
  6557              var valid = Jsonrpc.isValidResponse(result);
  6558              if (!valid) {
  6559                  result.callback(errors.InvalidResponse(result));
  6560              }
  6561              return valid;
  6562          }).forEach(function (result) {
  6563              result.callback(null, result.result);
  6564          });
  6565      });
  6566  };
  6567  
  6568  module.exports = RequestManager;
  6569  
  6570  
  6571  },{"../utils/config":18,"../utils/utils":20,"./errors":26,"./jsonrpc":35}],47:[function(require,module,exports){
  6572  
  6573  
  6574  var Settings = function () {
  6575      this.defaultBlock = 'latest';
  6576      this.defaultAccount = undefined;
  6577  };
  6578  
  6579  module.exports = Settings;
  6580  
  6581  
  6582  },{}],48:[function(require,module,exports){
  6583  /*
  6584      This file is part of web3.js.
  6585  
  6586      web3.js is free software: you can redistribute it and/or modify
  6587      it under the terms of the GNU Lesser General Public License as published by
  6588      the Free Software Foundation, either version 3 of the License, or
  6589      (at your option) any later version.
  6590  
  6591      web3.js is distributed in the hope that it will be useful,
  6592      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6593      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6594      GNU Lesser General Public License for more details.
  6595  
  6596      You should have received a copy of the GNU Lesser General Public License
  6597      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6598  */
  6599  /** @file syncing.js
  6600   * @authors:
  6601   *   Fabian Vogelsteller <fabian@ethdev.com>
  6602   * @date 2015
  6603   */
  6604  
  6605  var formatters = require('./formatters');
  6606  var utils = require('../utils/utils');
  6607  
  6608  var count = 1;
  6609  
  6610  /**
  6611  Adds the callback and sets up the methods, to iterate over the results.
  6612  
  6613  @method pollSyncing
  6614  @param {Object} self
  6615  */
  6616  var pollSyncing = function(self) {
  6617  
  6618      var onMessage = function (error, sync) {
  6619          if (error) {
  6620              return self.callbacks.forEach(function (callback) {
  6621                  callback(error);
  6622              });
  6623          }
  6624  
  6625          if(utils.isObject(sync) && sync.startingBlock)
  6626              sync = formatters.outputSyncingFormatter(sync);
  6627  
  6628          self.callbacks.forEach(function (callback) {
  6629              if (self.lastSyncState !== sync) {
  6630                  
  6631                  // call the callback with true first so the app can stop anything, before receiving the sync data
  6632                  if(!self.lastSyncState && utils.isObject(sync))
  6633                      callback(null, true);
  6634                  
  6635                  // call on the next CPU cycle, so the actions of the sync stop can be processes first
  6636                  setTimeout(function() {
  6637                      callback(null, sync);
  6638                  }, 0);
  6639                  
  6640                  self.lastSyncState = sync;
  6641              }
  6642          });
  6643      };
  6644  
  6645      self.requestManager.startPolling({
  6646          method: 'zond_syncing',
  6647          params: [],
  6648      }, self.pollId, onMessage, self.stopWatching.bind(self));
  6649  
  6650  };
  6651  
  6652  var IsSyncing = function (requestManager, callback) {
  6653      this.requestManager = requestManager;
  6654      this.pollId = 'syncPoll_'+ count++;
  6655      this.callbacks = [];
  6656      this.addCallback(callback);
  6657      this.lastSyncState = false;
  6658      pollSyncing(this);
  6659  
  6660      return this;
  6661  };
  6662  
  6663  IsSyncing.prototype.addCallback = function (callback) {
  6664      if(callback)
  6665          this.callbacks.push(callback);
  6666      return this;
  6667  };
  6668  
  6669  IsSyncing.prototype.stopWatching = function () {
  6670      this.requestManager.stopPolling(this.pollId);
  6671      this.callbacks = [];
  6672  };
  6673  
  6674  module.exports = IsSyncing;
  6675  
  6676  
  6677  },{"../utils/utils":20,"./formatters":30}],49:[function(require,module,exports){
  6678  /*
  6679      This file is part of web3.js.
  6680  
  6681      web3.js is free software: you can redistribute it and/or modify
  6682      it under the terms of the GNU Lesser General Public License as published by
  6683      the Free Software Foundation, either version 3 of the License, or
  6684      (at your option) any later version.
  6685  
  6686      web3.js is distributed in the hope that it will be useful,
  6687      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6688      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6689      GNU Lesser General Public License for more details.
  6690  
  6691      You should have received a copy of the GNU Lesser General Public License
  6692      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6693  */
  6694  /** 
  6695   * @file transfer.js
  6696   * @author Marek Kotewicz <marek@ethdev.com>
  6697   * @date 2015
  6698   */
  6699  
  6700  var Iban = require('./iban');
  6701  var exchangeAbi = require('../contracts/SmartExchange.json');
  6702  
  6703  /**
  6704   * Should be used to make Iban transfer
  6705   *
  6706   * @method transfer
  6707   * @param {String} from
  6708   * @param {String} to iban
  6709   * @param {Value} value to be tranfered
  6710   * @param {Function} callback, callback
  6711   */
  6712  var transfer = function (zond, from, to, value, callback) {
  6713      var iban = new Iban(to); 
  6714      if (!iban.isValid()) {
  6715          throw new Error('invalid iban address');
  6716      }
  6717  
  6718      if (iban.isDirect()) {
  6719          return transferToAddress(zond, from, iban.address(), value, callback);
  6720      }
  6721  
  6722      if (!callback) {
  6723          var address = zond.icapNamereg().addr(iban.institution());
  6724          return deposit(zond, from, address, value, iban.client());
  6725      }
  6726  
  6727      zond.icapNamereg().addr(iban.institution(), function (err, address) {
  6728          return deposit(zond, from, address, value, iban.client(), callback);
  6729      });
  6730      
  6731  };
  6732  
  6733  /**
  6734   * Should be used to transfer funds to certain address
  6735   *
  6736   * @method transferToAddress
  6737   * @param {String} from
  6738   * @param {String} to
  6739   * @param {Value} value to be tranfered
  6740   * @param {Function} callback, callback
  6741   */
  6742  var transferToAddress = function (zond, from, to, value, callback) {
  6743      return zond.sendTransaction({
  6744          address: to,
  6745          from: from,
  6746          value: value
  6747      }, callback);
  6748  };
  6749  
  6750  /**
  6751   * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!)
  6752   *
  6753   * @method deposit
  6754   * @param {String} from
  6755   * @param {String} to
  6756   * @param {Value} value to be transferred
  6757   * @param {String} client unique identifier
  6758   * @param {Function} callback, callback
  6759   */
  6760  var deposit = function (zond, from, to, value, client, callback) {
  6761      var abi = exchangeAbi;
  6762      return zond.contract(abi).at(to).deposit(client, {
  6763          from: from,
  6764          value: value
  6765      }, callback);
  6766  };
  6767  
  6768  module.exports = transfer;
  6769  
  6770  
  6771  },{"../contracts/SmartExchange.json":3,"./iban":33}],50:[function(require,module,exports){
  6772  
  6773  },{}],51:[function(require,module,exports){
  6774  ;(function (root, factory, undef) {
  6775  	if (typeof exports === "object") {
  6776  		// CommonJS
  6777  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
  6778  	}
  6779  	else if (typeof define === "function" && define.amd) {
  6780  		// AMD
  6781  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
  6782  	}
  6783  	else {
  6784  		// Global (browser)
  6785  		factory(root.CryptoJS);
  6786  	}
  6787  }(this, function (CryptoJS) {
  6788  
  6789  	(function () {
  6790  	    // Shortcuts
  6791  	    var C = CryptoJS;
  6792  	    var C_lib = C.lib;
  6793  	    var BlockCipher = C_lib.BlockCipher;
  6794  	    var C_algo = C.algo;
  6795  
  6796  	    // Lookup tables
  6797  	    var SBOX = [];
  6798  	    var INV_SBOX = [];
  6799  	    var SUB_MIX_0 = [];
  6800  	    var SUB_MIX_1 = [];
  6801  	    var SUB_MIX_2 = [];
  6802  	    var SUB_MIX_3 = [];
  6803  	    var INV_SUB_MIX_0 = [];
  6804  	    var INV_SUB_MIX_1 = [];
  6805  	    var INV_SUB_MIX_2 = [];
  6806  	    var INV_SUB_MIX_3 = [];
  6807  
  6808  	    // Compute lookup tables
  6809  	    (function () {
  6810  	        // Compute double table
  6811  	        var d = [];
  6812  	        for (var i = 0; i < 256; i++) {
  6813  	            if (i < 128) {
  6814  	                d[i] = i << 1;
  6815  	            } else {
  6816  	                d[i] = (i << 1) ^ 0x11b;
  6817  	            }
  6818  	        }
  6819  
  6820  	        // Walk GF(2^8)
  6821  	        var x = 0;
  6822  	        var xi = 0;
  6823  	        for (var i = 0; i < 256; i++) {
  6824  	            // Compute sbox
  6825  	            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
  6826  	            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
  6827  	            SBOX[x] = sx;
  6828  	            INV_SBOX[sx] = x;
  6829  
  6830  	            // Compute multiplication
  6831  	            var x2 = d[x];
  6832  	            var x4 = d[x2];
  6833  	            var x8 = d[x4];
  6834  
  6835  	            // Compute sub bytes, mix columns tables
  6836  	            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
  6837  	            SUB_MIX_0[x] = (t << 24) | (t >>> 8);
  6838  	            SUB_MIX_1[x] = (t << 16) | (t >>> 16);
  6839  	            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);
  6840  	            SUB_MIX_3[x] = t;
  6841  
  6842  	            // Compute inv sub bytes, inv mix columns tables
  6843  	            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
  6844  	            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
  6845  	            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
  6846  	            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);
  6847  	            INV_SUB_MIX_3[sx] = t;
  6848  
  6849  	            // Compute next counter
  6850  	            if (!x) {
  6851  	                x = xi = 1;
  6852  	            } else {
  6853  	                x = x2 ^ d[d[d[x8 ^ x2]]];
  6854  	                xi ^= d[d[xi]];
  6855  	            }
  6856  	        }
  6857  	    }());
  6858  
  6859  	    // Precomputed Rcon lookup
  6860  	    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
  6861  
  6862  	    /**
  6863  	     * AES block cipher algorithm.
  6864  	     */
  6865  	    var AES = C_algo.AES = BlockCipher.extend({
  6866  	        _doReset: function () {
  6867  	            // Skip reset of nRounds has been set before and key did not change
  6868  	            if (this._nRounds && this._keyPriorReset === this._key) {
  6869  	                return;
  6870  	            }
  6871  
  6872  	            // Shortcuts
  6873  	            var key = this._keyPriorReset = this._key;
  6874  	            var keyWords = key.words;
  6875  	            var keySize = key.sigBytes / 4;
  6876  
  6877  	            // Compute number of rounds
  6878  	            var nRounds = this._nRounds = keySize + 6;
  6879  
  6880  	            // Compute number of key schedule rows
  6881  	            var ksRows = (nRounds + 1) * 4;
  6882  
  6883  	            // Compute key schedule
  6884  	            var keySchedule = this._keySchedule = [];
  6885  	            for (var ksRow = 0; ksRow < ksRows; ksRow++) {
  6886  	                if (ksRow < keySize) {
  6887  	                    keySchedule[ksRow] = keyWords[ksRow];
  6888  	                } else {
  6889  	                    var t = keySchedule[ksRow - 1];
  6890  
  6891  	                    if (!(ksRow % keySize)) {
  6892  	                        // Rot word
  6893  	                        t = (t << 8) | (t >>> 24);
  6894  
  6895  	                        // Sub word
  6896  	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
  6897  
  6898  	                        // Mix Rcon
  6899  	                        t ^= RCON[(ksRow / keySize) | 0] << 24;
  6900  	                    } else if (keySize > 6 && ksRow % keySize == 4) {
  6901  	                        // Sub word
  6902  	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
  6903  	                    }
  6904  
  6905  	                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
  6906  	                }
  6907  	            }
  6908  
  6909  	            // Compute inv key schedule
  6910  	            var invKeySchedule = this._invKeySchedule = [];
  6911  	            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
  6912  	                var ksRow = ksRows - invKsRow;
  6913  
  6914  	                if (invKsRow % 4) {
  6915  	                    var t = keySchedule[ksRow];
  6916  	                } else {
  6917  	                    var t = keySchedule[ksRow - 4];
  6918  	                }
  6919  
  6920  	                if (invKsRow < 4 || ksRow <= 4) {
  6921  	                    invKeySchedule[invKsRow] = t;
  6922  	                } else {
  6923  	                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
  6924  	                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
  6925  	                }
  6926  	            }
  6927  	        },
  6928  
  6929  	        encryptBlock: function (M, offset) {
  6930  	            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
  6931  	        },
  6932  
  6933  	        decryptBlock: function (M, offset) {
  6934  	            // Swap 2nd and 4th rows
  6935  	            var t = M[offset + 1];
  6936  	            M[offset + 1] = M[offset + 3];
  6937  	            M[offset + 3] = t;
  6938  
  6939  	            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
  6940  
  6941  	            // Inv swap 2nd and 4th rows
  6942  	            var t = M[offset + 1];
  6943  	            M[offset + 1] = M[offset + 3];
  6944  	            M[offset + 3] = t;
  6945  	        },
  6946  
  6947  	        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
  6948  	            // Shortcut
  6949  	            var nRounds = this._nRounds;
  6950  
  6951  	            // Get input, add round key
  6952  	            var s0 = M[offset]     ^ keySchedule[0];
  6953  	            var s1 = M[offset + 1] ^ keySchedule[1];
  6954  	            var s2 = M[offset + 2] ^ keySchedule[2];
  6955  	            var s3 = M[offset + 3] ^ keySchedule[3];
  6956  
  6957  	            // Key schedule row counter
  6958  	            var ksRow = 4;
  6959  
  6960  	            // Rounds
  6961  	            for (var round = 1; round < nRounds; round++) {
  6962  	                // Shift rows, sub bytes, mix columns, add round key
  6963  	                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
  6964  	                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
  6965  	                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
  6966  	                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
  6967  
  6968  	                // Update state
  6969  	                s0 = t0;
  6970  	                s1 = t1;
  6971  	                s2 = t2;
  6972  	                s3 = t3;
  6973  	            }
  6974  
  6975  	            // Shift rows, sub bytes, add round key
  6976  	            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
  6977  	            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
  6978  	            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
  6979  	            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
  6980  
  6981  	            // Set output
  6982  	            M[offset]     = t0;
  6983  	            M[offset + 1] = t1;
  6984  	            M[offset + 2] = t2;
  6985  	            M[offset + 3] = t3;
  6986  	        },
  6987  
  6988  	        keySize: 256/32
  6989  	    });
  6990  
  6991  	    /**
  6992  	     * Shortcut functions to the cipher's object interface.
  6993  	     *
  6994  	     * @example
  6995  	     *
  6996  	     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
  6997  	     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
  6998  	     */
  6999  	    C.AES = BlockCipher._createHelper(AES);
  7000  	}());
  7001  
  7002  
  7003  	return CryptoJS.AES;
  7004  
  7005  }));
  7006  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],52:[function(require,module,exports){
  7007  ;(function (root, factory) {
  7008  	if (typeof exports === "object") {
  7009  		// CommonJS
  7010  		module.exports = exports = factory(require("./core"));
  7011  	}
  7012  	else if (typeof define === "function" && define.amd) {
  7013  		// AMD
  7014  		define(["./core"], factory);
  7015  	}
  7016  	else {
  7017  		// Global (browser)
  7018  		factory(root.CryptoJS);
  7019  	}
  7020  }(this, function (CryptoJS) {
  7021  
  7022  	/**
  7023  	 * Cipher core components.
  7024  	 */
  7025  	CryptoJS.lib.Cipher || (function (undefined) {
  7026  	    // Shortcuts
  7027  	    var C = CryptoJS;
  7028  	    var C_lib = C.lib;
  7029  	    var Base = C_lib.Base;
  7030  	    var WordArray = C_lib.WordArray;
  7031  	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
  7032  	    var C_enc = C.enc;
  7033  	    var Utf8 = C_enc.Utf8;
  7034  	    var Base64 = C_enc.Base64;
  7035  	    var C_algo = C.algo;
  7036  	    var EvpKDF = C_algo.EvpKDF;
  7037  
  7038  	    /**
  7039  	     * Abstract base cipher template.
  7040  	     *
  7041  	     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
  7042  	     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
  7043  	     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
  7044  	     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
  7045  	     */
  7046  	    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
  7047  	        /**
  7048  	         * Configuration options.
  7049  	         *
  7050  	         * @property {WordArray} iv The IV to use for this operation.
  7051  	         */
  7052  	        cfg: Base.extend(),
  7053  
  7054  	        /**
  7055  	         * Creates this cipher in encryption mode.
  7056  	         *
  7057  	         * @param {WordArray} key The key.
  7058  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7059  	         *
  7060  	         * @return {Cipher} A cipher instance.
  7061  	         *
  7062  	         * @static
  7063  	         *
  7064  	         * @example
  7065  	         *
  7066  	         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
  7067  	         */
  7068  	        createEncryptor: function (key, cfg) {
  7069  	            return this.create(this._ENC_XFORM_MODE, key, cfg);
  7070  	        },
  7071  
  7072  	        /**
  7073  	         * Creates this cipher in decryption mode.
  7074  	         *
  7075  	         * @param {WordArray} key The key.
  7076  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7077  	         *
  7078  	         * @return {Cipher} A cipher instance.
  7079  	         *
  7080  	         * @static
  7081  	         *
  7082  	         * @example
  7083  	         *
  7084  	         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
  7085  	         */
  7086  	        createDecryptor: function (key, cfg) {
  7087  	            return this.create(this._DEC_XFORM_MODE, key, cfg);
  7088  	        },
  7089  
  7090  	        /**
  7091  	         * Initializes a newly created cipher.
  7092  	         *
  7093  	         * @param {number} xformMode Either the encryption or decryption transormation mode constant.
  7094  	         * @param {WordArray} key The key.
  7095  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7096  	         *
  7097  	         * @example
  7098  	         *
  7099  	         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
  7100  	         */
  7101  	        init: function (xformMode, key, cfg) {
  7102  	            // Apply config defaults
  7103  	            this.cfg = this.cfg.extend(cfg);
  7104  
  7105  	            // Store transform mode and key
  7106  	            this._xformMode = xformMode;
  7107  	            this._key = key;
  7108  
  7109  	            // Set initial values
  7110  	            this.reset();
  7111  	        },
  7112  
  7113  	        /**
  7114  	         * Resets this cipher to its initial state.
  7115  	         *
  7116  	         * @example
  7117  	         *
  7118  	         *     cipher.reset();
  7119  	         */
  7120  	        reset: function () {
  7121  	            // Reset data buffer
  7122  	            BufferedBlockAlgorithm.reset.call(this);
  7123  
  7124  	            // Perform concrete-cipher logic
  7125  	            this._doReset();
  7126  	        },
  7127  
  7128  	        /**
  7129  	         * Adds data to be encrypted or decrypted.
  7130  	         *
  7131  	         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
  7132  	         *
  7133  	         * @return {WordArray} The data after processing.
  7134  	         *
  7135  	         * @example
  7136  	         *
  7137  	         *     var encrypted = cipher.process('data');
  7138  	         *     var encrypted = cipher.process(wordArray);
  7139  	         */
  7140  	        process: function (dataUpdate) {
  7141  	            // Append
  7142  	            this._append(dataUpdate);
  7143  
  7144  	            // Process available blocks
  7145  	            return this._process();
  7146  	        },
  7147  
  7148  	        /**
  7149  	         * Finalizes the encryption or decryption process.
  7150  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  7151  	         *
  7152  	         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
  7153  	         *
  7154  	         * @return {WordArray} The data after final processing.
  7155  	         *
  7156  	         * @example
  7157  	         *
  7158  	         *     var encrypted = cipher.finalize();
  7159  	         *     var encrypted = cipher.finalize('data');
  7160  	         *     var encrypted = cipher.finalize(wordArray);
  7161  	         */
  7162  	        finalize: function (dataUpdate) {
  7163  	            // Final data update
  7164  	            if (dataUpdate) {
  7165  	                this._append(dataUpdate);
  7166  	            }
  7167  
  7168  	            // Perform concrete-cipher logic
  7169  	            var finalProcessedData = this._doFinalize();
  7170  
  7171  	            return finalProcessedData;
  7172  	        },
  7173  
  7174  	        keySize: 128/32,
  7175  
  7176  	        ivSize: 128/32,
  7177  
  7178  	        _ENC_XFORM_MODE: 1,
  7179  
  7180  	        _DEC_XFORM_MODE: 2,
  7181  
  7182  	        /**
  7183  	         * Creates shortcut functions to a cipher's object interface.
  7184  	         *
  7185  	         * @param {Cipher} cipher The cipher to create a helper for.
  7186  	         *
  7187  	         * @return {Object} An object with encrypt and decrypt shortcut functions.
  7188  	         *
  7189  	         * @static
  7190  	         *
  7191  	         * @example
  7192  	         *
  7193  	         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
  7194  	         */
  7195  	        _createHelper: (function () {
  7196  	            function selectCipherStrategy(key) {
  7197  	                if (typeof key == 'string') {
  7198  	                    return PasswordBasedCipher;
  7199  	                } else {
  7200  	                    return SerializableCipher;
  7201  	                }
  7202  	            }
  7203  
  7204  	            return function (cipher) {
  7205  	                return {
  7206  	                    encrypt: function (message, key, cfg) {
  7207  	                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
  7208  	                    },
  7209  
  7210  	                    decrypt: function (ciphertext, key, cfg) {
  7211  	                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
  7212  	                    }
  7213  	                };
  7214  	            };
  7215  	        }())
  7216  	    });
  7217  
  7218  	    /**
  7219  	     * Abstract base stream cipher template.
  7220  	     *
  7221  	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
  7222  	     */
  7223  	    var StreamCipher = C_lib.StreamCipher = Cipher.extend({
  7224  	        _doFinalize: function () {
  7225  	            // Process partial blocks
  7226  	            var finalProcessedBlocks = this._process(!!'flush');
  7227  
  7228  	            return finalProcessedBlocks;
  7229  	        },
  7230  
  7231  	        blockSize: 1
  7232  	    });
  7233  
  7234  	    /**
  7235  	     * Mode namespace.
  7236  	     */
  7237  	    var C_mode = C.mode = {};
  7238  
  7239  	    /**
  7240  	     * Abstract base block cipher mode template.
  7241  	     */
  7242  	    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
  7243  	        /**
  7244  	         * Creates this mode for encryption.
  7245  	         *
  7246  	         * @param {Cipher} cipher A block cipher instance.
  7247  	         * @param {Array} iv The IV words.
  7248  	         *
  7249  	         * @static
  7250  	         *
  7251  	         * @example
  7252  	         *
  7253  	         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
  7254  	         */
  7255  	        createEncryptor: function (cipher, iv) {
  7256  	            return this.Encryptor.create(cipher, iv);
  7257  	        },
  7258  
  7259  	        /**
  7260  	         * Creates this mode for decryption.
  7261  	         *
  7262  	         * @param {Cipher} cipher A block cipher instance.
  7263  	         * @param {Array} iv The IV words.
  7264  	         *
  7265  	         * @static
  7266  	         *
  7267  	         * @example
  7268  	         *
  7269  	         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
  7270  	         */
  7271  	        createDecryptor: function (cipher, iv) {
  7272  	            return this.Decryptor.create(cipher, iv);
  7273  	        },
  7274  
  7275  	        /**
  7276  	         * Initializes a newly created mode.
  7277  	         *
  7278  	         * @param {Cipher} cipher A block cipher instance.
  7279  	         * @param {Array} iv The IV words.
  7280  	         *
  7281  	         * @example
  7282  	         *
  7283  	         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
  7284  	         */
  7285  	        init: function (cipher, iv) {
  7286  	            this._cipher = cipher;
  7287  	            this._iv = iv;
  7288  	        }
  7289  	    });
  7290  
  7291  	    /**
  7292  	     * Cipher Block Chaining mode.
  7293  	     */
  7294  	    var CBC = C_mode.CBC = (function () {
  7295  	        /**
  7296  	         * Abstract base CBC mode.
  7297  	         */
  7298  	        var CBC = BlockCipherMode.extend();
  7299  
  7300  	        /**
  7301  	         * CBC encryptor.
  7302  	         */
  7303  	        CBC.Encryptor = CBC.extend({
  7304  	            /**
  7305  	             * Processes the data block at offset.
  7306  	             *
  7307  	             * @param {Array} words The data words to operate on.
  7308  	             * @param {number} offset The offset where the block starts.
  7309  	             *
  7310  	             * @example
  7311  	             *
  7312  	             *     mode.processBlock(data.words, offset);
  7313  	             */
  7314  	            processBlock: function (words, offset) {
  7315  	                // Shortcuts
  7316  	                var cipher = this._cipher;
  7317  	                var blockSize = cipher.blockSize;
  7318  
  7319  	                // XOR and encrypt
  7320  	                xorBlock.call(this, words, offset, blockSize);
  7321  	                cipher.encryptBlock(words, offset);
  7322  
  7323  	                // Remember this block to use with next block
  7324  	                this._prevBlock = words.slice(offset, offset + blockSize);
  7325  	            }
  7326  	        });
  7327  
  7328  	        /**
  7329  	         * CBC decryptor.
  7330  	         */
  7331  	        CBC.Decryptor = CBC.extend({
  7332  	            /**
  7333  	             * Processes the data block at offset.
  7334  	             *
  7335  	             * @param {Array} words The data words to operate on.
  7336  	             * @param {number} offset The offset where the block starts.
  7337  	             *
  7338  	             * @example
  7339  	             *
  7340  	             *     mode.processBlock(data.words, offset);
  7341  	             */
  7342  	            processBlock: function (words, offset) {
  7343  	                // Shortcuts
  7344  	                var cipher = this._cipher;
  7345  	                var blockSize = cipher.blockSize;
  7346  
  7347  	                // Remember this block to use with next block
  7348  	                var thisBlock = words.slice(offset, offset + blockSize);
  7349  
  7350  	                // Decrypt and XOR
  7351  	                cipher.decryptBlock(words, offset);
  7352  	                xorBlock.call(this, words, offset, blockSize);
  7353  
  7354  	                // This block becomes the previous block
  7355  	                this._prevBlock = thisBlock;
  7356  	            }
  7357  	        });
  7358  
  7359  	        function xorBlock(words, offset, blockSize) {
  7360  	            // Shortcut
  7361  	            var iv = this._iv;
  7362  
  7363  	            // Choose mixing block
  7364  	            if (iv) {
  7365  	                var block = iv;
  7366  
  7367  	                // Remove IV for subsequent blocks
  7368  	                this._iv = undefined;
  7369  	            } else {
  7370  	                var block = this._prevBlock;
  7371  	            }
  7372  
  7373  	            // XOR blocks
  7374  	            for (var i = 0; i < blockSize; i++) {
  7375  	                words[offset + i] ^= block[i];
  7376  	            }
  7377  	        }
  7378  
  7379  	        return CBC;
  7380  	    }());
  7381  
  7382  	    /**
  7383  	     * Padding namespace.
  7384  	     */
  7385  	    var C_pad = C.pad = {};
  7386  
  7387  	    /**
  7388  	     * PKCS #5/7 padding strategy.
  7389  	     */
  7390  	    var Pkcs7 = C_pad.Pkcs7 = {
  7391  	        /**
  7392  	         * Pads data using the algorithm defined in PKCS #5/7.
  7393  	         *
  7394  	         * @param {WordArray} data The data to pad.
  7395  	         * @param {number} blockSize The multiple that the data should be padded to.
  7396  	         *
  7397  	         * @static
  7398  	         *
  7399  	         * @example
  7400  	         *
  7401  	         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);
  7402  	         */
  7403  	        pad: function (data, blockSize) {
  7404  	            // Shortcut
  7405  	            var blockSizeBytes = blockSize * 4;
  7406  
  7407  	            // Count padding bytes
  7408  	            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
  7409  
  7410  	            // Create padding word
  7411  	            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
  7412  
  7413  	            // Create padding
  7414  	            var paddingWords = [];
  7415  	            for (var i = 0; i < nPaddingBytes; i += 4) {
  7416  	                paddingWords.push(paddingWord);
  7417  	            }
  7418  	            var padding = WordArray.create(paddingWords, nPaddingBytes);
  7419  
  7420  	            // Add padding
  7421  	            data.concat(padding);
  7422  	        },
  7423  
  7424  	        /**
  7425  	         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
  7426  	         *
  7427  	         * @param {WordArray} data The data to unpad.
  7428  	         *
  7429  	         * @static
  7430  	         *
  7431  	         * @example
  7432  	         *
  7433  	         *     CryptoJS.pad.Pkcs7.unpad(wordArray);
  7434  	         */
  7435  	        unpad: function (data) {
  7436  	            // Get number of padding bytes from last byte
  7437  	            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
  7438  
  7439  	            // Remove padding
  7440  	            data.sigBytes -= nPaddingBytes;
  7441  	        }
  7442  	    };
  7443  
  7444  	    /**
  7445  	     * Abstract base block cipher template.
  7446  	     *
  7447  	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
  7448  	     */
  7449  	    var BlockCipher = C_lib.BlockCipher = Cipher.extend({
  7450  	        /**
  7451  	         * Configuration options.
  7452  	         *
  7453  	         * @property {Mode} mode The block mode to use. Default: CBC
  7454  	         * @property {Padding} padding The padding strategy to use. Default: Pkcs7
  7455  	         */
  7456  	        cfg: Cipher.cfg.extend({
  7457  	            mode: CBC,
  7458  	            padding: Pkcs7
  7459  	        }),
  7460  
  7461  	        reset: function () {
  7462  	            // Reset cipher
  7463  	            Cipher.reset.call(this);
  7464  
  7465  	            // Shortcuts
  7466  	            var cfg = this.cfg;
  7467  	            var iv = cfg.iv;
  7468  	            var mode = cfg.mode;
  7469  
  7470  	            // Reset block mode
  7471  	            if (this._xformMode == this._ENC_XFORM_MODE) {
  7472  	                var modeCreator = mode.createEncryptor;
  7473  	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
  7474  	                var modeCreator = mode.createDecryptor;
  7475  
  7476  	                // Keep at least one block in the buffer for unpadding
  7477  	                this._minBufferSize = 1;
  7478  	            }
  7479  	            this._mode = modeCreator.call(mode, this, iv && iv.words);
  7480  	        },
  7481  
  7482  	        _doProcessBlock: function (words, offset) {
  7483  	            this._mode.processBlock(words, offset);
  7484  	        },
  7485  
  7486  	        _doFinalize: function () {
  7487  	            // Shortcut
  7488  	            var padding = this.cfg.padding;
  7489  
  7490  	            // Finalize
  7491  	            if (this._xformMode == this._ENC_XFORM_MODE) {
  7492  	                // Pad data
  7493  	                padding.pad(this._data, this.blockSize);
  7494  
  7495  	                // Process final blocks
  7496  	                var finalProcessedBlocks = this._process(!!'flush');
  7497  	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
  7498  	                // Process final blocks
  7499  	                var finalProcessedBlocks = this._process(!!'flush');
  7500  
  7501  	                // Unpad data
  7502  	                padding.unpad(finalProcessedBlocks);
  7503  	            }
  7504  
  7505  	            return finalProcessedBlocks;
  7506  	        },
  7507  
  7508  	        blockSize: 128/32
  7509  	    });
  7510  
  7511  	    /**
  7512  	     * A collection of cipher parameters.
  7513  	     *
  7514  	     * @property {WordArray} ciphertext The raw ciphertext.
  7515  	     * @property {WordArray} key The key to this ciphertext.
  7516  	     * @property {WordArray} iv The IV used in the ciphering operation.
  7517  	     * @property {WordArray} salt The salt used with a key derivation function.
  7518  	     * @property {Cipher} algorithm The cipher algorithm.
  7519  	     * @property {Mode} mode The block mode used in the ciphering operation.
  7520  	     * @property {Padding} padding The padding scheme used in the ciphering operation.
  7521  	     * @property {number} blockSize The block size of the cipher.
  7522  	     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
  7523  	     */
  7524  	    var CipherParams = C_lib.CipherParams = Base.extend({
  7525  	        /**
  7526  	         * Initializes a newly created cipher params object.
  7527  	         *
  7528  	         * @param {Object} cipherParams An object with any of the possible cipher parameters.
  7529  	         *
  7530  	         * @example
  7531  	         *
  7532  	         *     var cipherParams = CryptoJS.lib.CipherParams.create({
  7533  	         *         ciphertext: ciphertextWordArray,
  7534  	         *         key: keyWordArray,
  7535  	         *         iv: ivWordArray,
  7536  	         *         salt: saltWordArray,
  7537  	         *         algorithm: CryptoJS.algo.AES,
  7538  	         *         mode: CryptoJS.mode.CBC,
  7539  	         *         padding: CryptoJS.pad.PKCS7,
  7540  	         *         blockSize: 4,
  7541  	         *         formatter: CryptoJS.format.OpenSSL
  7542  	         *     });
  7543  	         */
  7544  	        init: function (cipherParams) {
  7545  	            this.mixIn(cipherParams);
  7546  	        },
  7547  
  7548  	        /**
  7549  	         * Converts this cipher params object to a string.
  7550  	         *
  7551  	         * @param {Format} formatter (Optional) The formatting strategy to use.
  7552  	         *
  7553  	         * @return {string} The stringified cipher params.
  7554  	         *
  7555  	         * @throws Error If neither the formatter nor the default formatter is set.
  7556  	         *
  7557  	         * @example
  7558  	         *
  7559  	         *     var string = cipherParams + '';
  7560  	         *     var string = cipherParams.toString();
  7561  	         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);
  7562  	         */
  7563  	        toString: function (formatter) {
  7564  	            return (formatter || this.formatter).stringify(this);
  7565  	        }
  7566  	    });
  7567  
  7568  	    /**
  7569  	     * Format namespace.
  7570  	     */
  7571  	    var C_format = C.format = {};
  7572  
  7573  	    /**
  7574  	     * OpenSSL formatting strategy.
  7575  	     */
  7576  	    var OpenSSLFormatter = C_format.OpenSSL = {
  7577  	        /**
  7578  	         * Converts a cipher params object to an OpenSSL-compatible string.
  7579  	         *
  7580  	         * @param {CipherParams} cipherParams The cipher params object.
  7581  	         *
  7582  	         * @return {string} The OpenSSL-compatible string.
  7583  	         *
  7584  	         * @static
  7585  	         *
  7586  	         * @example
  7587  	         *
  7588  	         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
  7589  	         */
  7590  	        stringify: function (cipherParams) {
  7591  	            // Shortcuts
  7592  	            var ciphertext = cipherParams.ciphertext;
  7593  	            var salt = cipherParams.salt;
  7594  
  7595  	            // Format
  7596  	            if (salt) {
  7597  	                var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
  7598  	            } else {
  7599  	                var wordArray = ciphertext;
  7600  	            }
  7601  
  7602  	            return wordArray.toString(Base64);
  7603  	        },
  7604  
  7605  	        /**
  7606  	         * Converts an OpenSSL-compatible string to a cipher params object.
  7607  	         *
  7608  	         * @param {string} openSSLStr The OpenSSL-compatible string.
  7609  	         *
  7610  	         * @return {CipherParams} The cipher params object.
  7611  	         *
  7612  	         * @static
  7613  	         *
  7614  	         * @example
  7615  	         *
  7616  	         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
  7617  	         */
  7618  	        parse: function (openSSLStr) {
  7619  	            // Parse base64
  7620  	            var ciphertext = Base64.parse(openSSLStr);
  7621  
  7622  	            // Shortcut
  7623  	            var ciphertextWords = ciphertext.words;
  7624  
  7625  	            // Test for salt
  7626  	            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
  7627  	                // Extract salt
  7628  	                var salt = WordArray.create(ciphertextWords.slice(2, 4));
  7629  
  7630  	                // Remove salt from ciphertext
  7631  	                ciphertextWords.splice(0, 4);
  7632  	                ciphertext.sigBytes -= 16;
  7633  	            }
  7634  
  7635  	            return CipherParams.create({ ciphertext: ciphertext, salt: salt });
  7636  	        }
  7637  	    };
  7638  
  7639  	    /**
  7640  	     * A cipher wrapper that returns ciphertext as a serializable cipher params object.
  7641  	     */
  7642  	    var SerializableCipher = C_lib.SerializableCipher = Base.extend({
  7643  	        /**
  7644  	         * Configuration options.
  7645  	         *
  7646  	         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
  7647  	         */
  7648  	        cfg: Base.extend({
  7649  	            format: OpenSSLFormatter
  7650  	        }),
  7651  
  7652  	        /**
  7653  	         * Encrypts a message.
  7654  	         *
  7655  	         * @param {Cipher} cipher The cipher algorithm to use.
  7656  	         * @param {WordArray|string} message The message to encrypt.
  7657  	         * @param {WordArray} key The key.
  7658  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7659  	         *
  7660  	         * @return {CipherParams} A cipher params object.
  7661  	         *
  7662  	         * @static
  7663  	         *
  7664  	         * @example
  7665  	         *
  7666  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
  7667  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
  7668  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7669  	         */
  7670  	        encrypt: function (cipher, message, key, cfg) {
  7671  	            // Apply config defaults
  7672  	            cfg = this.cfg.extend(cfg);
  7673  
  7674  	            // Encrypt
  7675  	            var encryptor = cipher.createEncryptor(key, cfg);
  7676  	            var ciphertext = encryptor.finalize(message);
  7677  
  7678  	            // Shortcut
  7679  	            var cipherCfg = encryptor.cfg;
  7680  
  7681  	            // Create and return serializable cipher params
  7682  	            return CipherParams.create({
  7683  	                ciphertext: ciphertext,
  7684  	                key: key,
  7685  	                iv: cipherCfg.iv,
  7686  	                algorithm: cipher,
  7687  	                mode: cipherCfg.mode,
  7688  	                padding: cipherCfg.padding,
  7689  	                blockSize: cipher.blockSize,
  7690  	                formatter: cfg.format
  7691  	            });
  7692  	        },
  7693  
  7694  	        /**
  7695  	         * Decrypts serialized ciphertext.
  7696  	         *
  7697  	         * @param {Cipher} cipher The cipher algorithm to use.
  7698  	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
  7699  	         * @param {WordArray} key The key.
  7700  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7701  	         *
  7702  	         * @return {WordArray} The plaintext.
  7703  	         *
  7704  	         * @static
  7705  	         *
  7706  	         * @example
  7707  	         *
  7708  	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7709  	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7710  	         */
  7711  	        decrypt: function (cipher, ciphertext, key, cfg) {
  7712  	            // Apply config defaults
  7713  	            cfg = this.cfg.extend(cfg);
  7714  
  7715  	            // Convert string to CipherParams
  7716  	            ciphertext = this._parse(ciphertext, cfg.format);
  7717  
  7718  	            // Decrypt
  7719  	            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
  7720  
  7721  	            return plaintext;
  7722  	        },
  7723  
  7724  	        /**
  7725  	         * Converts serialized ciphertext to CipherParams,
  7726  	         * else assumed CipherParams already and returns ciphertext unchanged.
  7727  	         *
  7728  	         * @param {CipherParams|string} ciphertext The ciphertext.
  7729  	         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
  7730  	         *
  7731  	         * @return {CipherParams} The unserialized ciphertext.
  7732  	         *
  7733  	         * @static
  7734  	         *
  7735  	         * @example
  7736  	         *
  7737  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
  7738  	         */
  7739  	        _parse: function (ciphertext, format) {
  7740  	            if (typeof ciphertext == 'string') {
  7741  	                return format.parse(ciphertext, this);
  7742  	            } else {
  7743  	                return ciphertext;
  7744  	            }
  7745  	        }
  7746  	    });
  7747  
  7748  	    /**
  7749  	     * Key derivation function namespace.
  7750  	     */
  7751  	    var C_kdf = C.kdf = {};
  7752  
  7753  	    /**
  7754  	     * OpenSSL key derivation function.
  7755  	     */
  7756  	    var OpenSSLKdf = C_kdf.OpenSSL = {
  7757  	        /**
  7758  	         * Derives a key and IV from a password.
  7759  	         *
  7760  	         * @param {string} password The password to derive from.
  7761  	         * @param {number} keySize The size in words of the key to generate.
  7762  	         * @param {number} ivSize The size in words of the IV to generate.
  7763  	         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
  7764  	         *
  7765  	         * @return {CipherParams} A cipher params object with the key, IV, and salt.
  7766  	         *
  7767  	         * @static
  7768  	         *
  7769  	         * @example
  7770  	         *
  7771  	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
  7772  	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
  7773  	         */
  7774  	        execute: function (password, keySize, ivSize, salt) {
  7775  	            // Generate random salt
  7776  	            if (!salt) {
  7777  	                salt = WordArray.random(64/8);
  7778  	            }
  7779  
  7780  	            // Derive key and IV
  7781  	            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
  7782  
  7783  	            // Separate key and IV
  7784  	            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
  7785  	            key.sigBytes = keySize * 4;
  7786  
  7787  	            // Return params
  7788  	            return CipherParams.create({ key: key, iv: iv, salt: salt });
  7789  	        }
  7790  	    };
  7791  
  7792  	    /**
  7793  	     * A serializable cipher wrapper that derives the key from a password,
  7794  	     * and returns ciphertext as a serializable cipher params object.
  7795  	     */
  7796  	    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
  7797  	        /**
  7798  	         * Configuration options.
  7799  	         *
  7800  	         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
  7801  	         */
  7802  	        cfg: SerializableCipher.cfg.extend({
  7803  	            kdf: OpenSSLKdf
  7804  	        }),
  7805  
  7806  	        /**
  7807  	         * Encrypts a message using a password.
  7808  	         *
  7809  	         * @param {Cipher} cipher The cipher algorithm to use.
  7810  	         * @param {WordArray|string} message The message to encrypt.
  7811  	         * @param {string} password The password.
  7812  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7813  	         *
  7814  	         * @return {CipherParams} A cipher params object.
  7815  	         *
  7816  	         * @static
  7817  	         *
  7818  	         * @example
  7819  	         *
  7820  	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
  7821  	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
  7822  	         */
  7823  	        encrypt: function (cipher, message, password, cfg) {
  7824  	            // Apply config defaults
  7825  	            cfg = this.cfg.extend(cfg);
  7826  
  7827  	            // Derive key and other params
  7828  	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
  7829  
  7830  	            // Add IV to config
  7831  	            cfg.iv = derivedParams.iv;
  7832  
  7833  	            // Encrypt
  7834  	            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
  7835  
  7836  	            // Mix in derived params
  7837  	            ciphertext.mixIn(derivedParams);
  7838  
  7839  	            return ciphertext;
  7840  	        },
  7841  
  7842  	        /**
  7843  	         * Decrypts serialized ciphertext using a password.
  7844  	         *
  7845  	         * @param {Cipher} cipher The cipher algorithm to use.
  7846  	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
  7847  	         * @param {string} password The password.
  7848  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7849  	         *
  7850  	         * @return {WordArray} The plaintext.
  7851  	         *
  7852  	         * @static
  7853  	         *
  7854  	         * @example
  7855  	         *
  7856  	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
  7857  	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
  7858  	         */
  7859  	        decrypt: function (cipher, ciphertext, password, cfg) {
  7860  	            // Apply config defaults
  7861  	            cfg = this.cfg.extend(cfg);
  7862  
  7863  	            // Convert string to CipherParams
  7864  	            ciphertext = this._parse(ciphertext, cfg.format);
  7865  
  7866  	            // Derive key and other params
  7867  	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
  7868  
  7869  	            // Add IV to config
  7870  	            cfg.iv = derivedParams.iv;
  7871  
  7872  	            // Decrypt
  7873  	            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
  7874  
  7875  	            return plaintext;
  7876  	        }
  7877  	    });
  7878  	}());
  7879  
  7880  
  7881  }));
  7882  },{"./core":53}],53:[function(require,module,exports){
  7883  ;(function (root, factory) {
  7884  	if (typeof exports === "object") {
  7885  		// CommonJS
  7886  		module.exports = exports = factory();
  7887  	}
  7888  	else if (typeof define === "function" && define.amd) {
  7889  		// AMD
  7890  		define([], factory);
  7891  	}
  7892  	else {
  7893  		// Global (browser)
  7894  		root.CryptoJS = factory();
  7895  	}
  7896  }(this, function () {
  7897  
  7898  	/**
  7899  	 * CryptoJS core components.
  7900  	 */
  7901  	var CryptoJS = CryptoJS || (function (Math, undefined) {
  7902  	    /*
  7903  	     * Local polyfil of Object.create
  7904  	     */
  7905  	    var create = Object.create || (function () {
  7906  	        function F() {};
  7907  
  7908  	        return function (obj) {
  7909  	            var subtype;
  7910  
  7911  	            F.prototype = obj;
  7912  
  7913  	            subtype = new F();
  7914  
  7915  	            F.prototype = null;
  7916  
  7917  	            return subtype;
  7918  	        };
  7919  	    }())
  7920  
  7921  	    /**
  7922  	     * CryptoJS namespace.
  7923  	     */
  7924  	    var C = {};
  7925  
  7926  	    /**
  7927  	     * Library namespace.
  7928  	     */
  7929  	    var C_lib = C.lib = {};
  7930  
  7931  	    /**
  7932  	     * Base object for prototypal inheritance.
  7933  	     */
  7934  	    var Base = C_lib.Base = (function () {
  7935  
  7936  
  7937  	        return {
  7938  	            /**
  7939  	             * Creates a new object that inherits from this object.
  7940  	             *
  7941  	             * @param {Object} overrides Properties to copy into the new object.
  7942  	             *
  7943  	             * @return {Object} The new object.
  7944  	             *
  7945  	             * @static
  7946  	             *
  7947  	             * @example
  7948  	             *
  7949  	             *     var MyType = CryptoJS.lib.Base.extend({
  7950  	             *         field: 'value',
  7951  	             *
  7952  	             *         method: function () {
  7953  	             *         }
  7954  	             *     });
  7955  	             */
  7956  	            extend: function (overrides) {
  7957  	                // Spawn
  7958  	                var subtype = create(this);
  7959  
  7960  	                // Augment
  7961  	                if (overrides) {
  7962  	                    subtype.mixIn(overrides);
  7963  	                }
  7964  
  7965  	                // Create default initializer
  7966  	                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
  7967  	                    subtype.init = function () {
  7968  	                        subtype.$super.init.apply(this, arguments);
  7969  	                    };
  7970  	                }
  7971  
  7972  	                // Initializer's prototype is the subtype object
  7973  	                subtype.init.prototype = subtype;
  7974  
  7975  	                // Reference supertype
  7976  	                subtype.$super = this;
  7977  
  7978  	                return subtype;
  7979  	            },
  7980  
  7981  	            /**
  7982  	             * Extends this object and runs the init method.
  7983  	             * Arguments to create() will be passed to init().
  7984  	             *
  7985  	             * @return {Object} The new object.
  7986  	             *
  7987  	             * @static
  7988  	             *
  7989  	             * @example
  7990  	             *
  7991  	             *     var instance = MyType.create();
  7992  	             */
  7993  	            create: function () {
  7994  	                var instance = this.extend();
  7995  	                instance.init.apply(instance, arguments);
  7996  
  7997  	                return instance;
  7998  	            },
  7999  
  8000  	            /**
  8001  	             * Initializes a newly created object.
  8002  	             * Override this method to add some logic when your objects are created.
  8003  	             *
  8004  	             * @example
  8005  	             *
  8006  	             *     var MyType = CryptoJS.lib.Base.extend({
  8007  	             *         init: function () {
  8008  	             *             // ...
  8009  	             *         }
  8010  	             *     });
  8011  	             */
  8012  	            init: function () {
  8013  	            },
  8014  
  8015  	            /**
  8016  	             * Copies properties into this object.
  8017  	             *
  8018  	             * @param {Object} properties The properties to mix in.
  8019  	             *
  8020  	             * @example
  8021  	             *
  8022  	             *     MyType.mixIn({
  8023  	             *         field: 'value'
  8024  	             *     });
  8025  	             */
  8026  	            mixIn: function (properties) {
  8027  	                for (var propertyName in properties) {
  8028  	                    if (properties.hasOwnProperty(propertyName)) {
  8029  	                        this[propertyName] = properties[propertyName];
  8030  	                    }
  8031  	                }
  8032  
  8033  	                // IE won't copy toString using the loop above
  8034  	                if (properties.hasOwnProperty('toString')) {
  8035  	                    this.toString = properties.toString;
  8036  	                }
  8037  	            },
  8038  
  8039  	            /**
  8040  	             * Creates a copy of this object.
  8041  	             *
  8042  	             * @return {Object} The clone.
  8043  	             *
  8044  	             * @example
  8045  	             *
  8046  	             *     var clone = instance.clone();
  8047  	             */
  8048  	            clone: function () {
  8049  	                return this.init.prototype.extend(this);
  8050  	            }
  8051  	        };
  8052  	    }());
  8053  
  8054  	    /**
  8055  	     * An array of 32-bit words.
  8056  	     *
  8057  	     * @property {Array} words The array of 32-bit words.
  8058  	     * @property {number} sigBytes The number of significant bytes in this word array.
  8059  	     */
  8060  	    var WordArray = C_lib.WordArray = Base.extend({
  8061  	        /**
  8062  	         * Initializes a newly created word array.
  8063  	         *
  8064  	         * @param {Array} words (Optional) An array of 32-bit words.
  8065  	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
  8066  	         *
  8067  	         * @example
  8068  	         *
  8069  	         *     var wordArray = CryptoJS.lib.WordArray.create();
  8070  	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
  8071  	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
  8072  	         */
  8073  	        init: function (words, sigBytes) {
  8074  	            words = this.words = words || [];
  8075  
  8076  	            if (sigBytes != undefined) {
  8077  	                this.sigBytes = sigBytes;
  8078  	            } else {
  8079  	                this.sigBytes = words.length * 4;
  8080  	            }
  8081  	        },
  8082  
  8083  	        /**
  8084  	         * Converts this word array to a string.
  8085  	         *
  8086  	         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
  8087  	         *
  8088  	         * @return {string} The stringified word array.
  8089  	         *
  8090  	         * @example
  8091  	         *
  8092  	         *     var string = wordArray + '';
  8093  	         *     var string = wordArray.toString();
  8094  	         *     var string = wordArray.toString(CryptoJS.enc.Utf8);
  8095  	         */
  8096  	        toString: function (encoder) {
  8097  	            return (encoder || Hex).stringify(this);
  8098  	        },
  8099  
  8100  	        /**
  8101  	         * Concatenates a word array to this word array.
  8102  	         *
  8103  	         * @param {WordArray} wordArray The word array to append.
  8104  	         *
  8105  	         * @return {WordArray} This word array.
  8106  	         *
  8107  	         * @example
  8108  	         *
  8109  	         *     wordArray1.concat(wordArray2);
  8110  	         */
  8111  	        concat: function (wordArray) {
  8112  	            // Shortcuts
  8113  	            var thisWords = this.words;
  8114  	            var thatWords = wordArray.words;
  8115  	            var thisSigBytes = this.sigBytes;
  8116  	            var thatSigBytes = wordArray.sigBytes;
  8117  
  8118  	            // Clamp excess bits
  8119  	            this.clamp();
  8120  
  8121  	            // Concat
  8122  	            if (thisSigBytes % 4) {
  8123  	                // Copy one byte at a time
  8124  	                for (var i = 0; i < thatSigBytes; i++) {
  8125  	                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8126  	                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
  8127  	                }
  8128  	            } else {
  8129  	                // Copy one word at a time
  8130  	                for (var i = 0; i < thatSigBytes; i += 4) {
  8131  	                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
  8132  	                }
  8133  	            }
  8134  	            this.sigBytes += thatSigBytes;
  8135  
  8136  	            // Chainable
  8137  	            return this;
  8138  	        },
  8139  
  8140  	        /**
  8141  	         * Removes insignificant bits.
  8142  	         *
  8143  	         * @example
  8144  	         *
  8145  	         *     wordArray.clamp();
  8146  	         */
  8147  	        clamp: function () {
  8148  	            // Shortcuts
  8149  	            var words = this.words;
  8150  	            var sigBytes = this.sigBytes;
  8151  
  8152  	            // Clamp
  8153  	            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
  8154  	            words.length = Math.ceil(sigBytes / 4);
  8155  	        },
  8156  
  8157  	        /**
  8158  	         * Creates a copy of this word array.
  8159  	         *
  8160  	         * @return {WordArray} The clone.
  8161  	         *
  8162  	         * @example
  8163  	         *
  8164  	         *     var clone = wordArray.clone();
  8165  	         */
  8166  	        clone: function () {
  8167  	            var clone = Base.clone.call(this);
  8168  	            clone.words = this.words.slice(0);
  8169  
  8170  	            return clone;
  8171  	        },
  8172  
  8173  	        /**
  8174  	         * Creates a word array filled with random bytes.
  8175  	         *
  8176  	         * @param {number} nBytes The number of random bytes to generate.
  8177  	         *
  8178  	         * @return {WordArray} The random word array.
  8179  	         *
  8180  	         * @static
  8181  	         *
  8182  	         * @example
  8183  	         *
  8184  	         *     var wordArray = CryptoJS.lib.WordArray.random(16);
  8185  	         */
  8186  	        random: function (nBytes) {
  8187  	            var words = [];
  8188  
  8189  	            var r = (function (m_w) {
  8190  	                var m_w = m_w;
  8191  	                var m_z = 0x3ade68b1;
  8192  	                var mask = 0xffffffff;
  8193  
  8194  	                return function () {
  8195  	                    m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
  8196  	                    m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
  8197  	                    var result = ((m_z << 0x10) + m_w) & mask;
  8198  	                    result /= 0x100000000;
  8199  	                    result += 0.5;
  8200  	                    return result * (Math.random() > .5 ? 1 : -1);
  8201  	                }
  8202  	            });
  8203  
  8204  	            for (var i = 0, rcache; i < nBytes; i += 4) {
  8205  	                var _r = r((rcache || Math.random()) * 0x100000000);
  8206  
  8207  	                rcache = _r() * 0x3ade67b7;
  8208  	                words.push((_r() * 0x100000000) | 0);
  8209  	            }
  8210  
  8211  	            return new WordArray.init(words, nBytes);
  8212  	        }
  8213  	    });
  8214  
  8215  	    /**
  8216  	     * Encoder namespace.
  8217  	     */
  8218  	    var C_enc = C.enc = {};
  8219  
  8220  	    /**
  8221  	     * Hex encoding strategy.
  8222  	     */
  8223  	    var Hex = C_enc.Hex = {
  8224  	        /**
  8225  	         * Converts a word array to a hex string.
  8226  	         *
  8227  	         * @param {WordArray} wordArray The word array.
  8228  	         *
  8229  	         * @return {string} The hex string.
  8230  	         *
  8231  	         * @static
  8232  	         *
  8233  	         * @example
  8234  	         *
  8235  	         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
  8236  	         */
  8237  	        stringify: function (wordArray) {
  8238  	            // Shortcuts
  8239  	            var words = wordArray.words;
  8240  	            var sigBytes = wordArray.sigBytes;
  8241  
  8242  	            // Convert
  8243  	            var hexChars = [];
  8244  	            for (var i = 0; i < sigBytes; i++) {
  8245  	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8246  	                hexChars.push((bite >>> 4).toString(16));
  8247  	                hexChars.push((bite & 0x0f).toString(16));
  8248  	            }
  8249  
  8250  	            return hexChars.join('');
  8251  	        },
  8252  
  8253  	        /**
  8254  	         * Converts a hex string to a word array.
  8255  	         *
  8256  	         * @param {string} hexStr The hex string.
  8257  	         *
  8258  	         * @return {WordArray} The word array.
  8259  	         *
  8260  	         * @static
  8261  	         *
  8262  	         * @example
  8263  	         *
  8264  	         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
  8265  	         */
  8266  	        parse: function (hexStr) {
  8267  	            // Shortcut
  8268  	            var hexStrLength = hexStr.length;
  8269  
  8270  	            // Convert
  8271  	            var words = [];
  8272  	            for (var i = 0; i < hexStrLength; i += 2) {
  8273  	                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
  8274  	            }
  8275  
  8276  	            return new WordArray.init(words, hexStrLength / 2);
  8277  	        }
  8278  	    };
  8279  
  8280  	    /**
  8281  	     * Latin1 encoding strategy.
  8282  	     */
  8283  	    var Latin1 = C_enc.Latin1 = {
  8284  	        /**
  8285  	         * Converts a word array to a Latin1 string.
  8286  	         *
  8287  	         * @param {WordArray} wordArray The word array.
  8288  	         *
  8289  	         * @return {string} The Latin1 string.
  8290  	         *
  8291  	         * @static
  8292  	         *
  8293  	         * @example
  8294  	         *
  8295  	         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
  8296  	         */
  8297  	        stringify: function (wordArray) {
  8298  	            // Shortcuts
  8299  	            var words = wordArray.words;
  8300  	            var sigBytes = wordArray.sigBytes;
  8301  
  8302  	            // Convert
  8303  	            var latin1Chars = [];
  8304  	            for (var i = 0; i < sigBytes; i++) {
  8305  	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8306  	                latin1Chars.push(String.fromCharCode(bite));
  8307  	            }
  8308  
  8309  	            return latin1Chars.join('');
  8310  	        },
  8311  
  8312  	        /**
  8313  	         * Converts a Latin1 string to a word array.
  8314  	         *
  8315  	         * @param {string} latin1Str The Latin1 string.
  8316  	         *
  8317  	         * @return {WordArray} The word array.
  8318  	         *
  8319  	         * @static
  8320  	         *
  8321  	         * @example
  8322  	         *
  8323  	         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
  8324  	         */
  8325  	        parse: function (latin1Str) {
  8326  	            // Shortcut
  8327  	            var latin1StrLength = latin1Str.length;
  8328  
  8329  	            // Convert
  8330  	            var words = [];
  8331  	            for (var i = 0; i < latin1StrLength; i++) {
  8332  	                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
  8333  	            }
  8334  
  8335  	            return new WordArray.init(words, latin1StrLength);
  8336  	        }
  8337  	    };
  8338  
  8339  	    /**
  8340  	     * UTF-8 encoding strategy.
  8341  	     */
  8342  	    var Utf8 = C_enc.Utf8 = {
  8343  	        /**
  8344  	         * Converts a word array to a UTF-8 string.
  8345  	         *
  8346  	         * @param {WordArray} wordArray The word array.
  8347  	         *
  8348  	         * @return {string} The UTF-8 string.
  8349  	         *
  8350  	         * @static
  8351  	         *
  8352  	         * @example
  8353  	         *
  8354  	         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
  8355  	         */
  8356  	        stringify: function (wordArray) {
  8357  	            try {
  8358  	                return decodeURIComponent(escape(Latin1.stringify(wordArray)));
  8359  	            } catch (e) {
  8360  	                throw new Error('Malformed UTF-8 data');
  8361  	            }
  8362  	        },
  8363  
  8364  	        /**
  8365  	         * Converts a UTF-8 string to a word array.
  8366  	         *
  8367  	         * @param {string} utf8Str The UTF-8 string.
  8368  	         *
  8369  	         * @return {WordArray} The word array.
  8370  	         *
  8371  	         * @static
  8372  	         *
  8373  	         * @example
  8374  	         *
  8375  	         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
  8376  	         */
  8377  	        parse: function (utf8Str) {
  8378  	            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
  8379  	        }
  8380  	    };
  8381  
  8382  	    /**
  8383  	     * Abstract buffered block algorithm template.
  8384  	     *
  8385  	     * The property blockSize must be implemented in a concrete subtype.
  8386  	     *
  8387  	     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
  8388  	     */
  8389  	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
  8390  	        /**
  8391  	         * Resets this block algorithm's data buffer to its initial state.
  8392  	         *
  8393  	         * @example
  8394  	         *
  8395  	         *     bufferedBlockAlgorithm.reset();
  8396  	         */
  8397  	        reset: function () {
  8398  	            // Initial values
  8399  	            this._data = new WordArray.init();
  8400  	            this._nDataBytes = 0;
  8401  	        },
  8402  
  8403  	        /**
  8404  	         * Adds new data to this block algorithm's buffer.
  8405  	         *
  8406  	         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
  8407  	         *
  8408  	         * @example
  8409  	         *
  8410  	         *     bufferedBlockAlgorithm._append('data');
  8411  	         *     bufferedBlockAlgorithm._append(wordArray);
  8412  	         */
  8413  	        _append: function (data) {
  8414  	            // Convert string to WordArray, else assume WordArray already
  8415  	            if (typeof data == 'string') {
  8416  	                data = Utf8.parse(data);
  8417  	            }
  8418  
  8419  	            // Append
  8420  	            this._data.concat(data);
  8421  	            this._nDataBytes += data.sigBytes;
  8422  	        },
  8423  
  8424  	        /**
  8425  	         * Processes available data blocks.
  8426  	         *
  8427  	         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
  8428  	         *
  8429  	         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
  8430  	         *
  8431  	         * @return {WordArray} The processed data.
  8432  	         *
  8433  	         * @example
  8434  	         *
  8435  	         *     var processedData = bufferedBlockAlgorithm._process();
  8436  	         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
  8437  	         */
  8438  	        _process: function (doFlush) {
  8439  	            // Shortcuts
  8440  	            var data = this._data;
  8441  	            var dataWords = data.words;
  8442  	            var dataSigBytes = data.sigBytes;
  8443  	            var blockSize = this.blockSize;
  8444  	            var blockSizeBytes = blockSize * 4;
  8445  
  8446  	            // Count blocks ready
  8447  	            var nBlocksReady = dataSigBytes / blockSizeBytes;
  8448  	            if (doFlush) {
  8449  	                // Round up to include partial blocks
  8450  	                nBlocksReady = Math.ceil(nBlocksReady);
  8451  	            } else {
  8452  	                // Round down to include only full blocks,
  8453  	                // less the number of blocks that must remain in the buffer
  8454  	                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
  8455  	            }
  8456  
  8457  	            // Count words ready
  8458  	            var nWordsReady = nBlocksReady * blockSize;
  8459  
  8460  	            // Count bytes ready
  8461  	            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
  8462  
  8463  	            // Process blocks
  8464  	            if (nWordsReady) {
  8465  	                for (var offset = 0; offset < nWordsReady; offset += blockSize) {
  8466  	                    // Perform concrete-algorithm logic
  8467  	                    this._doProcessBlock(dataWords, offset);
  8468  	                }
  8469  
  8470  	                // Remove processed words
  8471  	                var processedWords = dataWords.splice(0, nWordsReady);
  8472  	                data.sigBytes -= nBytesReady;
  8473  	            }
  8474  
  8475  	            // Return processed words
  8476  	            return new WordArray.init(processedWords, nBytesReady);
  8477  	        },
  8478  
  8479  	        /**
  8480  	         * Creates a copy of this object.
  8481  	         *
  8482  	         * @return {Object} The clone.
  8483  	         *
  8484  	         * @example
  8485  	         *
  8486  	         *     var clone = bufferedBlockAlgorithm.clone();
  8487  	         */
  8488  	        clone: function () {
  8489  	            var clone = Base.clone.call(this);
  8490  	            clone._data = this._data.clone();
  8491  
  8492  	            return clone;
  8493  	        },
  8494  
  8495  	        _minBufferSize: 0
  8496  	    });
  8497  
  8498  	    /**
  8499  	     * Abstract hasher template.
  8500  	     *
  8501  	     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
  8502  	     */
  8503  	    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
  8504  	        /**
  8505  	         * Configuration options.
  8506  	         */
  8507  	        cfg: Base.extend(),
  8508  
  8509  	        /**
  8510  	         * Initializes a newly created hasher.
  8511  	         *
  8512  	         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
  8513  	         *
  8514  	         * @example
  8515  	         *
  8516  	         *     var hasher = CryptoJS.algo.SHA256.create();
  8517  	         */
  8518  	        init: function (cfg) {
  8519  	            // Apply config defaults
  8520  	            this.cfg = this.cfg.extend(cfg);
  8521  
  8522  	            // Set initial values
  8523  	            this.reset();
  8524  	        },
  8525  
  8526  	        /**
  8527  	         * Resets this hasher to its initial state.
  8528  	         *
  8529  	         * @example
  8530  	         *
  8531  	         *     hasher.reset();
  8532  	         */
  8533  	        reset: function () {
  8534  	            // Reset data buffer
  8535  	            BufferedBlockAlgorithm.reset.call(this);
  8536  
  8537  	            // Perform concrete-hasher logic
  8538  	            this._doReset();
  8539  	        },
  8540  
  8541  	        /**
  8542  	         * Updates this hasher with a message.
  8543  	         *
  8544  	         * @param {WordArray|string} messageUpdate The message to append.
  8545  	         *
  8546  	         * @return {Hasher} This hasher.
  8547  	         *
  8548  	         * @example
  8549  	         *
  8550  	         *     hasher.update('message');
  8551  	         *     hasher.update(wordArray);
  8552  	         */
  8553  	        update: function (messageUpdate) {
  8554  	            // Append
  8555  	            this._append(messageUpdate);
  8556  
  8557  	            // Update the hash
  8558  	            this._process();
  8559  
  8560  	            // Chainable
  8561  	            return this;
  8562  	        },
  8563  
  8564  	        /**
  8565  	         * Finalizes the hash computation.
  8566  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  8567  	         *
  8568  	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
  8569  	         *
  8570  	         * @return {WordArray} The hash.
  8571  	         *
  8572  	         * @example
  8573  	         *
  8574  	         *     var hash = hasher.finalize();
  8575  	         *     var hash = hasher.finalize('message');
  8576  	         *     var hash = hasher.finalize(wordArray);
  8577  	         */
  8578  	        finalize: function (messageUpdate) {
  8579  	            // Final message update
  8580  	            if (messageUpdate) {
  8581  	                this._append(messageUpdate);
  8582  	            }
  8583  
  8584  	            // Perform concrete-hasher logic
  8585  	            var hash = this._doFinalize();
  8586  
  8587  	            return hash;
  8588  	        },
  8589  
  8590  	        blockSize: 512/32,
  8591  
  8592  	        /**
  8593  	         * Creates a shortcut function to a hasher's object interface.
  8594  	         *
  8595  	         * @param {Hasher} hasher The hasher to create a helper for.
  8596  	         *
  8597  	         * @return {Function} The shortcut function.
  8598  	         *
  8599  	         * @static
  8600  	         *
  8601  	         * @example
  8602  	         *
  8603  	         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
  8604  	         */
  8605  	        _createHelper: function (hasher) {
  8606  	            return function (message, cfg) {
  8607  	                return new hasher.init(cfg).finalize(message);
  8608  	            };
  8609  	        },
  8610  
  8611  	        /**
  8612  	         * Creates a shortcut function to the HMAC's object interface.
  8613  	         *
  8614  	         * @param {Hasher} hasher The hasher to use in this HMAC helper.
  8615  	         *
  8616  	         * @return {Function} The shortcut function.
  8617  	         *
  8618  	         * @static
  8619  	         *
  8620  	         * @example
  8621  	         *
  8622  	         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
  8623  	         */
  8624  	        _createHmacHelper: function (hasher) {
  8625  	            return function (message, key) {
  8626  	                return new C_algo.HMAC.init(hasher, key).finalize(message);
  8627  	            };
  8628  	        }
  8629  	    });
  8630  
  8631  	    /**
  8632  	     * Algorithm namespace.
  8633  	     */
  8634  	    var C_algo = C.algo = {};
  8635  
  8636  	    return C;
  8637  	}(Math));
  8638  
  8639  
  8640  	return CryptoJS;
  8641  
  8642  }));
  8643  },{}],54:[function(require,module,exports){
  8644  ;(function (root, factory) {
  8645  	if (typeof exports === "object") {
  8646  		// CommonJS
  8647  		module.exports = exports = factory(require("./core"));
  8648  	}
  8649  	else if (typeof define === "function" && define.amd) {
  8650  		// AMD
  8651  		define(["./core"], factory);
  8652  	}
  8653  	else {
  8654  		// Global (browser)
  8655  		factory(root.CryptoJS);
  8656  	}
  8657  }(this, function (CryptoJS) {
  8658  
  8659  	(function () {
  8660  	    // Shortcuts
  8661  	    var C = CryptoJS;
  8662  	    var C_lib = C.lib;
  8663  	    var WordArray = C_lib.WordArray;
  8664  	    var C_enc = C.enc;
  8665  
  8666  	    /**
  8667  	     * Base64 encoding strategy.
  8668  	     */
  8669  	    var Base64 = C_enc.Base64 = {
  8670  	        /**
  8671  	         * Converts a word array to a Base64 string.
  8672  	         *
  8673  	         * @param {WordArray} wordArray The word array.
  8674  	         *
  8675  	         * @return {string} The Base64 string.
  8676  	         *
  8677  	         * @static
  8678  	         *
  8679  	         * @example
  8680  	         *
  8681  	         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);
  8682  	         */
  8683  	        stringify: function (wordArray) {
  8684  	            // Shortcuts
  8685  	            var words = wordArray.words;
  8686  	            var sigBytes = wordArray.sigBytes;
  8687  	            var map = this._map;
  8688  
  8689  	            // Clamp excess bits
  8690  	            wordArray.clamp();
  8691  
  8692  	            // Convert
  8693  	            var base64Chars = [];
  8694  	            for (var i = 0; i < sigBytes; i += 3) {
  8695  	                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
  8696  	                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
  8697  	                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
  8698  
  8699  	                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
  8700  
  8701  	                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
  8702  	                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
  8703  	                }
  8704  	            }
  8705  
  8706  	            // Add padding
  8707  	            var paddingChar = map.charAt(64);
  8708  	            if (paddingChar) {
  8709  	                while (base64Chars.length % 4) {
  8710  	                    base64Chars.push(paddingChar);
  8711  	                }
  8712  	            }
  8713  
  8714  	            return base64Chars.join('');
  8715  	        },
  8716  
  8717  	        /**
  8718  	         * Converts a Base64 string to a word array.
  8719  	         *
  8720  	         * @param {string} base64Str The Base64 string.
  8721  	         *
  8722  	         * @return {WordArray} The word array.
  8723  	         *
  8724  	         * @static
  8725  	         *
  8726  	         * @example
  8727  	         *
  8728  	         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);
  8729  	         */
  8730  	        parse: function (base64Str) {
  8731  	            // Shortcuts
  8732  	            var base64StrLength = base64Str.length;
  8733  	            var map = this._map;
  8734  	            var reverseMap = this._reverseMap;
  8735  
  8736  	            if (!reverseMap) {
  8737  	                    reverseMap = this._reverseMap = [];
  8738  	                    for (var j = 0; j < map.length; j++) {
  8739  	                        reverseMap[map.charCodeAt(j)] = j;
  8740  	                    }
  8741  	            }
  8742  
  8743  	            // Ignore padding
  8744  	            var paddingChar = map.charAt(64);
  8745  	            if (paddingChar) {
  8746  	                var paddingIndex = base64Str.indexOf(paddingChar);
  8747  	                if (paddingIndex !== -1) {
  8748  	                    base64StrLength = paddingIndex;
  8749  	                }
  8750  	            }
  8751  
  8752  	            // Convert
  8753  	            return parseLoop(base64Str, base64StrLength, reverseMap);
  8754  
  8755  	        },
  8756  
  8757  	        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  8758  	    };
  8759  
  8760  	    function parseLoop(base64Str, base64StrLength, reverseMap) {
  8761  	      var words = [];
  8762  	      var nBytes = 0;
  8763  	      for (var i = 0; i < base64StrLength; i++) {
  8764  	          if (i % 4) {
  8765  	              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
  8766  	              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
  8767  	              words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
  8768  	              nBytes++;
  8769  	          }
  8770  	      }
  8771  	      return WordArray.create(words, nBytes);
  8772  	    }
  8773  	}());
  8774  
  8775  
  8776  	return CryptoJS.enc.Base64;
  8777  
  8778  }));
  8779  },{"./core":53}],55:[function(require,module,exports){
  8780  ;(function (root, factory) {
  8781  	if (typeof exports === "object") {
  8782  		// CommonJS
  8783  		module.exports = exports = factory(require("./core"));
  8784  	}
  8785  	else if (typeof define === "function" && define.amd) {
  8786  		// AMD
  8787  		define(["./core"], factory);
  8788  	}
  8789  	else {
  8790  		// Global (browser)
  8791  		factory(root.CryptoJS);
  8792  	}
  8793  }(this, function (CryptoJS) {
  8794  
  8795  	(function () {
  8796  	    // Shortcuts
  8797  	    var C = CryptoJS;
  8798  	    var C_lib = C.lib;
  8799  	    var WordArray = C_lib.WordArray;
  8800  	    var C_enc = C.enc;
  8801  
  8802  	    /**
  8803  	     * UTF-16 BE encoding strategy.
  8804  	     */
  8805  	    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
  8806  	        /**
  8807  	         * Converts a word array to a UTF-16 BE string.
  8808  	         *
  8809  	         * @param {WordArray} wordArray The word array.
  8810  	         *
  8811  	         * @return {string} The UTF-16 BE string.
  8812  	         *
  8813  	         * @static
  8814  	         *
  8815  	         * @example
  8816  	         *
  8817  	         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
  8818  	         */
  8819  	        stringify: function (wordArray) {
  8820  	            // Shortcuts
  8821  	            var words = wordArray.words;
  8822  	            var sigBytes = wordArray.sigBytes;
  8823  
  8824  	            // Convert
  8825  	            var utf16Chars = [];
  8826  	            for (var i = 0; i < sigBytes; i += 2) {
  8827  	                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
  8828  	                utf16Chars.push(String.fromCharCode(codePoint));
  8829  	            }
  8830  
  8831  	            return utf16Chars.join('');
  8832  	        },
  8833  
  8834  	        /**
  8835  	         * Converts a UTF-16 BE string to a word array.
  8836  	         *
  8837  	         * @param {string} utf16Str The UTF-16 BE string.
  8838  	         *
  8839  	         * @return {WordArray} The word array.
  8840  	         *
  8841  	         * @static
  8842  	         *
  8843  	         * @example
  8844  	         *
  8845  	         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
  8846  	         */
  8847  	        parse: function (utf16Str) {
  8848  	            // Shortcut
  8849  	            var utf16StrLength = utf16Str.length;
  8850  
  8851  	            // Convert
  8852  	            var words = [];
  8853  	            for (var i = 0; i < utf16StrLength; i++) {
  8854  	                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
  8855  	            }
  8856  
  8857  	            return WordArray.create(words, utf16StrLength * 2);
  8858  	        }
  8859  	    };
  8860  
  8861  	    /**
  8862  	     * UTF-16 LE encoding strategy.
  8863  	     */
  8864  	    C_enc.Utf16LE = {
  8865  	        /**
  8866  	         * Converts a word array to a UTF-16 LE string.
  8867  	         *
  8868  	         * @param {WordArray} wordArray The word array.
  8869  	         *
  8870  	         * @return {string} The UTF-16 LE string.
  8871  	         *
  8872  	         * @static
  8873  	         *
  8874  	         * @example
  8875  	         *
  8876  	         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
  8877  	         */
  8878  	        stringify: function (wordArray) {
  8879  	            // Shortcuts
  8880  	            var words = wordArray.words;
  8881  	            var sigBytes = wordArray.sigBytes;
  8882  
  8883  	            // Convert
  8884  	            var utf16Chars = [];
  8885  	            for (var i = 0; i < sigBytes; i += 2) {
  8886  	                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
  8887  	                utf16Chars.push(String.fromCharCode(codePoint));
  8888  	            }
  8889  
  8890  	            return utf16Chars.join('');
  8891  	        },
  8892  
  8893  	        /**
  8894  	         * Converts a UTF-16 LE string to a word array.
  8895  	         *
  8896  	         * @param {string} utf16Str The UTF-16 LE string.
  8897  	         *
  8898  	         * @return {WordArray} The word array.
  8899  	         *
  8900  	         * @static
  8901  	         *
  8902  	         * @example
  8903  	         *
  8904  	         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
  8905  	         */
  8906  	        parse: function (utf16Str) {
  8907  	            // Shortcut
  8908  	            var utf16StrLength = utf16Str.length;
  8909  
  8910  	            // Convert
  8911  	            var words = [];
  8912  	            for (var i = 0; i < utf16StrLength; i++) {
  8913  	                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
  8914  	            }
  8915  
  8916  	            return WordArray.create(words, utf16StrLength * 2);
  8917  	        }
  8918  	    };
  8919  
  8920  	    function swapEndian(word) {
  8921  	        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
  8922  	    }
  8923  	}());
  8924  
  8925  
  8926  	return CryptoJS.enc.Utf16;
  8927  
  8928  }));
  8929  },{"./core":53}],56:[function(require,module,exports){
  8930  ;(function (root, factory, undef) {
  8931  	if (typeof exports === "object") {
  8932  		// CommonJS
  8933  		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
  8934  	}
  8935  	else if (typeof define === "function" && define.amd) {
  8936  		// AMD
  8937  		define(["./core", "./sha1", "./hmac"], factory);
  8938  	}
  8939  	else {
  8940  		// Global (browser)
  8941  		factory(root.CryptoJS);
  8942  	}
  8943  }(this, function (CryptoJS) {
  8944  
  8945  	(function () {
  8946  	    // Shortcuts
  8947  	    var C = CryptoJS;
  8948  	    var C_lib = C.lib;
  8949  	    var Base = C_lib.Base;
  8950  	    var WordArray = C_lib.WordArray;
  8951  	    var C_algo = C.algo;
  8952  	    var MD5 = C_algo.MD5;
  8953  
  8954  	    /**
  8955  	     * This key derivation function is meant to conform with EVP_BytesToKey.
  8956  	     * www.openssl.org/docs/crypto/EVP_BytesToKey.html
  8957  	     */
  8958  	    var EvpKDF = C_algo.EvpKDF = Base.extend({
  8959  	        /**
  8960  	         * Configuration options.
  8961  	         *
  8962  	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
  8963  	         * @property {Hasher} hasher The hash algorithm to use. Default: MD5
  8964  	         * @property {number} iterations The number of iterations to perform. Default: 1
  8965  	         */
  8966  	        cfg: Base.extend({
  8967  	            keySize: 128/32,
  8968  	            hasher: MD5,
  8969  	            iterations: 1
  8970  	        }),
  8971  
  8972  	        /**
  8973  	         * Initializes a newly created key derivation function.
  8974  	         *
  8975  	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
  8976  	         *
  8977  	         * @example
  8978  	         *
  8979  	         *     var kdf = CryptoJS.algo.EvpKDF.create();
  8980  	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
  8981  	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
  8982  	         */
  8983  	        init: function (cfg) {
  8984  	            this.cfg = this.cfg.extend(cfg);
  8985  	        },
  8986  
  8987  	        /**
  8988  	         * Derives a key from a password.
  8989  	         *
  8990  	         * @param {WordArray|string} password The password.
  8991  	         * @param {WordArray|string} salt A salt.
  8992  	         *
  8993  	         * @return {WordArray} The derived key.
  8994  	         *
  8995  	         * @example
  8996  	         *
  8997  	         *     var key = kdf.compute(password, salt);
  8998  	         */
  8999  	        compute: function (password, salt) {
  9000  	            // Shortcut
  9001  	            var cfg = this.cfg;
  9002  
  9003  	            // Init hasher
  9004  	            var hasher = cfg.hasher.create();
  9005  
  9006  	            // Initial values
  9007  	            var derivedKey = WordArray.create();
  9008  
  9009  	            // Shortcuts
  9010  	            var derivedKeyWords = derivedKey.words;
  9011  	            var keySize = cfg.keySize;
  9012  	            var iterations = cfg.iterations;
  9013  
  9014  	            // Generate key
  9015  	            while (derivedKeyWords.length < keySize) {
  9016  	                if (block) {
  9017  	                    hasher.update(block);
  9018  	                }
  9019  	                var block = hasher.update(password).finalize(salt);
  9020  	                hasher.reset();
  9021  
  9022  	                // Iterations
  9023  	                for (var i = 1; i < iterations; i++) {
  9024  	                    block = hasher.finalize(block);
  9025  	                    hasher.reset();
  9026  	                }
  9027  
  9028  	                derivedKey.concat(block);
  9029  	            }
  9030  	            derivedKey.sigBytes = keySize * 4;
  9031  
  9032  	            return derivedKey;
  9033  	        }
  9034  	    });
  9035  
  9036  	    /**
  9037  	     * Derives a key from a password.
  9038  	     *
  9039  	     * @param {WordArray|string} password The password.
  9040  	     * @param {WordArray|string} salt A salt.
  9041  	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
  9042  	     *
  9043  	     * @return {WordArray} The derived key.
  9044  	     *
  9045  	     * @static
  9046  	     *
  9047  	     * @example
  9048  	     *
  9049  	     *     var key = CryptoJS.EvpKDF(password, salt);
  9050  	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
  9051  	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
  9052  	     */
  9053  	    C.EvpKDF = function (password, salt, cfg) {
  9054  	        return EvpKDF.create(cfg).compute(password, salt);
  9055  	    };
  9056  	}());
  9057  
  9058  
  9059  	return CryptoJS.EvpKDF;
  9060  
  9061  }));
  9062  },{"./core":53,"./hmac":58,"./sha1":77}],57:[function(require,module,exports){
  9063  ;(function (root, factory, undef) {
  9064  	if (typeof exports === "object") {
  9065  		// CommonJS
  9066  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9067  	}
  9068  	else if (typeof define === "function" && define.amd) {
  9069  		// AMD
  9070  		define(["./core", "./cipher-core"], factory);
  9071  	}
  9072  	else {
  9073  		// Global (browser)
  9074  		factory(root.CryptoJS);
  9075  	}
  9076  }(this, function (CryptoJS) {
  9077  
  9078  	(function (undefined) {
  9079  	    // Shortcuts
  9080  	    var C = CryptoJS;
  9081  	    var C_lib = C.lib;
  9082  	    var CipherParams = C_lib.CipherParams;
  9083  	    var C_enc = C.enc;
  9084  	    var Hex = C_enc.Hex;
  9085  	    var C_format = C.format;
  9086  
  9087  	    var HexFormatter = C_format.Hex = {
  9088  	        /**
  9089  	         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
  9090  	         *
  9091  	         * @param {CipherParams} cipherParams The cipher params object.
  9092  	         *
  9093  	         * @return {string} The hexadecimally encoded string.
  9094  	         *
  9095  	         * @static
  9096  	         *
  9097  	         * @example
  9098  	         *
  9099  	         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);
  9100  	         */
  9101  	        stringify: function (cipherParams) {
  9102  	            return cipherParams.ciphertext.toString(Hex);
  9103  	        },
  9104  
  9105  	        /**
  9106  	         * Converts a hexadecimally encoded ciphertext string to a cipher params object.
  9107  	         *
  9108  	         * @param {string} input The hexadecimally encoded string.
  9109  	         *
  9110  	         * @return {CipherParams} The cipher params object.
  9111  	         *
  9112  	         * @static
  9113  	         *
  9114  	         * @example
  9115  	         *
  9116  	         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);
  9117  	         */
  9118  	        parse: function (input) {
  9119  	            var ciphertext = Hex.parse(input);
  9120  	            return CipherParams.create({ ciphertext: ciphertext });
  9121  	        }
  9122  	    };
  9123  	}());
  9124  
  9125  
  9126  	return CryptoJS.format.Hex;
  9127  
  9128  }));
  9129  },{"./cipher-core":52,"./core":53}],58:[function(require,module,exports){
  9130  ;(function (root, factory) {
  9131  	if (typeof exports === "object") {
  9132  		// CommonJS
  9133  		module.exports = exports = factory(require("./core"));
  9134  	}
  9135  	else if (typeof define === "function" && define.amd) {
  9136  		// AMD
  9137  		define(["./core"], factory);
  9138  	}
  9139  	else {
  9140  		// Global (browser)
  9141  		factory(root.CryptoJS);
  9142  	}
  9143  }(this, function (CryptoJS) {
  9144  
  9145  	(function () {
  9146  	    // Shortcuts
  9147  	    var C = CryptoJS;
  9148  	    var C_lib = C.lib;
  9149  	    var Base = C_lib.Base;
  9150  	    var C_enc = C.enc;
  9151  	    var Utf8 = C_enc.Utf8;
  9152  	    var C_algo = C.algo;
  9153  
  9154  	    /**
  9155  	     * HMAC algorithm.
  9156  	     */
  9157  	    var HMAC = C_algo.HMAC = Base.extend({
  9158  	        /**
  9159  	         * Initializes a newly created HMAC.
  9160  	         *
  9161  	         * @param {Hasher} hasher The hash algorithm to use.
  9162  	         * @param {WordArray|string} key The secret key.
  9163  	         *
  9164  	         * @example
  9165  	         *
  9166  	         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
  9167  	         */
  9168  	        init: function (hasher, key) {
  9169  	            // Init hasher
  9170  	            hasher = this._hasher = new hasher.init();
  9171  
  9172  	            // Convert string to WordArray, else assume WordArray already
  9173  	            if (typeof key == 'string') {
  9174  	                key = Utf8.parse(key);
  9175  	            }
  9176  
  9177  	            // Shortcuts
  9178  	            var hasherBlockSize = hasher.blockSize;
  9179  	            var hasherBlockSizeBytes = hasherBlockSize * 4;
  9180  
  9181  	            // Allow arbitrary length keys
  9182  	            if (key.sigBytes > hasherBlockSizeBytes) {
  9183  	                key = hasher.finalize(key);
  9184  	            }
  9185  
  9186  	            // Clamp excess bits
  9187  	            key.clamp();
  9188  
  9189  	            // Clone key for inner and outer pads
  9190  	            var oKey = this._oKey = key.clone();
  9191  	            var iKey = this._iKey = key.clone();
  9192  
  9193  	            // Shortcuts
  9194  	            var oKeyWords = oKey.words;
  9195  	            var iKeyWords = iKey.words;
  9196  
  9197  	            // XOR keys with pad constants
  9198  	            for (var i = 0; i < hasherBlockSize; i++) {
  9199  	                oKeyWords[i] ^= 0x5c5c5c5c;
  9200  	                iKeyWords[i] ^= 0x36363636;
  9201  	            }
  9202  	            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
  9203  
  9204  	            // Set initial values
  9205  	            this.reset();
  9206  	        },
  9207  
  9208  	        /**
  9209  	         * Resets this HMAC to its initial state.
  9210  	         *
  9211  	         * @example
  9212  	         *
  9213  	         *     hmacHasher.reset();
  9214  	         */
  9215  	        reset: function () {
  9216  	            // Shortcut
  9217  	            var hasher = this._hasher;
  9218  
  9219  	            // Reset
  9220  	            hasher.reset();
  9221  	            hasher.update(this._iKey);
  9222  	        },
  9223  
  9224  	        /**
  9225  	         * Updates this HMAC with a message.
  9226  	         *
  9227  	         * @param {WordArray|string} messageUpdate The message to append.
  9228  	         *
  9229  	         * @return {HMAC} This HMAC instance.
  9230  	         *
  9231  	         * @example
  9232  	         *
  9233  	         *     hmacHasher.update('message');
  9234  	         *     hmacHasher.update(wordArray);
  9235  	         */
  9236  	        update: function (messageUpdate) {
  9237  	            this._hasher.update(messageUpdate);
  9238  
  9239  	            // Chainable
  9240  	            return this;
  9241  	        },
  9242  
  9243  	        /**
  9244  	         * Finalizes the HMAC computation.
  9245  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  9246  	         *
  9247  	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
  9248  	         *
  9249  	         * @return {WordArray} The HMAC.
  9250  	         *
  9251  	         * @example
  9252  	         *
  9253  	         *     var hmac = hmacHasher.finalize();
  9254  	         *     var hmac = hmacHasher.finalize('message');
  9255  	         *     var hmac = hmacHasher.finalize(wordArray);
  9256  	         */
  9257  	        finalize: function (messageUpdate) {
  9258  	            // Shortcut
  9259  	            var hasher = this._hasher;
  9260  
  9261  	            // Compute HMAC
  9262  	            var innerHash = hasher.finalize(messageUpdate);
  9263  	            hasher.reset();
  9264  	            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
  9265  
  9266  	            return hmac;
  9267  	        }
  9268  	    });
  9269  	}());
  9270  
  9271  
  9272  }));
  9273  },{"./core":53}],59:[function(require,module,exports){
  9274  ;(function (root, factory, undef) {
  9275  	if (typeof exports === "object") {
  9276  		// CommonJS
  9277  		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy"));
  9278  	}
  9279  	else if (typeof define === "function" && define.amd) {
  9280  		// AMD
  9281  		define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory);
  9282  	}
  9283  	else {
  9284  		// Global (browser)
  9285  		root.CryptoJS = factory(root.CryptoJS);
  9286  	}
  9287  }(this, function (CryptoJS) {
  9288  
  9289  	return CryptoJS;
  9290  
  9291  }));
  9292  },{"./aes":51,"./cipher-core":52,"./core":53,"./enc-base64":54,"./enc-utf16":55,"./evpkdf":56,"./format-hex":57,"./hmac":58,"./lib-typedarrays":60,"./md5":61,"./mode-cfb":62,"./mode-ctr":64,"./mode-ctr-gladman":63,"./mode-ecb":65,"./mode-ofb":66,"./pad-ansix923":67,"./pad-iso10126":68,"./pad-iso97971":69,"./pad-nopadding":70,"./pad-zeropadding":71,"./pbkdf2":72,"./rabbit":74,"./rabbit-legacy":73,"./rc4":75,"./ripemd160":76,"./sha1":77,"./sha224":78,"./sha256":79,"./sha3":80,"./sha384":81,"./sha512":82,"./tripledes":83,"./x64-core":84}],60:[function(require,module,exports){
  9293  ;(function (root, factory) {
  9294  	if (typeof exports === "object") {
  9295  		// CommonJS
  9296  		module.exports = exports = factory(require("./core"));
  9297  	}
  9298  	else if (typeof define === "function" && define.amd) {
  9299  		// AMD
  9300  		define(["./core"], factory);
  9301  	}
  9302  	else {
  9303  		// Global (browser)
  9304  		factory(root.CryptoJS);
  9305  	}
  9306  }(this, function (CryptoJS) {
  9307  
  9308  	(function () {
  9309  	    // Check if typed arrays are supported
  9310  	    if (typeof ArrayBuffer != 'function') {
  9311  	        return;
  9312  	    }
  9313  
  9314  	    // Shortcuts
  9315  	    var C = CryptoJS;
  9316  	    var C_lib = C.lib;
  9317  	    var WordArray = C_lib.WordArray;
  9318  
  9319  	    // Reference original init
  9320  	    var superInit = WordArray.init;
  9321  
  9322  	    // Augment WordArray.init to handle typed arrays
  9323  	    var subInit = WordArray.init = function (typedArray) {
  9324  	        // Convert buffers to uint8
  9325  	        if (typedArray instanceof ArrayBuffer) {
  9326  	            typedArray = new Uint8Array(typedArray);
  9327  	        }
  9328  
  9329  	        // Convert other array views to uint8
  9330  	        if (
  9331  	            typedArray instanceof Int8Array ||
  9332  	            (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
  9333  	            typedArray instanceof Int16Array ||
  9334  	            typedArray instanceof Uint16Array ||
  9335  	            typedArray instanceof Int32Array ||
  9336  	            typedArray instanceof Uint32Array ||
  9337  	            typedArray instanceof Float32Array ||
  9338  	            typedArray instanceof Float64Array
  9339  	        ) {
  9340  	            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
  9341  	        }
  9342  
  9343  	        // Handle Uint8Array
  9344  	        if (typedArray instanceof Uint8Array) {
  9345  	            // Shortcut
  9346  	            var typedArrayByteLength = typedArray.byteLength;
  9347  
  9348  	            // Extract bytes
  9349  	            var words = [];
  9350  	            for (var i = 0; i < typedArrayByteLength; i++) {
  9351  	                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
  9352  	            }
  9353  
  9354  	            // Initialize this word array
  9355  	            superInit.call(this, words, typedArrayByteLength);
  9356  	        } else {
  9357  	            // Else call normal init
  9358  	            superInit.apply(this, arguments);
  9359  	        }
  9360  	    };
  9361  
  9362  	    subInit.prototype = WordArray;
  9363  	}());
  9364  
  9365  
  9366  	return CryptoJS.lib.WordArray;
  9367  
  9368  }));
  9369  },{"./core":53}],61:[function(require,module,exports){
  9370  ;(function (root, factory) {
  9371  	if (typeof exports === "object") {
  9372  		// CommonJS
  9373  		module.exports = exports = factory(require("./core"));
  9374  	}
  9375  	else if (typeof define === "function" && define.amd) {
  9376  		// AMD
  9377  		define(["./core"], factory);
  9378  	}
  9379  	else {
  9380  		// Global (browser)
  9381  		factory(root.CryptoJS);
  9382  	}
  9383  }(this, function (CryptoJS) {
  9384  
  9385  	(function (Math) {
  9386  	    // Shortcuts
  9387  	    var C = CryptoJS;
  9388  	    var C_lib = C.lib;
  9389  	    var WordArray = C_lib.WordArray;
  9390  	    var Hasher = C_lib.Hasher;
  9391  	    var C_algo = C.algo;
  9392  
  9393  	    // Constants table
  9394  	    var T = [];
  9395  
  9396  	    // Compute constants
  9397  	    (function () {
  9398  	        for (var i = 0; i < 64; i++) {
  9399  	            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
  9400  	        }
  9401  	    }());
  9402  
  9403  	    /**
  9404  	     * MD5 hash algorithm.
  9405  	     */
  9406  	    var MD5 = C_algo.MD5 = Hasher.extend({
  9407  	        _doReset: function () {
  9408  	            this._hash = new WordArray.init([
  9409  	                0x67452301, 0xefcdab89,
  9410  	                0x98badcfe, 0x10325476
  9411  	            ]);
  9412  	        },
  9413  
  9414  	        _doProcessBlock: function (M, offset) {
  9415  	            // Swap endian
  9416  	            for (var i = 0; i < 16; i++) {
  9417  	                // Shortcuts
  9418  	                var offset_i = offset + i;
  9419  	                var M_offset_i = M[offset_i];
  9420  
  9421  	                M[offset_i] = (
  9422  	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
  9423  	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
  9424  	                );
  9425  	            }
  9426  
  9427  	            // Shortcuts
  9428  	            var H = this._hash.words;
  9429  
  9430  	            var M_offset_0  = M[offset + 0];
  9431  	            var M_offset_1  = M[offset + 1];
  9432  	            var M_offset_2  = M[offset + 2];
  9433  	            var M_offset_3  = M[offset + 3];
  9434  	            var M_offset_4  = M[offset + 4];
  9435  	            var M_offset_5  = M[offset + 5];
  9436  	            var M_offset_6  = M[offset + 6];
  9437  	            var M_offset_7  = M[offset + 7];
  9438  	            var M_offset_8  = M[offset + 8];
  9439  	            var M_offset_9  = M[offset + 9];
  9440  	            var M_offset_10 = M[offset + 10];
  9441  	            var M_offset_11 = M[offset + 11];
  9442  	            var M_offset_12 = M[offset + 12];
  9443  	            var M_offset_13 = M[offset + 13];
  9444  	            var M_offset_14 = M[offset + 14];
  9445  	            var M_offset_15 = M[offset + 15];
  9446  
  9447  	            // Working varialbes
  9448  	            var a = H[0];
  9449  	            var b = H[1];
  9450  	            var c = H[2];
  9451  	            var d = H[3];
  9452  
  9453  	            // Computation
  9454  	            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);
  9455  	            d = FF(d, a, b, c, M_offset_1,  12, T[1]);
  9456  	            c = FF(c, d, a, b, M_offset_2,  17, T[2]);
  9457  	            b = FF(b, c, d, a, M_offset_3,  22, T[3]);
  9458  	            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);
  9459  	            d = FF(d, a, b, c, M_offset_5,  12, T[5]);
  9460  	            c = FF(c, d, a, b, M_offset_6,  17, T[6]);
  9461  	            b = FF(b, c, d, a, M_offset_7,  22, T[7]);
  9462  	            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);
  9463  	            d = FF(d, a, b, c, M_offset_9,  12, T[9]);
  9464  	            c = FF(c, d, a, b, M_offset_10, 17, T[10]);
  9465  	            b = FF(b, c, d, a, M_offset_11, 22, T[11]);
  9466  	            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);
  9467  	            d = FF(d, a, b, c, M_offset_13, 12, T[13]);
  9468  	            c = FF(c, d, a, b, M_offset_14, 17, T[14]);
  9469  	            b = FF(b, c, d, a, M_offset_15, 22, T[15]);
  9470  
  9471  	            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);
  9472  	            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);
  9473  	            c = GG(c, d, a, b, M_offset_11, 14, T[18]);
  9474  	            b = GG(b, c, d, a, M_offset_0,  20, T[19]);
  9475  	            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);
  9476  	            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);
  9477  	            c = GG(c, d, a, b, M_offset_15, 14, T[22]);
  9478  	            b = GG(b, c, d, a, M_offset_4,  20, T[23]);
  9479  	            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);
  9480  	            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);
  9481  	            c = GG(c, d, a, b, M_offset_3,  14, T[26]);
  9482  	            b = GG(b, c, d, a, M_offset_8,  20, T[27]);
  9483  	            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);
  9484  	            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);
  9485  	            c = GG(c, d, a, b, M_offset_7,  14, T[30]);
  9486  	            b = GG(b, c, d, a, M_offset_12, 20, T[31]);
  9487  
  9488  	            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);
  9489  	            d = HH(d, a, b, c, M_offset_8,  11, T[33]);
  9490  	            c = HH(c, d, a, b, M_offset_11, 16, T[34]);
  9491  	            b = HH(b, c, d, a, M_offset_14, 23, T[35]);
  9492  	            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);
  9493  	            d = HH(d, a, b, c, M_offset_4,  11, T[37]);
  9494  	            c = HH(c, d, a, b, M_offset_7,  16, T[38]);
  9495  	            b = HH(b, c, d, a, M_offset_10, 23, T[39]);
  9496  	            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);
  9497  	            d = HH(d, a, b, c, M_offset_0,  11, T[41]);
  9498  	            c = HH(c, d, a, b, M_offset_3,  16, T[42]);
  9499  	            b = HH(b, c, d, a, M_offset_6,  23, T[43]);
  9500  	            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);
  9501  	            d = HH(d, a, b, c, M_offset_12, 11, T[45]);
  9502  	            c = HH(c, d, a, b, M_offset_15, 16, T[46]);
  9503  	            b = HH(b, c, d, a, M_offset_2,  23, T[47]);
  9504  
  9505  	            a = II(a, b, c, d, M_offset_0,  6,  T[48]);
  9506  	            d = II(d, a, b, c, M_offset_7,  10, T[49]);
  9507  	            c = II(c, d, a, b, M_offset_14, 15, T[50]);
  9508  	            b = II(b, c, d, a, M_offset_5,  21, T[51]);
  9509  	            a = II(a, b, c, d, M_offset_12, 6,  T[52]);
  9510  	            d = II(d, a, b, c, M_offset_3,  10, T[53]);
  9511  	            c = II(c, d, a, b, M_offset_10, 15, T[54]);
  9512  	            b = II(b, c, d, a, M_offset_1,  21, T[55]);
  9513  	            a = II(a, b, c, d, M_offset_8,  6,  T[56]);
  9514  	            d = II(d, a, b, c, M_offset_15, 10, T[57]);
  9515  	            c = II(c, d, a, b, M_offset_6,  15, T[58]);
  9516  	            b = II(b, c, d, a, M_offset_13, 21, T[59]);
  9517  	            a = II(a, b, c, d, M_offset_4,  6,  T[60]);
  9518  	            d = II(d, a, b, c, M_offset_11, 10, T[61]);
  9519  	            c = II(c, d, a, b, M_offset_2,  15, T[62]);
  9520  	            b = II(b, c, d, a, M_offset_9,  21, T[63]);
  9521  
  9522  	            // Intermediate hash value
  9523  	            H[0] = (H[0] + a) | 0;
  9524  	            H[1] = (H[1] + b) | 0;
  9525  	            H[2] = (H[2] + c) | 0;
  9526  	            H[3] = (H[3] + d) | 0;
  9527  	        },
  9528  
  9529  	        _doFinalize: function () {
  9530  	            // Shortcuts
  9531  	            var data = this._data;
  9532  	            var dataWords = data.words;
  9533  
  9534  	            var nBitsTotal = this._nDataBytes * 8;
  9535  	            var nBitsLeft = data.sigBytes * 8;
  9536  
  9537  	            // Add padding
  9538  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
  9539  
  9540  	            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
  9541  	            var nBitsTotalL = nBitsTotal;
  9542  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
  9543  	                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
  9544  	                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)
  9545  	            );
  9546  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
  9547  	                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
  9548  	                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)
  9549  	            );
  9550  
  9551  	            data.sigBytes = (dataWords.length + 1) * 4;
  9552  
  9553  	            // Hash final blocks
  9554  	            this._process();
  9555  
  9556  	            // Shortcuts
  9557  	            var hash = this._hash;
  9558  	            var H = hash.words;
  9559  
  9560  	            // Swap endian
  9561  	            for (var i = 0; i < 4; i++) {
  9562  	                // Shortcut
  9563  	                var H_i = H[i];
  9564  
  9565  	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
  9566  	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
  9567  	            }
  9568  
  9569  	            // Return final computed hash
  9570  	            return hash;
  9571  	        },
  9572  
  9573  	        clone: function () {
  9574  	            var clone = Hasher.clone.call(this);
  9575  	            clone._hash = this._hash.clone();
  9576  
  9577  	            return clone;
  9578  	        }
  9579  	    });
  9580  
  9581  	    function FF(a, b, c, d, x, s, t) {
  9582  	        var n = a + ((b & c) | (~b & d)) + x + t;
  9583  	        return ((n << s) | (n >>> (32 - s))) + b;
  9584  	    }
  9585  
  9586  	    function GG(a, b, c, d, x, s, t) {
  9587  	        var n = a + ((b & d) | (c & ~d)) + x + t;
  9588  	        return ((n << s) | (n >>> (32 - s))) + b;
  9589  	    }
  9590  
  9591  	    function HH(a, b, c, d, x, s, t) {
  9592  	        var n = a + (b ^ c ^ d) + x + t;
  9593  	        return ((n << s) | (n >>> (32 - s))) + b;
  9594  	    }
  9595  
  9596  	    function II(a, b, c, d, x, s, t) {
  9597  	        var n = a + (c ^ (b | ~d)) + x + t;
  9598  	        return ((n << s) | (n >>> (32 - s))) + b;
  9599  	    }
  9600  
  9601  	    /**
  9602  	     * Shortcut function to the hasher's object interface.
  9603  	     *
  9604  	     * @param {WordArray|string} message The message to hash.
  9605  	     *
  9606  	     * @return {WordArray} The hash.
  9607  	     *
  9608  	     * @static
  9609  	     *
  9610  	     * @example
  9611  	     *
  9612  	     *     var hash = CryptoJS.MD5('message');
  9613  	     *     var hash = CryptoJS.MD5(wordArray);
  9614  	     */
  9615  	    C.MD5 = Hasher._createHelper(MD5);
  9616  
  9617  	    /**
  9618  	     * Shortcut function to the HMAC's object interface.
  9619  	     *
  9620  	     * @param {WordArray|string} message The message to hash.
  9621  	     * @param {WordArray|string} key The secret key.
  9622  	     *
  9623  	     * @return {WordArray} The HMAC.
  9624  	     *
  9625  	     * @static
  9626  	     *
  9627  	     * @example
  9628  	     *
  9629  	     *     var hmac = CryptoJS.HmacMD5(message, key);
  9630  	     */
  9631  	    C.HmacMD5 = Hasher._createHmacHelper(MD5);
  9632  	}(Math));
  9633  
  9634  
  9635  	return CryptoJS.MD5;
  9636  
  9637  }));
  9638  },{"./core":53}],62:[function(require,module,exports){
  9639  ;(function (root, factory, undef) {
  9640  	if (typeof exports === "object") {
  9641  		// CommonJS
  9642  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9643  	}
  9644  	else if (typeof define === "function" && define.amd) {
  9645  		// AMD
  9646  		define(["./core", "./cipher-core"], factory);
  9647  	}
  9648  	else {
  9649  		// Global (browser)
  9650  		factory(root.CryptoJS);
  9651  	}
  9652  }(this, function (CryptoJS) {
  9653  
  9654  	/**
  9655  	 * Cipher Feedback block mode.
  9656  	 */
  9657  	CryptoJS.mode.CFB = (function () {
  9658  	    var CFB = CryptoJS.lib.BlockCipherMode.extend();
  9659  
  9660  	    CFB.Encryptor = CFB.extend({
  9661  	        processBlock: function (words, offset) {
  9662  	            // Shortcuts
  9663  	            var cipher = this._cipher;
  9664  	            var blockSize = cipher.blockSize;
  9665  
  9666  	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
  9667  
  9668  	            // Remember this block to use with next block
  9669  	            this._prevBlock = words.slice(offset, offset + blockSize);
  9670  	        }
  9671  	    });
  9672  
  9673  	    CFB.Decryptor = CFB.extend({
  9674  	        processBlock: function (words, offset) {
  9675  	            // Shortcuts
  9676  	            var cipher = this._cipher;
  9677  	            var blockSize = cipher.blockSize;
  9678  
  9679  	            // Remember this block to use with next block
  9680  	            var thisBlock = words.slice(offset, offset + blockSize);
  9681  
  9682  	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
  9683  
  9684  	            // This block becomes the previous block
  9685  	            this._prevBlock = thisBlock;
  9686  	        }
  9687  	    });
  9688  
  9689  	    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
  9690  	        // Shortcut
  9691  	        var iv = this._iv;
  9692  
  9693  	        // Generate keystream
  9694  	        if (iv) {
  9695  	            var keystream = iv.slice(0);
  9696  
  9697  	            // Remove IV for subsequent blocks
  9698  	            this._iv = undefined;
  9699  	        } else {
  9700  	            var keystream = this._prevBlock;
  9701  	        }
  9702  	        cipher.encryptBlock(keystream, 0);
  9703  
  9704  	        // Encrypt
  9705  	        for (var i = 0; i < blockSize; i++) {
  9706  	            words[offset + i] ^= keystream[i];
  9707  	        }
  9708  	    }
  9709  
  9710  	    return CFB;
  9711  	}());
  9712  
  9713  
  9714  	return CryptoJS.mode.CFB;
  9715  
  9716  }));
  9717  },{"./cipher-core":52,"./core":53}],63:[function(require,module,exports){
  9718  ;(function (root, factory, undef) {
  9719  	if (typeof exports === "object") {
  9720  		// CommonJS
  9721  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9722  	}
  9723  	else if (typeof define === "function" && define.amd) {
  9724  		// AMD
  9725  		define(["./core", "./cipher-core"], factory);
  9726  	}
  9727  	else {
  9728  		// Global (browser)
  9729  		factory(root.CryptoJS);
  9730  	}
  9731  }(this, function (CryptoJS) {
  9732  
  9733  	/** @preserve
  9734  	 * Counter block mode compatible with  Dr Brian Gladman fileenc.c
  9735  	 * derived from CryptoJS.mode.CTR
  9736  	 * Jan Hruby jhruby.web@gmail.com
  9737  	 */
  9738  	CryptoJS.mode.CTRGladman = (function () {
  9739  	    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
  9740  
  9741  		function incWord(word)
  9742  		{
  9743  			if (((word >> 24) & 0xff) === 0xff) { //overflow
  9744  			var b1 = (word >> 16)&0xff;
  9745  			var b2 = (word >> 8)&0xff;
  9746  			var b3 = word & 0xff;
  9747  
  9748  			if (b1 === 0xff) // overflow b1
  9749  			{
  9750  			b1 = 0;
  9751  			if (b2 === 0xff)
  9752  			{
  9753  				b2 = 0;
  9754  				if (b3 === 0xff)
  9755  				{
  9756  					b3 = 0;
  9757  				}
  9758  				else
  9759  				{
  9760  					++b3;
  9761  				}
  9762  			}
  9763  			else
  9764  			{
  9765  				++b2;
  9766  			}
  9767  			}
  9768  			else
  9769  			{
  9770  			++b1;
  9771  			}
  9772  
  9773  			word = 0;
  9774  			word += (b1 << 16);
  9775  			word += (b2 << 8);
  9776  			word += b3;
  9777  			}
  9778  			else
  9779  			{
  9780  			word += (0x01 << 24);
  9781  			}
  9782  			return word;
  9783  		}
  9784  
  9785  		function incCounter(counter)
  9786  		{
  9787  			if ((counter[0] = incWord(counter[0])) === 0)
  9788  			{
  9789  				// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8
  9790  				counter[1] = incWord(counter[1]);
  9791  			}
  9792  			return counter;
  9793  		}
  9794  
  9795  	    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
  9796  	        processBlock: function (words, offset) {
  9797  	            // Shortcuts
  9798  	            var cipher = this._cipher
  9799  	            var blockSize = cipher.blockSize;
  9800  	            var iv = this._iv;
  9801  	            var counter = this._counter;
  9802  
  9803  	            // Generate keystream
  9804  	            if (iv) {
  9805  	                counter = this._counter = iv.slice(0);
  9806  
  9807  	                // Remove IV for subsequent blocks
  9808  	                this._iv = undefined;
  9809  	            }
  9810  
  9811  				incCounter(counter);
  9812  
  9813  				var keystream = counter.slice(0);
  9814  	            cipher.encryptBlock(keystream, 0);
  9815  
  9816  	            // Encrypt
  9817  	            for (var i = 0; i < blockSize; i++) {
  9818  	                words[offset + i] ^= keystream[i];
  9819  	            }
  9820  	        }
  9821  	    });
  9822  
  9823  	    CTRGladman.Decryptor = Encryptor;
  9824  
  9825  	    return CTRGladman;
  9826  	}());
  9827  
  9828  
  9829  
  9830  
  9831  	return CryptoJS.mode.CTRGladman;
  9832  
  9833  }));
  9834  },{"./cipher-core":52,"./core":53}],64:[function(require,module,exports){
  9835  ;(function (root, factory, undef) {
  9836  	if (typeof exports === "object") {
  9837  		// CommonJS
  9838  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9839  	}
  9840  	else if (typeof define === "function" && define.amd) {
  9841  		// AMD
  9842  		define(["./core", "./cipher-core"], factory);
  9843  	}
  9844  	else {
  9845  		// Global (browser)
  9846  		factory(root.CryptoJS);
  9847  	}
  9848  }(this, function (CryptoJS) {
  9849  
  9850  	/**
  9851  	 * Counter block mode.
  9852  	 */
  9853  	CryptoJS.mode.CTR = (function () {
  9854  	    var CTR = CryptoJS.lib.BlockCipherMode.extend();
  9855  
  9856  	    var Encryptor = CTR.Encryptor = CTR.extend({
  9857  	        processBlock: function (words, offset) {
  9858  	            // Shortcuts
  9859  	            var cipher = this._cipher
  9860  	            var blockSize = cipher.blockSize;
  9861  	            var iv = this._iv;
  9862  	            var counter = this._counter;
  9863  
  9864  	            // Generate keystream
  9865  	            if (iv) {
  9866  	                counter = this._counter = iv.slice(0);
  9867  
  9868  	                // Remove IV for subsequent blocks
  9869  	                this._iv = undefined;
  9870  	            }
  9871  	            var keystream = counter.slice(0);
  9872  	            cipher.encryptBlock(keystream, 0);
  9873  
  9874  	            // Increment counter
  9875  	            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
  9876  
  9877  	            // Encrypt
  9878  	            for (var i = 0; i < blockSize; i++) {
  9879  	                words[offset + i] ^= keystream[i];
  9880  	            }
  9881  	        }
  9882  	    });
  9883  
  9884  	    CTR.Decryptor = Encryptor;
  9885  
  9886  	    return CTR;
  9887  	}());
  9888  
  9889  
  9890  	return CryptoJS.mode.CTR;
  9891  
  9892  }));
  9893  },{"./cipher-core":52,"./core":53}],65:[function(require,module,exports){
  9894  ;(function (root, factory, undef) {
  9895  	if (typeof exports === "object") {
  9896  		// CommonJS
  9897  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9898  	}
  9899  	else if (typeof define === "function" && define.amd) {
  9900  		// AMD
  9901  		define(["./core", "./cipher-core"], factory);
  9902  	}
  9903  	else {
  9904  		// Global (browser)
  9905  		factory(root.CryptoJS);
  9906  	}
  9907  }(this, function (CryptoJS) {
  9908  
  9909  	/**
  9910  	 * Electronic Codebook block mode.
  9911  	 */
  9912  	CryptoJS.mode.ECB = (function () {
  9913  	    var ECB = CryptoJS.lib.BlockCipherMode.extend();
  9914  
  9915  	    ECB.Encryptor = ECB.extend({
  9916  	        processBlock: function (words, offset) {
  9917  	            this._cipher.encryptBlock(words, offset);
  9918  	        }
  9919  	    });
  9920  
  9921  	    ECB.Decryptor = ECB.extend({
  9922  	        processBlock: function (words, offset) {
  9923  	            this._cipher.decryptBlock(words, offset);
  9924  	        }
  9925  	    });
  9926  
  9927  	    return ECB;
  9928  	}());
  9929  
  9930  
  9931  	return CryptoJS.mode.ECB;
  9932  
  9933  }));
  9934  },{"./cipher-core":52,"./core":53}],66:[function(require,module,exports){
  9935  ;(function (root, factory, undef) {
  9936  	if (typeof exports === "object") {
  9937  		// CommonJS
  9938  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9939  	}
  9940  	else if (typeof define === "function" && define.amd) {
  9941  		// AMD
  9942  		define(["./core", "./cipher-core"], factory);
  9943  	}
  9944  	else {
  9945  		// Global (browser)
  9946  		factory(root.CryptoJS);
  9947  	}
  9948  }(this, function (CryptoJS) {
  9949  
  9950  	/**
  9951  	 * Output Feedback block mode.
  9952  	 */
  9953  	CryptoJS.mode.OFB = (function () {
  9954  	    var OFB = CryptoJS.lib.BlockCipherMode.extend();
  9955  
  9956  	    var Encryptor = OFB.Encryptor = OFB.extend({
  9957  	        processBlock: function (words, offset) {
  9958  	            // Shortcuts
  9959  	            var cipher = this._cipher
  9960  	            var blockSize = cipher.blockSize;
  9961  	            var iv = this._iv;
  9962  	            var keystream = this._keystream;
  9963  
  9964  	            // Generate keystream
  9965  	            if (iv) {
  9966  	                keystream = this._keystream = iv.slice(0);
  9967  
  9968  	                // Remove IV for subsequent blocks
  9969  	                this._iv = undefined;
  9970  	            }
  9971  	            cipher.encryptBlock(keystream, 0);
  9972  
  9973  	            // Encrypt
  9974  	            for (var i = 0; i < blockSize; i++) {
  9975  	                words[offset + i] ^= keystream[i];
  9976  	            }
  9977  	        }
  9978  	    });
  9979  
  9980  	    OFB.Decryptor = Encryptor;
  9981  
  9982  	    return OFB;
  9983  	}());
  9984  
  9985  
  9986  	return CryptoJS.mode.OFB;
  9987  
  9988  }));
  9989  },{"./cipher-core":52,"./core":53}],67:[function(require,module,exports){
  9990  ;(function (root, factory, undef) {
  9991  	if (typeof exports === "object") {
  9992  		// CommonJS
  9993  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9994  	}
  9995  	else if (typeof define === "function" && define.amd) {
  9996  		// AMD
  9997  		define(["./core", "./cipher-core"], factory);
  9998  	}
  9999  	else {
 10000  		// Global (browser)
 10001  		factory(root.CryptoJS);
 10002  	}
 10003  }(this, function (CryptoJS) {
 10004  
 10005  	/**
 10006  	 * ANSI X.923 padding strategy.
 10007  	 */
 10008  	CryptoJS.pad.AnsiX923 = {
 10009  	    pad: function (data, blockSize) {
 10010  	        // Shortcuts
 10011  	        var dataSigBytes = data.sigBytes;
 10012  	        var blockSizeBytes = blockSize * 4;
 10013  
 10014  	        // Count padding bytes
 10015  	        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
 10016  
 10017  	        // Compute last byte position
 10018  	        var lastBytePos = dataSigBytes + nPaddingBytes - 1;
 10019  
 10020  	        // Pad
 10021  	        data.clamp();
 10022  	        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
 10023  	        data.sigBytes += nPaddingBytes;
 10024  	    },
 10025  
 10026  	    unpad: function (data) {
 10027  	        // Get number of padding bytes from last byte
 10028  	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
 10029  
 10030  	        // Remove padding
 10031  	        data.sigBytes -= nPaddingBytes;
 10032  	    }
 10033  	};
 10034  
 10035  
 10036  	return CryptoJS.pad.Ansix923;
 10037  
 10038  }));
 10039  },{"./cipher-core":52,"./core":53}],68:[function(require,module,exports){
 10040  ;(function (root, factory, undef) {
 10041  	if (typeof exports === "object") {
 10042  		// CommonJS
 10043  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10044  	}
 10045  	else if (typeof define === "function" && define.amd) {
 10046  		// AMD
 10047  		define(["./core", "./cipher-core"], factory);
 10048  	}
 10049  	else {
 10050  		// Global (browser)
 10051  		factory(root.CryptoJS);
 10052  	}
 10053  }(this, function (CryptoJS) {
 10054  
 10055  	/**
 10056  	 * ISO 10126 padding strategy.
 10057  	 */
 10058  	CryptoJS.pad.Iso10126 = {
 10059  	    pad: function (data, blockSize) {
 10060  	        // Shortcut
 10061  	        var blockSizeBytes = blockSize * 4;
 10062  
 10063  	        // Count padding bytes
 10064  	        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
 10065  
 10066  	        // Pad
 10067  	        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
 10068  	             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
 10069  	    },
 10070  
 10071  	    unpad: function (data) {
 10072  	        // Get number of padding bytes from last byte
 10073  	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
 10074  
 10075  	        // Remove padding
 10076  	        data.sigBytes -= nPaddingBytes;
 10077  	    }
 10078  	};
 10079  
 10080  
 10081  	return CryptoJS.pad.Iso10126;
 10082  
 10083  }));
 10084  },{"./cipher-core":52,"./core":53}],69:[function(require,module,exports){
 10085  ;(function (root, factory, undef) {
 10086  	if (typeof exports === "object") {
 10087  		// CommonJS
 10088  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10089  	}
 10090  	else if (typeof define === "function" && define.amd) {
 10091  		// AMD
 10092  		define(["./core", "./cipher-core"], factory);
 10093  	}
 10094  	else {
 10095  		// Global (browser)
 10096  		factory(root.CryptoJS);
 10097  	}
 10098  }(this, function (CryptoJS) {
 10099  
 10100  	/**
 10101  	 * ISO/IEC 9797-1 Padding Method 2.
 10102  	 */
 10103  	CryptoJS.pad.Iso97971 = {
 10104  	    pad: function (data, blockSize) {
 10105  	        // Add 0x80 byte
 10106  	        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
 10107  
 10108  	        // Zero pad the rest
 10109  	        CryptoJS.pad.ZeroPadding.pad(data, blockSize);
 10110  	    },
 10111  
 10112  	    unpad: function (data) {
 10113  	        // Remove zero padding
 10114  	        CryptoJS.pad.ZeroPadding.unpad(data);
 10115  
 10116  	        // Remove one more byte -- the 0x80 byte
 10117  	        data.sigBytes--;
 10118  	    }
 10119  	};
 10120  
 10121  
 10122  	return CryptoJS.pad.Iso97971;
 10123  
 10124  }));
 10125  },{"./cipher-core":52,"./core":53}],70:[function(require,module,exports){
 10126  ;(function (root, factory, undef) {
 10127  	if (typeof exports === "object") {
 10128  		// CommonJS
 10129  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10130  	}
 10131  	else if (typeof define === "function" && define.amd) {
 10132  		// AMD
 10133  		define(["./core", "./cipher-core"], factory);
 10134  	}
 10135  	else {
 10136  		// Global (browser)
 10137  		factory(root.CryptoJS);
 10138  	}
 10139  }(this, function (CryptoJS) {
 10140  
 10141  	/**
 10142  	 * A noop padding strategy.
 10143  	 */
 10144  	CryptoJS.pad.NoPadding = {
 10145  	    pad: function () {
 10146  	    },
 10147  
 10148  	    unpad: function () {
 10149  	    }
 10150  	};
 10151  
 10152  
 10153  	return CryptoJS.pad.NoPadding;
 10154  
 10155  }));
 10156  },{"./cipher-core":52,"./core":53}],71:[function(require,module,exports){
 10157  ;(function (root, factory, undef) {
 10158  	if (typeof exports === "object") {
 10159  		// CommonJS
 10160  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10161  	}
 10162  	else if (typeof define === "function" && define.amd) {
 10163  		// AMD
 10164  		define(["./core", "./cipher-core"], factory);
 10165  	}
 10166  	else {
 10167  		// Global (browser)
 10168  		factory(root.CryptoJS);
 10169  	}
 10170  }(this, function (CryptoJS) {
 10171  
 10172  	/**
 10173  	 * Zero padding strategy.
 10174  	 */
 10175  	CryptoJS.pad.ZeroPadding = {
 10176  	    pad: function (data, blockSize) {
 10177  	        // Shortcut
 10178  	        var blockSizeBytes = blockSize * 4;
 10179  
 10180  	        // Pad
 10181  	        data.clamp();
 10182  	        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
 10183  	    },
 10184  
 10185  	    unpad: function (data) {
 10186  	        // Shortcut
 10187  	        var dataWords = data.words;
 10188  
 10189  	        // Unpad
 10190  	        var i = data.sigBytes - 1;
 10191  	        while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
 10192  	            i--;
 10193  	        }
 10194  	        data.sigBytes = i + 1;
 10195  	    }
 10196  	};
 10197  
 10198  
 10199  	return CryptoJS.pad.ZeroPadding;
 10200  
 10201  }));
 10202  },{"./cipher-core":52,"./core":53}],72:[function(require,module,exports){
 10203  ;(function (root, factory, undef) {
 10204  	if (typeof exports === "object") {
 10205  		// CommonJS
 10206  		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
 10207  	}
 10208  	else if (typeof define === "function" && define.amd) {
 10209  		// AMD
 10210  		define(["./core", "./sha1", "./hmac"], factory);
 10211  	}
 10212  	else {
 10213  		// Global (browser)
 10214  		factory(root.CryptoJS);
 10215  	}
 10216  }(this, function (CryptoJS) {
 10217  
 10218  	(function () {
 10219  	    // Shortcuts
 10220  	    var C = CryptoJS;
 10221  	    var C_lib = C.lib;
 10222  	    var Base = C_lib.Base;
 10223  	    var WordArray = C_lib.WordArray;
 10224  	    var C_algo = C.algo;
 10225  	    var SHA1 = C_algo.SHA1;
 10226  	    var HMAC = C_algo.HMAC;
 10227  
 10228  	    /**
 10229  	     * Password-Based Key Derivation Function 2 algorithm.
 10230  	     */
 10231  	    var PBKDF2 = C_algo.PBKDF2 = Base.extend({
 10232  	        /**
 10233  	         * Configuration options.
 10234  	         *
 10235  	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
 10236  	         * @property {Hasher} hasher The hasher to use. Default: SHA1
 10237  	         * @property {number} iterations The number of iterations to perform. Default: 1
 10238  	         */
 10239  	        cfg: Base.extend({
 10240  	            keySize: 128/32,
 10241  	            hasher: SHA1,
 10242  	            iterations: 1
 10243  	        }),
 10244  
 10245  	        /**
 10246  	         * Initializes a newly created key derivation function.
 10247  	         *
 10248  	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
 10249  	         *
 10250  	         * @example
 10251  	         *
 10252  	         *     var kdf = CryptoJS.algo.PBKDF2.create();
 10253  	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
 10254  	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
 10255  	         */
 10256  	        init: function (cfg) {
 10257  	            this.cfg = this.cfg.extend(cfg);
 10258  	        },
 10259  
 10260  	        /**
 10261  	         * Computes the Password-Based Key Derivation Function 2.
 10262  	         *
 10263  	         * @param {WordArray|string} password The password.
 10264  	         * @param {WordArray|string} salt A salt.
 10265  	         *
 10266  	         * @return {WordArray} The derived key.
 10267  	         *
 10268  	         * @example
 10269  	         *
 10270  	         *     var key = kdf.compute(password, salt);
 10271  	         */
 10272  	        compute: function (password, salt) {
 10273  	            // Shortcut
 10274  	            var cfg = this.cfg;
 10275  
 10276  	            // Init HMAC
 10277  	            var hmac = HMAC.create(cfg.hasher, password);
 10278  
 10279  	            // Initial values
 10280  	            var derivedKey = WordArray.create();
 10281  	            var blockIndex = WordArray.create([0x00000001]);
 10282  
 10283  	            // Shortcuts
 10284  	            var derivedKeyWords = derivedKey.words;
 10285  	            var blockIndexWords = blockIndex.words;
 10286  	            var keySize = cfg.keySize;
 10287  	            var iterations = cfg.iterations;
 10288  
 10289  	            // Generate key
 10290  	            while (derivedKeyWords.length < keySize) {
 10291  	                var block = hmac.update(salt).finalize(blockIndex);
 10292  	                hmac.reset();
 10293  
 10294  	                // Shortcuts
 10295  	                var blockWords = block.words;
 10296  	                var blockWordsLength = blockWords.length;
 10297  
 10298  	                // Iterations
 10299  	                var intermediate = block;
 10300  	                for (var i = 1; i < iterations; i++) {
 10301  	                    intermediate = hmac.finalize(intermediate);
 10302  	                    hmac.reset();
 10303  
 10304  	                    // Shortcut
 10305  	                    var intermediateWords = intermediate.words;
 10306  
 10307  	                    // XOR intermediate with block
 10308  	                    for (var j = 0; j < blockWordsLength; j++) {
 10309  	                        blockWords[j] ^= intermediateWords[j];
 10310  	                    }
 10311  	                }
 10312  
 10313  	                derivedKey.concat(block);
 10314  	                blockIndexWords[0]++;
 10315  	            }
 10316  	            derivedKey.sigBytes = keySize * 4;
 10317  
 10318  	            return derivedKey;
 10319  	        }
 10320  	    });
 10321  
 10322  	    /**
 10323  	     * Computes the Password-Based Key Derivation Function 2.
 10324  	     *
 10325  	     * @param {WordArray|string} password The password.
 10326  	     * @param {WordArray|string} salt A salt.
 10327  	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
 10328  	     *
 10329  	     * @return {WordArray} The derived key.
 10330  	     *
 10331  	     * @static
 10332  	     *
 10333  	     * @example
 10334  	     *
 10335  	     *     var key = CryptoJS.PBKDF2(password, salt);
 10336  	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
 10337  	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
 10338  	     */
 10339  	    C.PBKDF2 = function (password, salt, cfg) {
 10340  	        return PBKDF2.create(cfg).compute(password, salt);
 10341  	    };
 10342  	}());
 10343  
 10344  
 10345  	return CryptoJS.PBKDF2;
 10346  
 10347  }));
 10348  },{"./core":53,"./hmac":58,"./sha1":77}],73:[function(require,module,exports){
 10349  ;(function (root, factory, undef) {
 10350  	if (typeof exports === "object") {
 10351  		// CommonJS
 10352  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10353  	}
 10354  	else if (typeof define === "function" && define.amd) {
 10355  		// AMD
 10356  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10357  	}
 10358  	else {
 10359  		// Global (browser)
 10360  		factory(root.CryptoJS);
 10361  	}
 10362  }(this, function (CryptoJS) {
 10363  
 10364  	(function () {
 10365  	    // Shortcuts
 10366  	    var C = CryptoJS;
 10367  	    var C_lib = C.lib;
 10368  	    var StreamCipher = C_lib.StreamCipher;
 10369  	    var C_algo = C.algo;
 10370  
 10371  	    // Reusable objects
 10372  	    var S  = [];
 10373  	    var C_ = [];
 10374  	    var G  = [];
 10375  
 10376  	    /**
 10377  	     * Rabbit stream cipher algorithm.
 10378  	     *
 10379  	     * This is a legacy version that neglected to convert the key to little-endian.
 10380  	     * This error doesn't affect the cipher's security,
 10381  	     * but it does affect its compatibility with other implementations.
 10382  	     */
 10383  	    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
 10384  	        _doReset: function () {
 10385  	            // Shortcuts
 10386  	            var K = this._key.words;
 10387  	            var iv = this.cfg.iv;
 10388  
 10389  	            // Generate initial state values
 10390  	            var X = this._X = [
 10391  	                K[0], (K[3] << 16) | (K[2] >>> 16),
 10392  	                K[1], (K[0] << 16) | (K[3] >>> 16),
 10393  	                K[2], (K[1] << 16) | (K[0] >>> 16),
 10394  	                K[3], (K[2] << 16) | (K[1] >>> 16)
 10395  	            ];
 10396  
 10397  	            // Generate initial counter values
 10398  	            var C = this._C = [
 10399  	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
 10400  	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
 10401  	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
 10402  	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
 10403  	            ];
 10404  
 10405  	            // Carry bit
 10406  	            this._b = 0;
 10407  
 10408  	            // Iterate the system four times
 10409  	            for (var i = 0; i < 4; i++) {
 10410  	                nextState.call(this);
 10411  	            }
 10412  
 10413  	            // Modify the counters
 10414  	            for (var i = 0; i < 8; i++) {
 10415  	                C[i] ^= X[(i + 4) & 7];
 10416  	            }
 10417  
 10418  	            // IV setup
 10419  	            if (iv) {
 10420  	                // Shortcuts
 10421  	                var IV = iv.words;
 10422  	                var IV_0 = IV[0];
 10423  	                var IV_1 = IV[1];
 10424  
 10425  	                // Generate four subvectors
 10426  	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
 10427  	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
 10428  	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
 10429  	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
 10430  
 10431  	                // Modify counter values
 10432  	                C[0] ^= i0;
 10433  	                C[1] ^= i1;
 10434  	                C[2] ^= i2;
 10435  	                C[3] ^= i3;
 10436  	                C[4] ^= i0;
 10437  	                C[5] ^= i1;
 10438  	                C[6] ^= i2;
 10439  	                C[7] ^= i3;
 10440  
 10441  	                // Iterate the system four times
 10442  	                for (var i = 0; i < 4; i++) {
 10443  	                    nextState.call(this);
 10444  	                }
 10445  	            }
 10446  	        },
 10447  
 10448  	        _doProcessBlock: function (M, offset) {
 10449  	            // Shortcut
 10450  	            var X = this._X;
 10451  
 10452  	            // Iterate the system
 10453  	            nextState.call(this);
 10454  
 10455  	            // Generate four keystream words
 10456  	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
 10457  	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
 10458  	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
 10459  	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
 10460  
 10461  	            for (var i = 0; i < 4; i++) {
 10462  	                // Swap endian
 10463  	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
 10464  	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
 10465  
 10466  	                // Encrypt
 10467  	                M[offset + i] ^= S[i];
 10468  	            }
 10469  	        },
 10470  
 10471  	        blockSize: 128/32,
 10472  
 10473  	        ivSize: 64/32
 10474  	    });
 10475  
 10476  	    function nextState() {
 10477  	        // Shortcuts
 10478  	        var X = this._X;
 10479  	        var C = this._C;
 10480  
 10481  	        // Save old counter values
 10482  	        for (var i = 0; i < 8; i++) {
 10483  	            C_[i] = C[i];
 10484  	        }
 10485  
 10486  	        // Calculate new counter values
 10487  	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
 10488  	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
 10489  	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
 10490  	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
 10491  	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
 10492  	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
 10493  	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
 10494  	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
 10495  	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
 10496  
 10497  	        // Calculate the g-values
 10498  	        for (var i = 0; i < 8; i++) {
 10499  	            var gx = X[i] + C[i];
 10500  
 10501  	            // Construct high and low argument for squaring
 10502  	            var ga = gx & 0xffff;
 10503  	            var gb = gx >>> 16;
 10504  
 10505  	            // Calculate high and low result of squaring
 10506  	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
 10507  	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
 10508  
 10509  	            // High XOR low
 10510  	            G[i] = gh ^ gl;
 10511  	        }
 10512  
 10513  	        // Calculate new state values
 10514  	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
 10515  	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
 10516  	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
 10517  	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
 10518  	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
 10519  	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
 10520  	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
 10521  	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
 10522  	    }
 10523  
 10524  	    /**
 10525  	     * Shortcut functions to the cipher's object interface.
 10526  	     *
 10527  	     * @example
 10528  	     *
 10529  	     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
 10530  	     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
 10531  	     */
 10532  	    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
 10533  	}());
 10534  
 10535  
 10536  	return CryptoJS.RabbitLegacy;
 10537  
 10538  }));
 10539  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],74:[function(require,module,exports){
 10540  ;(function (root, factory, undef) {
 10541  	if (typeof exports === "object") {
 10542  		// CommonJS
 10543  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10544  	}
 10545  	else if (typeof define === "function" && define.amd) {
 10546  		// AMD
 10547  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10548  	}
 10549  	else {
 10550  		// Global (browser)
 10551  		factory(root.CryptoJS);
 10552  	}
 10553  }(this, function (CryptoJS) {
 10554  
 10555  	(function () {
 10556  	    // Shortcuts
 10557  	    var C = CryptoJS;
 10558  	    var C_lib = C.lib;
 10559  	    var StreamCipher = C_lib.StreamCipher;
 10560  	    var C_algo = C.algo;
 10561  
 10562  	    // Reusable objects
 10563  	    var S  = [];
 10564  	    var C_ = [];
 10565  	    var G  = [];
 10566  
 10567  	    /**
 10568  	     * Rabbit stream cipher algorithm
 10569  	     */
 10570  	    var Rabbit = C_algo.Rabbit = StreamCipher.extend({
 10571  	        _doReset: function () {
 10572  	            // Shortcuts
 10573  	            var K = this._key.words;
 10574  	            var iv = this.cfg.iv;
 10575  
 10576  	            // Swap endian
 10577  	            for (var i = 0; i < 4; i++) {
 10578  	                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |
 10579  	                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);
 10580  	            }
 10581  
 10582  	            // Generate initial state values
 10583  	            var X = this._X = [
 10584  	                K[0], (K[3] << 16) | (K[2] >>> 16),
 10585  	                K[1], (K[0] << 16) | (K[3] >>> 16),
 10586  	                K[2], (K[1] << 16) | (K[0] >>> 16),
 10587  	                K[3], (K[2] << 16) | (K[1] >>> 16)
 10588  	            ];
 10589  
 10590  	            // Generate initial counter values
 10591  	            var C = this._C = [
 10592  	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
 10593  	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
 10594  	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
 10595  	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
 10596  	            ];
 10597  
 10598  	            // Carry bit
 10599  	            this._b = 0;
 10600  
 10601  	            // Iterate the system four times
 10602  	            for (var i = 0; i < 4; i++) {
 10603  	                nextState.call(this);
 10604  	            }
 10605  
 10606  	            // Modify the counters
 10607  	            for (var i = 0; i < 8; i++) {
 10608  	                C[i] ^= X[(i + 4) & 7];
 10609  	            }
 10610  
 10611  	            // IV setup
 10612  	            if (iv) {
 10613  	                // Shortcuts
 10614  	                var IV = iv.words;
 10615  	                var IV_0 = IV[0];
 10616  	                var IV_1 = IV[1];
 10617  
 10618  	                // Generate four subvectors
 10619  	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
 10620  	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
 10621  	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
 10622  	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
 10623  
 10624  	                // Modify counter values
 10625  	                C[0] ^= i0;
 10626  	                C[1] ^= i1;
 10627  	                C[2] ^= i2;
 10628  	                C[3] ^= i3;
 10629  	                C[4] ^= i0;
 10630  	                C[5] ^= i1;
 10631  	                C[6] ^= i2;
 10632  	                C[7] ^= i3;
 10633  
 10634  	                // Iterate the system four times
 10635  	                for (var i = 0; i < 4; i++) {
 10636  	                    nextState.call(this);
 10637  	                }
 10638  	            }
 10639  	        },
 10640  
 10641  	        _doProcessBlock: function (M, offset) {
 10642  	            // Shortcut
 10643  	            var X = this._X;
 10644  
 10645  	            // Iterate the system
 10646  	            nextState.call(this);
 10647  
 10648  	            // Generate four keystream words
 10649  	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
 10650  	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
 10651  	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
 10652  	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
 10653  
 10654  	            for (var i = 0; i < 4; i++) {
 10655  	                // Swap endian
 10656  	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
 10657  	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
 10658  
 10659  	                // Encrypt
 10660  	                M[offset + i] ^= S[i];
 10661  	            }
 10662  	        },
 10663  
 10664  	        blockSize: 128/32,
 10665  
 10666  	        ivSize: 64/32
 10667  	    });
 10668  
 10669  	    function nextState() {
 10670  	        // Shortcuts
 10671  	        var X = this._X;
 10672  	        var C = this._C;
 10673  
 10674  	        // Save old counter values
 10675  	        for (var i = 0; i < 8; i++) {
 10676  	            C_[i] = C[i];
 10677  	        }
 10678  
 10679  	        // Calculate new counter values
 10680  	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
 10681  	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
 10682  	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
 10683  	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
 10684  	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
 10685  	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
 10686  	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
 10687  	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
 10688  	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
 10689  
 10690  	        // Calculate the g-values
 10691  	        for (var i = 0; i < 8; i++) {
 10692  	            var gx = X[i] + C[i];
 10693  
 10694  	            // Construct high and low argument for squaring
 10695  	            var ga = gx & 0xffff;
 10696  	            var gb = gx >>> 16;
 10697  
 10698  	            // Calculate high and low result of squaring
 10699  	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
 10700  	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
 10701  
 10702  	            // High XOR low
 10703  	            G[i] = gh ^ gl;
 10704  	        }
 10705  
 10706  	        // Calculate new state values
 10707  	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
 10708  	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
 10709  	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
 10710  	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
 10711  	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
 10712  	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
 10713  	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
 10714  	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
 10715  	    }
 10716  
 10717  	    /**
 10718  	     * Shortcut functions to the cipher's object interface.
 10719  	     *
 10720  	     * @example
 10721  	     *
 10722  	     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
 10723  	     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
 10724  	     */
 10725  	    C.Rabbit = StreamCipher._createHelper(Rabbit);
 10726  	}());
 10727  
 10728  
 10729  	return CryptoJS.Rabbit;
 10730  
 10731  }));
 10732  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],75:[function(require,module,exports){
 10733  ;(function (root, factory, undef) {
 10734  	if (typeof exports === "object") {
 10735  		// CommonJS
 10736  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10737  	}
 10738  	else if (typeof define === "function" && define.amd) {
 10739  		// AMD
 10740  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10741  	}
 10742  	else {
 10743  		// Global (browser)
 10744  		factory(root.CryptoJS);
 10745  	}
 10746  }(this, function (CryptoJS) {
 10747  
 10748  	(function () {
 10749  	    // Shortcuts
 10750  	    var C = CryptoJS;
 10751  	    var C_lib = C.lib;
 10752  	    var StreamCipher = C_lib.StreamCipher;
 10753  	    var C_algo = C.algo;
 10754  
 10755  	    /**
 10756  	     * RC4 stream cipher algorithm.
 10757  	     */
 10758  	    var RC4 = C_algo.RC4 = StreamCipher.extend({
 10759  	        _doReset: function () {
 10760  	            // Shortcuts
 10761  	            var key = this._key;
 10762  	            var keyWords = key.words;
 10763  	            var keySigBytes = key.sigBytes;
 10764  
 10765  	            // Init sbox
 10766  	            var S = this._S = [];
 10767  	            for (var i = 0; i < 256; i++) {
 10768  	                S[i] = i;
 10769  	            }
 10770  
 10771  	            // Key setup
 10772  	            for (var i = 0, j = 0; i < 256; i++) {
 10773  	                var keyByteIndex = i % keySigBytes;
 10774  	                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
 10775  
 10776  	                j = (j + S[i] + keyByte) % 256;
 10777  
 10778  	                // Swap
 10779  	                var t = S[i];
 10780  	                S[i] = S[j];
 10781  	                S[j] = t;
 10782  	            }
 10783  
 10784  	            // Counters
 10785  	            this._i = this._j = 0;
 10786  	        },
 10787  
 10788  	        _doProcessBlock: function (M, offset) {
 10789  	            M[offset] ^= generateKeystreamWord.call(this);
 10790  	        },
 10791  
 10792  	        keySize: 256/32,
 10793  
 10794  	        ivSize: 0
 10795  	    });
 10796  
 10797  	    function generateKeystreamWord() {
 10798  	        // Shortcuts
 10799  	        var S = this._S;
 10800  	        var i = this._i;
 10801  	        var j = this._j;
 10802  
 10803  	        // Generate keystream word
 10804  	        var keystreamWord = 0;
 10805  	        for (var n = 0; n < 4; n++) {
 10806  	            i = (i + 1) % 256;
 10807  	            j = (j + S[i]) % 256;
 10808  
 10809  	            // Swap
 10810  	            var t = S[i];
 10811  	            S[i] = S[j];
 10812  	            S[j] = t;
 10813  
 10814  	            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
 10815  	        }
 10816  
 10817  	        // Update counters
 10818  	        this._i = i;
 10819  	        this._j = j;
 10820  
 10821  	        return keystreamWord;
 10822  	    }
 10823  
 10824  	    /**
 10825  	     * Shortcut functions to the cipher's object interface.
 10826  	     *
 10827  	     * @example
 10828  	     *
 10829  	     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
 10830  	     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
 10831  	     */
 10832  	    C.RC4 = StreamCipher._createHelper(RC4);
 10833  
 10834  	    /**
 10835  	     * Modified RC4 stream cipher algorithm.
 10836  	     */
 10837  	    var RC4Drop = C_algo.RC4Drop = RC4.extend({
 10838  	        /**
 10839  	         * Configuration options.
 10840  	         *
 10841  	         * @property {number} drop The number of keystream words to drop. Default 192
 10842  	         */
 10843  	        cfg: RC4.cfg.extend({
 10844  	            drop: 192
 10845  	        }),
 10846  
 10847  	        _doReset: function () {
 10848  	            RC4._doReset.call(this);
 10849  
 10850  	            // Drop
 10851  	            for (var i = this.cfg.drop; i > 0; i--) {
 10852  	                generateKeystreamWord.call(this);
 10853  	            }
 10854  	        }
 10855  	    });
 10856  
 10857  	    /**
 10858  	     * Shortcut functions to the cipher's object interface.
 10859  	     *
 10860  	     * @example
 10861  	     *
 10862  	     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
 10863  	     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
 10864  	     */
 10865  	    C.RC4Drop = StreamCipher._createHelper(RC4Drop);
 10866  	}());
 10867  
 10868  
 10869  	return CryptoJS.RC4;
 10870  
 10871  }));
 10872  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],76:[function(require,module,exports){
 10873  ;(function (root, factory) {
 10874  	if (typeof exports === "object") {
 10875  		// CommonJS
 10876  		module.exports = exports = factory(require("./core"));
 10877  	}
 10878  	else if (typeof define === "function" && define.amd) {
 10879  		// AMD
 10880  		define(["./core"], factory);
 10881  	}
 10882  	else {
 10883  		// Global (browser)
 10884  		factory(root.CryptoJS);
 10885  	}
 10886  }(this, function (CryptoJS) {
 10887  
 10888  	/** @preserve
 10889  	(c) 2012 by CĂ©dric Mesnil. All rights reserved.
 10890  
 10891  	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 10892  
 10893  	    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 10894  	    - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
 10895  
 10896  	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 10897  	*/
 10898  
 10899  	(function (Math) {
 10900  	    // Shortcuts
 10901  	    var C = CryptoJS;
 10902  	    var C_lib = C.lib;
 10903  	    var WordArray = C_lib.WordArray;
 10904  	    var Hasher = C_lib.Hasher;
 10905  	    var C_algo = C.algo;
 10906  
 10907  	    // Constants table
 10908  	    var _zl = WordArray.create([
 10909  	        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
 10910  	        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,
 10911  	        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,
 10912  	        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,
 10913  	        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);
 10914  	    var _zr = WordArray.create([
 10915  	        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,
 10916  	        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,
 10917  	        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,
 10918  	        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,
 10919  	        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);
 10920  	    var _sl = WordArray.create([
 10921  	         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,
 10922  	        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,
 10923  	        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,
 10924  	          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,
 10925  	        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);
 10926  	    var _sr = WordArray.create([
 10927  	        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,
 10928  	        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,
 10929  	        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,
 10930  	        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,
 10931  	        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);
 10932  
 10933  	    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
 10934  	    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
 10935  
 10936  	    /**
 10937  	     * RIPEMD160 hash algorithm.
 10938  	     */
 10939  	    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
 10940  	        _doReset: function () {
 10941  	            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
 10942  	        },
 10943  
 10944  	        _doProcessBlock: function (M, offset) {
 10945  
 10946  	            // Swap endian
 10947  	            for (var i = 0; i < 16; i++) {
 10948  	                // Shortcuts
 10949  	                var offset_i = offset + i;
 10950  	                var M_offset_i = M[offset_i];
 10951  
 10952  	                // Swap
 10953  	                M[offset_i] = (
 10954  	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
 10955  	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
 10956  	                );
 10957  	            }
 10958  	            // Shortcut
 10959  	            var H  = this._hash.words;
 10960  	            var hl = _hl.words;
 10961  	            var hr = _hr.words;
 10962  	            var zl = _zl.words;
 10963  	            var zr = _zr.words;
 10964  	            var sl = _sl.words;
 10965  	            var sr = _sr.words;
 10966  
 10967  	            // Working variables
 10968  	            var al, bl, cl, dl, el;
 10969  	            var ar, br, cr, dr, er;
 10970  
 10971  	            ar = al = H[0];
 10972  	            br = bl = H[1];
 10973  	            cr = cl = H[2];
 10974  	            dr = dl = H[3];
 10975  	            er = el = H[4];
 10976  	            // Computation
 10977  	            var t;
 10978  	            for (var i = 0; i < 80; i += 1) {
 10979  	                t = (al +  M[offset+zl[i]])|0;
 10980  	                if (i<16){
 10981  		            t +=  f1(bl,cl,dl) + hl[0];
 10982  	                } else if (i<32) {
 10983  		            t +=  f2(bl,cl,dl) + hl[1];
 10984  	                } else if (i<48) {
 10985  		            t +=  f3(bl,cl,dl) + hl[2];
 10986  	                } else if (i<64) {
 10987  		            t +=  f4(bl,cl,dl) + hl[3];
 10988  	                } else {// if (i<80) {
 10989  		            t +=  f5(bl,cl,dl) + hl[4];
 10990  	                }
 10991  	                t = t|0;
 10992  	                t =  rotl(t,sl[i]);
 10993  	                t = (t+el)|0;
 10994  	                al = el;
 10995  	                el = dl;
 10996  	                dl = rotl(cl, 10);
 10997  	                cl = bl;
 10998  	                bl = t;
 10999  
 11000  	                t = (ar + M[offset+zr[i]])|0;
 11001  	                if (i<16){
 11002  		            t +=  f5(br,cr,dr) + hr[0];
 11003  	                } else if (i<32) {
 11004  		            t +=  f4(br,cr,dr) + hr[1];
 11005  	                } else if (i<48) {
 11006  		            t +=  f3(br,cr,dr) + hr[2];
 11007  	                } else if (i<64) {
 11008  		            t +=  f2(br,cr,dr) + hr[3];
 11009  	                } else {// if (i<80) {
 11010  		            t +=  f1(br,cr,dr) + hr[4];
 11011  	                }
 11012  	                t = t|0;
 11013  	                t =  rotl(t,sr[i]) ;
 11014  	                t = (t+er)|0;
 11015  	                ar = er;
 11016  	                er = dr;
 11017  	                dr = rotl(cr, 10);
 11018  	                cr = br;
 11019  	                br = t;
 11020  	            }
 11021  	            // Intermediate hash value
 11022  	            t    = (H[1] + cl + dr)|0;
 11023  	            H[1] = (H[2] + dl + er)|0;
 11024  	            H[2] = (H[3] + el + ar)|0;
 11025  	            H[3] = (H[4] + al + br)|0;
 11026  	            H[4] = (H[0] + bl + cr)|0;
 11027  	            H[0] =  t;
 11028  	        },
 11029  
 11030  	        _doFinalize: function () {
 11031  	            // Shortcuts
 11032  	            var data = this._data;
 11033  	            var dataWords = data.words;
 11034  
 11035  	            var nBitsTotal = this._nDataBytes * 8;
 11036  	            var nBitsLeft = data.sigBytes * 8;
 11037  
 11038  	            // Add padding
 11039  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11040  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
 11041  	                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |
 11042  	                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)
 11043  	            );
 11044  	            data.sigBytes = (dataWords.length + 1) * 4;
 11045  
 11046  	            // Hash final blocks
 11047  	            this._process();
 11048  
 11049  	            // Shortcuts
 11050  	            var hash = this._hash;
 11051  	            var H = hash.words;
 11052  
 11053  	            // Swap endian
 11054  	            for (var i = 0; i < 5; i++) {
 11055  	                // Shortcut
 11056  	                var H_i = H[i];
 11057  
 11058  	                // Swap
 11059  	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
 11060  	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
 11061  	            }
 11062  
 11063  	            // Return final computed hash
 11064  	            return hash;
 11065  	        },
 11066  
 11067  	        clone: function () {
 11068  	            var clone = Hasher.clone.call(this);
 11069  	            clone._hash = this._hash.clone();
 11070  
 11071  	            return clone;
 11072  	        }
 11073  	    });
 11074  
 11075  
 11076  	    function f1(x, y, z) {
 11077  	        return ((x) ^ (y) ^ (z));
 11078  
 11079  	    }
 11080  
 11081  	    function f2(x, y, z) {
 11082  	        return (((x)&(y)) | ((~x)&(z)));
 11083  	    }
 11084  
 11085  	    function f3(x, y, z) {
 11086  	        return (((x) | (~(y))) ^ (z));
 11087  	    }
 11088  
 11089  	    function f4(x, y, z) {
 11090  	        return (((x) & (z)) | ((y)&(~(z))));
 11091  	    }
 11092  
 11093  	    function f5(x, y, z) {
 11094  	        return ((x) ^ ((y) |(~(z))));
 11095  
 11096  	    }
 11097  
 11098  	    function rotl(x,n) {
 11099  	        return (x<<n) | (x>>>(32-n));
 11100  	    }
 11101  
 11102  
 11103  	    /**
 11104  	     * Shortcut function to the hasher's object interface.
 11105  	     *
 11106  	     * @param {WordArray|string} message The message to hash.
 11107  	     *
 11108  	     * @return {WordArray} The hash.
 11109  	     *
 11110  	     * @static
 11111  	     *
 11112  	     * @example
 11113  	     *
 11114  	     *     var hash = CryptoJS.RIPEMD160('message');
 11115  	     *     var hash = CryptoJS.RIPEMD160(wordArray);
 11116  	     */
 11117  	    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
 11118  
 11119  	    /**
 11120  	     * Shortcut function to the HMAC's object interface.
 11121  	     *
 11122  	     * @param {WordArray|string} message The message to hash.
 11123  	     * @param {WordArray|string} key The secret key.
 11124  	     *
 11125  	     * @return {WordArray} The HMAC.
 11126  	     *
 11127  	     * @static
 11128  	     *
 11129  	     * @example
 11130  	     *
 11131  	     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);
 11132  	     */
 11133  	    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
 11134  	}(Math));
 11135  
 11136  
 11137  	return CryptoJS.RIPEMD160;
 11138  
 11139  }));
 11140  },{"./core":53}],77:[function(require,module,exports){
 11141  ;(function (root, factory) {
 11142  	if (typeof exports === "object") {
 11143  		// CommonJS
 11144  		module.exports = exports = factory(require("./core"));
 11145  	}
 11146  	else if (typeof define === "function" && define.amd) {
 11147  		// AMD
 11148  		define(["./core"], factory);
 11149  	}
 11150  	else {
 11151  		// Global (browser)
 11152  		factory(root.CryptoJS);
 11153  	}
 11154  }(this, function (CryptoJS) {
 11155  
 11156  	(function () {
 11157  	    // Shortcuts
 11158  	    var C = CryptoJS;
 11159  	    var C_lib = C.lib;
 11160  	    var WordArray = C_lib.WordArray;
 11161  	    var Hasher = C_lib.Hasher;
 11162  	    var C_algo = C.algo;
 11163  
 11164  	    // Reusable object
 11165  	    var W = [];
 11166  
 11167  	    /**
 11168  	     * SHA-1 hash algorithm.
 11169  	     */
 11170  	    var SHA1 = C_algo.SHA1 = Hasher.extend({
 11171  	        _doReset: function () {
 11172  	            this._hash = new WordArray.init([
 11173  	                0x67452301, 0xefcdab89,
 11174  	                0x98badcfe, 0x10325476,
 11175  	                0xc3d2e1f0
 11176  	            ]);
 11177  	        },
 11178  
 11179  	        _doProcessBlock: function (M, offset) {
 11180  	            // Shortcut
 11181  	            var H = this._hash.words;
 11182  
 11183  	            // Working variables
 11184  	            var a = H[0];
 11185  	            var b = H[1];
 11186  	            var c = H[2];
 11187  	            var d = H[3];
 11188  	            var e = H[4];
 11189  
 11190  	            // Computation
 11191  	            for (var i = 0; i < 80; i++) {
 11192  	                if (i < 16) {
 11193  	                    W[i] = M[offset + i] | 0;
 11194  	                } else {
 11195  	                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
 11196  	                    W[i] = (n << 1) | (n >>> 31);
 11197  	                }
 11198  
 11199  	                var t = ((a << 5) | (a >>> 27)) + e + W[i];
 11200  	                if (i < 20) {
 11201  	                    t += ((b & c) | (~b & d)) + 0x5a827999;
 11202  	                } else if (i < 40) {
 11203  	                    t += (b ^ c ^ d) + 0x6ed9eba1;
 11204  	                } else if (i < 60) {
 11205  	                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
 11206  	                } else /* if (i < 80) */ {
 11207  	                    t += (b ^ c ^ d) - 0x359d3e2a;
 11208  	                }
 11209  
 11210  	                e = d;
 11211  	                d = c;
 11212  	                c = (b << 30) | (b >>> 2);
 11213  	                b = a;
 11214  	                a = t;
 11215  	            }
 11216  
 11217  	            // Intermediate hash value
 11218  	            H[0] = (H[0] + a) | 0;
 11219  	            H[1] = (H[1] + b) | 0;
 11220  	            H[2] = (H[2] + c) | 0;
 11221  	            H[3] = (H[3] + d) | 0;
 11222  	            H[4] = (H[4] + e) | 0;
 11223  	        },
 11224  
 11225  	        _doFinalize: function () {
 11226  	            // Shortcuts
 11227  	            var data = this._data;
 11228  	            var dataWords = data.words;
 11229  
 11230  	            var nBitsTotal = this._nDataBytes * 8;
 11231  	            var nBitsLeft = data.sigBytes * 8;
 11232  
 11233  	            // Add padding
 11234  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11235  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
 11236  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
 11237  	            data.sigBytes = dataWords.length * 4;
 11238  
 11239  	            // Hash final blocks
 11240  	            this._process();
 11241  
 11242  	            // Return final computed hash
 11243  	            return this._hash;
 11244  	        },
 11245  
 11246  	        clone: function () {
 11247  	            var clone = Hasher.clone.call(this);
 11248  	            clone._hash = this._hash.clone();
 11249  
 11250  	            return clone;
 11251  	        }
 11252  	    });
 11253  
 11254  	    /**
 11255  	     * Shortcut function to the hasher's object interface.
 11256  	     *
 11257  	     * @param {WordArray|string} message The message to hash.
 11258  	     *
 11259  	     * @return {WordArray} The hash.
 11260  	     *
 11261  	     * @static
 11262  	     *
 11263  	     * @example
 11264  	     *
 11265  	     *     var hash = CryptoJS.SHA1('message');
 11266  	     *     var hash = CryptoJS.SHA1(wordArray);
 11267  	     */
 11268  	    C.SHA1 = Hasher._createHelper(SHA1);
 11269  
 11270  	    /**
 11271  	     * Shortcut function to the HMAC's object interface.
 11272  	     *
 11273  	     * @param {WordArray|string} message The message to hash.
 11274  	     * @param {WordArray|string} key The secret key.
 11275  	     *
 11276  	     * @return {WordArray} The HMAC.
 11277  	     *
 11278  	     * @static
 11279  	     *
 11280  	     * @example
 11281  	     *
 11282  	     *     var hmac = CryptoJS.HmacSHA1(message, key);
 11283  	     */
 11284  	    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
 11285  	}());
 11286  
 11287  
 11288  	return CryptoJS.SHA1;
 11289  
 11290  }));
 11291  },{"./core":53}],78:[function(require,module,exports){
 11292  ;(function (root, factory, undef) {
 11293  	if (typeof exports === "object") {
 11294  		// CommonJS
 11295  		module.exports = exports = factory(require("./core"), require("./sha256"));
 11296  	}
 11297  	else if (typeof define === "function" && define.amd) {
 11298  		// AMD
 11299  		define(["./core", "./sha256"], factory);
 11300  	}
 11301  	else {
 11302  		// Global (browser)
 11303  		factory(root.CryptoJS);
 11304  	}
 11305  }(this, function (CryptoJS) {
 11306  
 11307  	(function () {
 11308  	    // Shortcuts
 11309  	    var C = CryptoJS;
 11310  	    var C_lib = C.lib;
 11311  	    var WordArray = C_lib.WordArray;
 11312  	    var C_algo = C.algo;
 11313  	    var SHA256 = C_algo.SHA256;
 11314  
 11315  	    /**
 11316  	     * SHA-224 hash algorithm.
 11317  	     */
 11318  	    var SHA224 = C_algo.SHA224 = SHA256.extend({
 11319  	        _doReset: function () {
 11320  	            this._hash = new WordArray.init([
 11321  	                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
 11322  	                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
 11323  	            ]);
 11324  	        },
 11325  
 11326  	        _doFinalize: function () {
 11327  	            var hash = SHA256._doFinalize.call(this);
 11328  
 11329  	            hash.sigBytes -= 4;
 11330  
 11331  	            return hash;
 11332  	        }
 11333  	    });
 11334  
 11335  	    /**
 11336  	     * Shortcut function to the hasher's object interface.
 11337  	     *
 11338  	     * @param {WordArray|string} message The message to hash.
 11339  	     *
 11340  	     * @return {WordArray} The hash.
 11341  	     *
 11342  	     * @static
 11343  	     *
 11344  	     * @example
 11345  	     *
 11346  	     *     var hash = CryptoJS.SHA224('message');
 11347  	     *     var hash = CryptoJS.SHA224(wordArray);
 11348  	     */
 11349  	    C.SHA224 = SHA256._createHelper(SHA224);
 11350  
 11351  	    /**
 11352  	     * Shortcut function to the HMAC's object interface.
 11353  	     *
 11354  	     * @param {WordArray|string} message The message to hash.
 11355  	     * @param {WordArray|string} key The secret key.
 11356  	     *
 11357  	     * @return {WordArray} The HMAC.
 11358  	     *
 11359  	     * @static
 11360  	     *
 11361  	     * @example
 11362  	     *
 11363  	     *     var hmac = CryptoJS.HmacSHA224(message, key);
 11364  	     */
 11365  	    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
 11366  	}());
 11367  
 11368  
 11369  	return CryptoJS.SHA224;
 11370  
 11371  }));
 11372  },{"./core":53,"./sha256":79}],79:[function(require,module,exports){
 11373  ;(function (root, factory) {
 11374  	if (typeof exports === "object") {
 11375  		// CommonJS
 11376  		module.exports = exports = factory(require("./core"));
 11377  	}
 11378  	else if (typeof define === "function" && define.amd) {
 11379  		// AMD
 11380  		define(["./core"], factory);
 11381  	}
 11382  	else {
 11383  		// Global (browser)
 11384  		factory(root.CryptoJS);
 11385  	}
 11386  }(this, function (CryptoJS) {
 11387  
 11388  	(function (Math) {
 11389  	    // Shortcuts
 11390  	    var C = CryptoJS;
 11391  	    var C_lib = C.lib;
 11392  	    var WordArray = C_lib.WordArray;
 11393  	    var Hasher = C_lib.Hasher;
 11394  	    var C_algo = C.algo;
 11395  
 11396  	    // Initialization and round constants tables
 11397  	    var H = [];
 11398  	    var K = [];
 11399  
 11400  	    // Compute constants
 11401  	    (function () {
 11402  	        function isPrime(n) {
 11403  	            var sqrtN = Math.sqrt(n);
 11404  	            for (var factor = 2; factor <= sqrtN; factor++) {
 11405  	                if (!(n % factor)) {
 11406  	                    return false;
 11407  	                }
 11408  	            }
 11409  
 11410  	            return true;
 11411  	        }
 11412  
 11413  	        function getFractionalBits(n) {
 11414  	            return ((n - (n | 0)) * 0x100000000) | 0;
 11415  	        }
 11416  
 11417  	        var n = 2;
 11418  	        var nPrime = 0;
 11419  	        while (nPrime < 64) {
 11420  	            if (isPrime(n)) {
 11421  	                if (nPrime < 8) {
 11422  	                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
 11423  	                }
 11424  	                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
 11425  
 11426  	                nPrime++;
 11427  	            }
 11428  
 11429  	            n++;
 11430  	        }
 11431  	    }());
 11432  
 11433  	    // Reusable object
 11434  	    var W = [];
 11435  
 11436  	    /**
 11437  	     * SHA-256 hash algorithm.
 11438  	     */
 11439  	    var SHA256 = C_algo.SHA256 = Hasher.extend({
 11440  	        _doReset: function () {
 11441  	            this._hash = new WordArray.init(H.slice(0));
 11442  	        },
 11443  
 11444  	        _doProcessBlock: function (M, offset) {
 11445  	            // Shortcut
 11446  	            var H = this._hash.words;
 11447  
 11448  	            // Working variables
 11449  	            var a = H[0];
 11450  	            var b = H[1];
 11451  	            var c = H[2];
 11452  	            var d = H[3];
 11453  	            var e = H[4];
 11454  	            var f = H[5];
 11455  	            var g = H[6];
 11456  	            var h = H[7];
 11457  
 11458  	            // Computation
 11459  	            for (var i = 0; i < 64; i++) {
 11460  	                if (i < 16) {
 11461  	                    W[i] = M[offset + i] | 0;
 11462  	                } else {
 11463  	                    var gamma0x = W[i - 15];
 11464  	                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^
 11465  	                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^
 11466  	                                   (gamma0x >>> 3);
 11467  
 11468  	                    var gamma1x = W[i - 2];
 11469  	                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^
 11470  	                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^
 11471  	                                   (gamma1x >>> 10);
 11472  
 11473  	                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
 11474  	                }
 11475  
 11476  	                var ch  = (e & f) ^ (~e & g);
 11477  	                var maj = (a & b) ^ (a & c) ^ (b & c);
 11478  
 11479  	                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
 11480  	                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));
 11481  
 11482  	                var t1 = h + sigma1 + ch + K[i] + W[i];
 11483  	                var t2 = sigma0 + maj;
 11484  
 11485  	                h = g;
 11486  	                g = f;
 11487  	                f = e;
 11488  	                e = (d + t1) | 0;
 11489  	                d = c;
 11490  	                c = b;
 11491  	                b = a;
 11492  	                a = (t1 + t2) | 0;
 11493  	            }
 11494  
 11495  	            // Intermediate hash value
 11496  	            H[0] = (H[0] + a) | 0;
 11497  	            H[1] = (H[1] + b) | 0;
 11498  	            H[2] = (H[2] + c) | 0;
 11499  	            H[3] = (H[3] + d) | 0;
 11500  	            H[4] = (H[4] + e) | 0;
 11501  	            H[5] = (H[5] + f) | 0;
 11502  	            H[6] = (H[6] + g) | 0;
 11503  	            H[7] = (H[7] + h) | 0;
 11504  	        },
 11505  
 11506  	        _doFinalize: function () {
 11507  	            // Shortcuts
 11508  	            var data = this._data;
 11509  	            var dataWords = data.words;
 11510  
 11511  	            var nBitsTotal = this._nDataBytes * 8;
 11512  	            var nBitsLeft = data.sigBytes * 8;
 11513  
 11514  	            // Add padding
 11515  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11516  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
 11517  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
 11518  	            data.sigBytes = dataWords.length * 4;
 11519  
 11520  	            // Hash final blocks
 11521  	            this._process();
 11522  
 11523  	            // Return final computed hash
 11524  	            return this._hash;
 11525  	        },
 11526  
 11527  	        clone: function () {
 11528  	            var clone = Hasher.clone.call(this);
 11529  	            clone._hash = this._hash.clone();
 11530  
 11531  	            return clone;
 11532  	        }
 11533  	    });
 11534  
 11535  	    /**
 11536  	     * Shortcut function to the hasher's object interface.
 11537  	     *
 11538  	     * @param {WordArray|string} message The message to hash.
 11539  	     *
 11540  	     * @return {WordArray} The hash.
 11541  	     *
 11542  	     * @static
 11543  	     *
 11544  	     * @example
 11545  	     *
 11546  	     *     var hash = CryptoJS.SHA256('message');
 11547  	     *     var hash = CryptoJS.SHA256(wordArray);
 11548  	     */
 11549  	    C.SHA256 = Hasher._createHelper(SHA256);
 11550  
 11551  	    /**
 11552  	     * Shortcut function to the HMAC's object interface.
 11553  	     *
 11554  	     * @param {WordArray|string} message The message to hash.
 11555  	     * @param {WordArray|string} key The secret key.
 11556  	     *
 11557  	     * @return {WordArray} The HMAC.
 11558  	     *
 11559  	     * @static
 11560  	     *
 11561  	     * @example
 11562  	     *
 11563  	     *     var hmac = CryptoJS.HmacSHA256(message, key);
 11564  	     */
 11565  	    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
 11566  	}(Math));
 11567  
 11568  
 11569  	return CryptoJS.SHA256;
 11570  
 11571  }));
 11572  },{"./core":53}],80:[function(require,module,exports){
 11573  ;(function (root, factory, undef) {
 11574  	if (typeof exports === "object") {
 11575  		// CommonJS
 11576  		module.exports = exports = factory(require("./core"), require("./x64-core"));
 11577  	}
 11578  	else if (typeof define === "function" && define.amd) {
 11579  		// AMD
 11580  		define(["./core", "./x64-core"], factory);
 11581  	}
 11582  	else {
 11583  		// Global (browser)
 11584  		factory(root.CryptoJS);
 11585  	}
 11586  }(this, function (CryptoJS) {
 11587  
 11588  	(function (Math) {
 11589  	    // Shortcuts
 11590  	    var C = CryptoJS;
 11591  	    var C_lib = C.lib;
 11592  	    var WordArray = C_lib.WordArray;
 11593  	    var Hasher = C_lib.Hasher;
 11594  	    var C_x64 = C.x64;
 11595  	    var X64Word = C_x64.Word;
 11596  	    var C_algo = C.algo;
 11597  
 11598  	    // Constants tables
 11599  	    var RHO_OFFSETS = [];
 11600  	    var PI_INDEXES  = [];
 11601  	    var ROUND_CONSTANTS = [];
 11602  
 11603  	    // Compute Constants
 11604  	    (function () {
 11605  	        // Compute rho offset constants
 11606  	        var x = 1, y = 0;
 11607  	        for (var t = 0; t < 24; t++) {
 11608  	            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
 11609  
 11610  	            var newX = y % 5;
 11611  	            var newY = (2 * x + 3 * y) % 5;
 11612  	            x = newX;
 11613  	            y = newY;
 11614  	        }
 11615  
 11616  	        // Compute pi index constants
 11617  	        for (var x = 0; x < 5; x++) {
 11618  	            for (var y = 0; y < 5; y++) {
 11619  	                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
 11620  	            }
 11621  	        }
 11622  
 11623  	        // Compute round constants
 11624  	        var LFSR = 0x01;
 11625  	        for (var i = 0; i < 24; i++) {
 11626  	            var roundConstantMsw = 0;
 11627  	            var roundConstantLsw = 0;
 11628  
 11629  	            for (var j = 0; j < 7; j++) {
 11630  	                if (LFSR & 0x01) {
 11631  	                    var bitPosition = (1 << j) - 1;
 11632  	                    if (bitPosition < 32) {
 11633  	                        roundConstantLsw ^= 1 << bitPosition;
 11634  	                    } else /* if (bitPosition >= 32) */ {
 11635  	                        roundConstantMsw ^= 1 << (bitPosition - 32);
 11636  	                    }
 11637  	                }
 11638  
 11639  	                // Compute next LFSR
 11640  	                if (LFSR & 0x80) {
 11641  	                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
 11642  	                    LFSR = (LFSR << 1) ^ 0x71;
 11643  	                } else {
 11644  	                    LFSR <<= 1;
 11645  	                }
 11646  	            }
 11647  
 11648  	            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
 11649  	        }
 11650  	    }());
 11651  
 11652  	    // Reusable objects for temporary values
 11653  	    var T = [];
 11654  	    (function () {
 11655  	        for (var i = 0; i < 25; i++) {
 11656  	            T[i] = X64Word.create();
 11657  	        }
 11658  	    }());
 11659  
 11660  	    /**
 11661  	     * SHA-3 hash algorithm.
 11662  	     */
 11663  	    var SHA3 = C_algo.SHA3 = Hasher.extend({
 11664  	        /**
 11665  	         * Configuration options.
 11666  	         *
 11667  	         * @property {number} outputLength
 11668  	         *   The desired number of bits in the output hash.
 11669  	         *   Only values permitted are: 224, 256, 384, 512.
 11670  	         *   Default: 512
 11671  	         */
 11672  	        cfg: Hasher.cfg.extend({
 11673  	            outputLength: 512
 11674  	        }),
 11675  
 11676  	        _doReset: function () {
 11677  	            var state = this._state = []
 11678  	            for (var i = 0; i < 25; i++) {
 11679  	                state[i] = new X64Word.init();
 11680  	            }
 11681  
 11682  	            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
 11683  	        },
 11684  
 11685  	        _doProcessBlock: function (M, offset) {
 11686  	            // Shortcuts
 11687  	            var state = this._state;
 11688  	            var nBlockSizeLanes = this.blockSize / 2;
 11689  
 11690  	            // Absorb
 11691  	            for (var i = 0; i < nBlockSizeLanes; i++) {
 11692  	                // Shortcuts
 11693  	                var M2i  = M[offset + 2 * i];
 11694  	                var M2i1 = M[offset + 2 * i + 1];
 11695  
 11696  	                // Swap endian
 11697  	                M2i = (
 11698  	                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |
 11699  	                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)
 11700  	                );
 11701  	                M2i1 = (
 11702  	                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |
 11703  	                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)
 11704  	                );
 11705  
 11706  	                // Absorb message into state
 11707  	                var lane = state[i];
 11708  	                lane.high ^= M2i1;
 11709  	                lane.low  ^= M2i;
 11710  	            }
 11711  
 11712  	            // Rounds
 11713  	            for (var round = 0; round < 24; round++) {
 11714  	                // Theta
 11715  	                for (var x = 0; x < 5; x++) {
 11716  	                    // Mix column lanes
 11717  	                    var tMsw = 0, tLsw = 0;
 11718  	                    for (var y = 0; y < 5; y++) {
 11719  	                        var lane = state[x + 5 * y];
 11720  	                        tMsw ^= lane.high;
 11721  	                        tLsw ^= lane.low;
 11722  	                    }
 11723  
 11724  	                    // Temporary values
 11725  	                    var Tx = T[x];
 11726  	                    Tx.high = tMsw;
 11727  	                    Tx.low  = tLsw;
 11728  	                }
 11729  	                for (var x = 0; x < 5; x++) {
 11730  	                    // Shortcuts
 11731  	                    var Tx4 = T[(x + 4) % 5];
 11732  	                    var Tx1 = T[(x + 1) % 5];
 11733  	                    var Tx1Msw = Tx1.high;
 11734  	                    var Tx1Lsw = Tx1.low;
 11735  
 11736  	                    // Mix surrounding columns
 11737  	                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
 11738  	                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
 11739  	                    for (var y = 0; y < 5; y++) {
 11740  	                        var lane = state[x + 5 * y];
 11741  	                        lane.high ^= tMsw;
 11742  	                        lane.low  ^= tLsw;
 11743  	                    }
 11744  	                }
 11745  
 11746  	                // Rho Pi
 11747  	                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
 11748  	                    // Shortcuts
 11749  	                    var lane = state[laneIndex];
 11750  	                    var laneMsw = lane.high;
 11751  	                    var laneLsw = lane.low;
 11752  	                    var rhoOffset = RHO_OFFSETS[laneIndex];
 11753  
 11754  	                    // Rotate lanes
 11755  	                    if (rhoOffset < 32) {
 11756  	                        var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
 11757  	                        var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
 11758  	                    } else /* if (rhoOffset >= 32) */ {
 11759  	                        var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
 11760  	                        var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
 11761  	                    }
 11762  
 11763  	                    // Transpose lanes
 11764  	                    var TPiLane = T[PI_INDEXES[laneIndex]];
 11765  	                    TPiLane.high = tMsw;
 11766  	                    TPiLane.low  = tLsw;
 11767  	                }
 11768  
 11769  	                // Rho pi at x = y = 0
 11770  	                var T0 = T[0];
 11771  	                var state0 = state[0];
 11772  	                T0.high = state0.high;
 11773  	                T0.low  = state0.low;
 11774  
 11775  	                // Chi
 11776  	                for (var x = 0; x < 5; x++) {
 11777  	                    for (var y = 0; y < 5; y++) {
 11778  	                        // Shortcuts
 11779  	                        var laneIndex = x + 5 * y;
 11780  	                        var lane = state[laneIndex];
 11781  	                        var TLane = T[laneIndex];
 11782  	                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];
 11783  	                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];
 11784  
 11785  	                        // Mix rows
 11786  	                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
 11787  	                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);
 11788  	                    }
 11789  	                }
 11790  
 11791  	                // Iota
 11792  	                var lane = state[0];
 11793  	                var roundConstant = ROUND_CONSTANTS[round];
 11794  	                lane.high ^= roundConstant.high;
 11795  	                lane.low  ^= roundConstant.low;;
 11796  	            }
 11797  	        },
 11798  
 11799  	        _doFinalize: function () {
 11800  	            // Shortcuts
 11801  	            var data = this._data;
 11802  	            var dataWords = data.words;
 11803  	            var nBitsTotal = this._nDataBytes * 8;
 11804  	            var nBitsLeft = data.sigBytes * 8;
 11805  	            var blockSizeBits = this.blockSize * 32;
 11806  
 11807  	            // Add padding
 11808  	            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
 11809  	            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
 11810  	            data.sigBytes = dataWords.length * 4;
 11811  
 11812  	            // Hash final blocks
 11813  	            this._process();
 11814  
 11815  	            // Shortcuts
 11816  	            var state = this._state;
 11817  	            var outputLengthBytes = this.cfg.outputLength / 8;
 11818  	            var outputLengthLanes = outputLengthBytes / 8;
 11819  
 11820  	            // Squeeze
 11821  	            var hashWords = [];
 11822  	            for (var i = 0; i < outputLengthLanes; i++) {
 11823  	                // Shortcuts
 11824  	                var lane = state[i];
 11825  	                var laneMsw = lane.high;
 11826  	                var laneLsw = lane.low;
 11827  
 11828  	                // Swap endian
 11829  	                laneMsw = (
 11830  	                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |
 11831  	                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)
 11832  	                );
 11833  	                laneLsw = (
 11834  	                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |
 11835  	                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)
 11836  	                );
 11837  
 11838  	                // Squeeze state to retrieve hash
 11839  	                hashWords.push(laneLsw);
 11840  	                hashWords.push(laneMsw);
 11841  	            }
 11842  
 11843  	            // Return final computed hash
 11844  	            return new WordArray.init(hashWords, outputLengthBytes);
 11845  	        },
 11846  
 11847  	        clone: function () {
 11848  	            var clone = Hasher.clone.call(this);
 11849  
 11850  	            var state = clone._state = this._state.slice(0);
 11851  	            for (var i = 0; i < 25; i++) {
 11852  	                state[i] = state[i].clone();
 11853  	            }
 11854  
 11855  	            return clone;
 11856  	        }
 11857  	    });
 11858  
 11859  	    /**
 11860  	     * Shortcut function to the hasher's object interface.
 11861  	     *
 11862  	     * @param {WordArray|string} message The message to hash.
 11863  	     *
 11864  	     * @return {WordArray} The hash.
 11865  	     *
 11866  	     * @static
 11867  	     *
 11868  	     * @example
 11869  	     *
 11870  	     *     var hash = CryptoJS.SHA3('message');
 11871  	     *     var hash = CryptoJS.SHA3(wordArray);
 11872  	     */
 11873  	    C.SHA3 = Hasher._createHelper(SHA3);
 11874  
 11875  	    /**
 11876  	     * Shortcut function to the HMAC's object interface.
 11877  	     *
 11878  	     * @param {WordArray|string} message The message to hash.
 11879  	     * @param {WordArray|string} key The secret key.
 11880  	     *
 11881  	     * @return {WordArray} The HMAC.
 11882  	     *
 11883  	     * @static
 11884  	     *
 11885  	     * @example
 11886  	     *
 11887  	     *     var hmac = CryptoJS.HmacSHA3(message, key);
 11888  	     */
 11889  	    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
 11890  	}(Math));
 11891  
 11892  
 11893  	return CryptoJS.SHA3;
 11894  
 11895  }));
 11896  },{"./core":53,"./x64-core":84}],81:[function(require,module,exports){
 11897  ;(function (root, factory, undef) {
 11898  	if (typeof exports === "object") {
 11899  		// CommonJS
 11900  		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"));
 11901  	}
 11902  	else if (typeof define === "function" && define.amd) {
 11903  		// AMD
 11904  		define(["./core", "./x64-core", "./sha512"], factory);
 11905  	}
 11906  	else {
 11907  		// Global (browser)
 11908  		factory(root.CryptoJS);
 11909  	}
 11910  }(this, function (CryptoJS) {
 11911  
 11912  	(function () {
 11913  	    // Shortcuts
 11914  	    var C = CryptoJS;
 11915  	    var C_x64 = C.x64;
 11916  	    var X64Word = C_x64.Word;
 11917  	    var X64WordArray = C_x64.WordArray;
 11918  	    var C_algo = C.algo;
 11919  	    var SHA512 = C_algo.SHA512;
 11920  
 11921  	    /**
 11922  	     * SHA-384 hash algorithm.
 11923  	     */
 11924  	    var SHA384 = C_algo.SHA384 = SHA512.extend({
 11925  	        _doReset: function () {
 11926  	            this._hash = new X64WordArray.init([
 11927  	                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
 11928  	                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
 11929  	                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
 11930  	                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
 11931  	            ]);
 11932  	        },
 11933  
 11934  	        _doFinalize: function () {
 11935  	            var hash = SHA512._doFinalize.call(this);
 11936  
 11937  	            hash.sigBytes -= 16;
 11938  
 11939  	            return hash;
 11940  	        }
 11941  	    });
 11942  
 11943  	    /**
 11944  	     * Shortcut function to the hasher's object interface.
 11945  	     *
 11946  	     * @param {WordArray|string} message The message to hash.
 11947  	     *
 11948  	     * @return {WordArray} The hash.
 11949  	     *
 11950  	     * @static
 11951  	     *
 11952  	     * @example
 11953  	     *
 11954  	     *     var hash = CryptoJS.SHA384('message');
 11955  	     *     var hash = CryptoJS.SHA384(wordArray);
 11956  	     */
 11957  	    C.SHA384 = SHA512._createHelper(SHA384);
 11958  
 11959  	    /**
 11960  	     * Shortcut function to the HMAC's object interface.
 11961  	     *
 11962  	     * @param {WordArray|string} message The message to hash.
 11963  	     * @param {WordArray|string} key The secret key.
 11964  	     *
 11965  	     * @return {WordArray} The HMAC.
 11966  	     *
 11967  	     * @static
 11968  	     *
 11969  	     * @example
 11970  	     *
 11971  	     *     var hmac = CryptoJS.HmacSHA384(message, key);
 11972  	     */
 11973  	    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
 11974  	}());
 11975  
 11976  
 11977  	return CryptoJS.SHA384;
 11978  
 11979  }));
 11980  },{"./core":53,"./sha512":82,"./x64-core":84}],82:[function(require,module,exports){
 11981  ;(function (root, factory, undef) {
 11982  	if (typeof exports === "object") {
 11983  		// CommonJS
 11984  		module.exports = exports = factory(require("./core"), require("./x64-core"));
 11985  	}
 11986  	else if (typeof define === "function" && define.amd) {
 11987  		// AMD
 11988  		define(["./core", "./x64-core"], factory);
 11989  	}
 11990  	else {
 11991  		// Global (browser)
 11992  		factory(root.CryptoJS);
 11993  	}
 11994  }(this, function (CryptoJS) {
 11995  
 11996  	(function () {
 11997  	    // Shortcuts
 11998  	    var C = CryptoJS;
 11999  	    var C_lib = C.lib;
 12000  	    var Hasher = C_lib.Hasher;
 12001  	    var C_x64 = C.x64;
 12002  	    var X64Word = C_x64.Word;
 12003  	    var X64WordArray = C_x64.WordArray;
 12004  	    var C_algo = C.algo;
 12005  
 12006  	    function X64Word_create() {
 12007  	        return X64Word.create.apply(X64Word, arguments);
 12008  	    }
 12009  
 12010  	    // Constants
 12011  	    var K = [
 12012  	        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
 12013  	        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
 12014  	        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
 12015  	        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
 12016  	        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
 12017  	        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
 12018  	        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
 12019  	        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
 12020  	        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
 12021  	        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
 12022  	        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
 12023  	        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
 12024  	        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
 12025  	        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
 12026  	        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
 12027  	        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
 12028  	        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
 12029  	        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
 12030  	        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
 12031  	        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
 12032  	        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
 12033  	        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
 12034  	        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
 12035  	        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
 12036  	        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
 12037  	        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
 12038  	        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
 12039  	        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
 12040  	        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
 12041  	        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
 12042  	        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
 12043  	        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
 12044  	        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
 12045  	        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
 12046  	        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
 12047  	        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
 12048  	        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
 12049  	        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
 12050  	        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
 12051  	        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
 12052  	    ];
 12053  
 12054  	    // Reusable objects
 12055  	    var W = [];
 12056  	    (function () {
 12057  	        for (var i = 0; i < 80; i++) {
 12058  	            W[i] = X64Word_create();
 12059  	        }
 12060  	    }());
 12061  
 12062  	    /**
 12063  	     * SHA-512 hash algorithm.
 12064  	     */
 12065  	    var SHA512 = C_algo.SHA512 = Hasher.extend({
 12066  	        _doReset: function () {
 12067  	            this._hash = new X64WordArray.init([
 12068  	                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
 12069  	                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
 12070  	                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
 12071  	                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
 12072  	            ]);
 12073  	        },
 12074  
 12075  	        _doProcessBlock: function (M, offset) {
 12076  	            // Shortcuts
 12077  	            var H = this._hash.words;
 12078  
 12079  	            var H0 = H[0];
 12080  	            var H1 = H[1];
 12081  	            var H2 = H[2];
 12082  	            var H3 = H[3];
 12083  	            var H4 = H[4];
 12084  	            var H5 = H[5];
 12085  	            var H6 = H[6];
 12086  	            var H7 = H[7];
 12087  
 12088  	            var H0h = H0.high;
 12089  	            var H0l = H0.low;
 12090  	            var H1h = H1.high;
 12091  	            var H1l = H1.low;
 12092  	            var H2h = H2.high;
 12093  	            var H2l = H2.low;
 12094  	            var H3h = H3.high;
 12095  	            var H3l = H3.low;
 12096  	            var H4h = H4.high;
 12097  	            var H4l = H4.low;
 12098  	            var H5h = H5.high;
 12099  	            var H5l = H5.low;
 12100  	            var H6h = H6.high;
 12101  	            var H6l = H6.low;
 12102  	            var H7h = H7.high;
 12103  	            var H7l = H7.low;
 12104  
 12105  	            // Working variables
 12106  	            var ah = H0h;
 12107  	            var al = H0l;
 12108  	            var bh = H1h;
 12109  	            var bl = H1l;
 12110  	            var ch = H2h;
 12111  	            var cl = H2l;
 12112  	            var dh = H3h;
 12113  	            var dl = H3l;
 12114  	            var eh = H4h;
 12115  	            var el = H4l;
 12116  	            var fh = H5h;
 12117  	            var fl = H5l;
 12118  	            var gh = H6h;
 12119  	            var gl = H6l;
 12120  	            var hh = H7h;
 12121  	            var hl = H7l;
 12122  
 12123  	            // Rounds
 12124  	            for (var i = 0; i < 80; i++) {
 12125  	                // Shortcut
 12126  	                var Wi = W[i];
 12127  
 12128  	                // Extend message
 12129  	                if (i < 16) {
 12130  	                    var Wih = Wi.high = M[offset + i * 2]     | 0;
 12131  	                    var Wil = Wi.low  = M[offset + i * 2 + 1] | 0;
 12132  	                } else {
 12133  	                    // Gamma0
 12134  	                    var gamma0x  = W[i - 15];
 12135  	                    var gamma0xh = gamma0x.high;
 12136  	                    var gamma0xl = gamma0x.low;
 12137  	                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
 12138  	                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
 12139  
 12140  	                    // Gamma1
 12141  	                    var gamma1x  = W[i - 2];
 12142  	                    var gamma1xh = gamma1x.high;
 12143  	                    var gamma1xl = gamma1x.low;
 12144  	                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
 12145  	                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
 12146  
 12147  	                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
 12148  	                    var Wi7  = W[i - 7];
 12149  	                    var Wi7h = Wi7.high;
 12150  	                    var Wi7l = Wi7.low;
 12151  
 12152  	                    var Wi16  = W[i - 16];
 12153  	                    var Wi16h = Wi16.high;
 12154  	                    var Wi16l = Wi16.low;
 12155  
 12156  	                    var Wil = gamma0l + Wi7l;
 12157  	                    var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
 12158  	                    var Wil = Wil + gamma1l;
 12159  	                    var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
 12160  	                    var Wil = Wil + Wi16l;
 12161  	                    var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
 12162  
 12163  	                    Wi.high = Wih;
 12164  	                    Wi.low  = Wil;
 12165  	                }
 12166  
 12167  	                var chh  = (eh & fh) ^ (~eh & gh);
 12168  	                var chl  = (el & fl) ^ (~el & gl);
 12169  	                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
 12170  	                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
 12171  
 12172  	                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
 12173  	                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
 12174  	                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
 12175  	                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
 12176  
 12177  	                // t1 = h + sigma1 + ch + K[i] + W[i]
 12178  	                var Ki  = K[i];
 12179  	                var Kih = Ki.high;
 12180  	                var Kil = Ki.low;
 12181  
 12182  	                var t1l = hl + sigma1l;
 12183  	                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
 12184  	                var t1l = t1l + chl;
 12185  	                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
 12186  	                var t1l = t1l + Kil;
 12187  	                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
 12188  	                var t1l = t1l + Wil;
 12189  	                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
 12190  
 12191  	                // t2 = sigma0 + maj
 12192  	                var t2l = sigma0l + majl;
 12193  	                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
 12194  
 12195  	                // Update working variables
 12196  	                hh = gh;
 12197  	                hl = gl;
 12198  	                gh = fh;
 12199  	                gl = fl;
 12200  	                fh = eh;
 12201  	                fl = el;
 12202  	                el = (dl + t1l) | 0;
 12203  	                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
 12204  	                dh = ch;
 12205  	                dl = cl;
 12206  	                ch = bh;
 12207  	                cl = bl;
 12208  	                bh = ah;
 12209  	                bl = al;
 12210  	                al = (t1l + t2l) | 0;
 12211  	                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
 12212  	            }
 12213  
 12214  	            // Intermediate hash value
 12215  	            H0l = H0.low  = (H0l + al);
 12216  	            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
 12217  	            H1l = H1.low  = (H1l + bl);
 12218  	            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
 12219  	            H2l = H2.low  = (H2l + cl);
 12220  	            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
 12221  	            H3l = H3.low  = (H3l + dl);
 12222  	            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
 12223  	            H4l = H4.low  = (H4l + el);
 12224  	            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
 12225  	            H5l = H5.low  = (H5l + fl);
 12226  	            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
 12227  	            H6l = H6.low  = (H6l + gl);
 12228  	            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
 12229  	            H7l = H7.low  = (H7l + hl);
 12230  	            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
 12231  	        },
 12232  
 12233  	        _doFinalize: function () {
 12234  	            // Shortcuts
 12235  	            var data = this._data;
 12236  	            var dataWords = data.words;
 12237  
 12238  	            var nBitsTotal = this._nDataBytes * 8;
 12239  	            var nBitsLeft = data.sigBytes * 8;
 12240  
 12241  	            // Add padding
 12242  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 12243  	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
 12244  	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
 12245  	            data.sigBytes = dataWords.length * 4;
 12246  
 12247  	            // Hash final blocks
 12248  	            this._process();
 12249  
 12250  	            // Convert hash to 32-bit word array before returning
 12251  	            var hash = this._hash.toX32();
 12252  
 12253  	            // Return final computed hash
 12254  	            return hash;
 12255  	        },
 12256  
 12257  	        clone: function () {
 12258  	            var clone = Hasher.clone.call(this);
 12259  	            clone._hash = this._hash.clone();
 12260  
 12261  	            return clone;
 12262  	        },
 12263  
 12264  	        blockSize: 1024/32
 12265  	    });
 12266  
 12267  	    /**
 12268  	     * Shortcut function to the hasher's object interface.
 12269  	     *
 12270  	     * @param {WordArray|string} message The message to hash.
 12271  	     *
 12272  	     * @return {WordArray} The hash.
 12273  	     *
 12274  	     * @static
 12275  	     *
 12276  	     * @example
 12277  	     *
 12278  	     *     var hash = CryptoJS.SHA512('message');
 12279  	     *     var hash = CryptoJS.SHA512(wordArray);
 12280  	     */
 12281  	    C.SHA512 = Hasher._createHelper(SHA512);
 12282  
 12283  	    /**
 12284  	     * Shortcut function to the HMAC's object interface.
 12285  	     *
 12286  	     * @param {WordArray|string} message The message to hash.
 12287  	     * @param {WordArray|string} key The secret key.
 12288  	     *
 12289  	     * @return {WordArray} The HMAC.
 12290  	     *
 12291  	     * @static
 12292  	     *
 12293  	     * @example
 12294  	     *
 12295  	     *     var hmac = CryptoJS.HmacSHA512(message, key);
 12296  	     */
 12297  	    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
 12298  	}());
 12299  
 12300  
 12301  	return CryptoJS.SHA512;
 12302  
 12303  }));
 12304  },{"./core":53,"./x64-core":84}],83:[function(require,module,exports){
 12305  ;(function (root, factory, undef) {
 12306  	if (typeof exports === "object") {
 12307  		// CommonJS
 12308  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 12309  	}
 12310  	else if (typeof define === "function" && define.amd) {
 12311  		// AMD
 12312  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 12313  	}
 12314  	else {
 12315  		// Global (browser)
 12316  		factory(root.CryptoJS);
 12317  	}
 12318  }(this, function (CryptoJS) {
 12319  
 12320  	(function () {
 12321  	    // Shortcuts
 12322  	    var C = CryptoJS;
 12323  	    var C_lib = C.lib;
 12324  	    var WordArray = C_lib.WordArray;
 12325  	    var BlockCipher = C_lib.BlockCipher;
 12326  	    var C_algo = C.algo;
 12327  
 12328  	    // Permuted Choice 1 constants
 12329  	    var PC1 = [
 12330  	        57, 49, 41, 33, 25, 17, 9,  1,
 12331  	        58, 50, 42, 34, 26, 18, 10, 2,
 12332  	        59, 51, 43, 35, 27, 19, 11, 3,
 12333  	        60, 52, 44, 36, 63, 55, 47, 39,
 12334  	        31, 23, 15, 7,  62, 54, 46, 38,
 12335  	        30, 22, 14, 6,  61, 53, 45, 37,
 12336  	        29, 21, 13, 5,  28, 20, 12, 4
 12337  	    ];
 12338  
 12339  	    // Permuted Choice 2 constants
 12340  	    var PC2 = [
 12341  	        14, 17, 11, 24, 1,  5,
 12342  	        3,  28, 15, 6,  21, 10,
 12343  	        23, 19, 12, 4,  26, 8,
 12344  	        16, 7,  27, 20, 13, 2,
 12345  	        41, 52, 31, 37, 47, 55,
 12346  	        30, 40, 51, 45, 33, 48,
 12347  	        44, 49, 39, 56, 34, 53,
 12348  	        46, 42, 50, 36, 29, 32
 12349  	    ];
 12350  
 12351  	    // Cumulative bit shift constants
 12352  	    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
 12353  
 12354  	    // SBOXes and round permutation constants
 12355  	    var SBOX_P = [
 12356  	        {
 12357  	            0x0: 0x808200,
 12358  	            0x10000000: 0x8000,
 12359  	            0x20000000: 0x808002,
 12360  	            0x30000000: 0x2,
 12361  	            0x40000000: 0x200,
 12362  	            0x50000000: 0x808202,
 12363  	            0x60000000: 0x800202,
 12364  	            0x70000000: 0x800000,
 12365  	            0x80000000: 0x202,
 12366  	            0x90000000: 0x800200,
 12367  	            0xa0000000: 0x8200,
 12368  	            0xb0000000: 0x808000,
 12369  	            0xc0000000: 0x8002,
 12370  	            0xd0000000: 0x800002,
 12371  	            0xe0000000: 0x0,
 12372  	            0xf0000000: 0x8202,
 12373  	            0x8000000: 0x0,
 12374  	            0x18000000: 0x808202,
 12375  	            0x28000000: 0x8202,
 12376  	            0x38000000: 0x8000,
 12377  	            0x48000000: 0x808200,
 12378  	            0x58000000: 0x200,
 12379  	            0x68000000: 0x808002,
 12380  	            0x78000000: 0x2,
 12381  	            0x88000000: 0x800200,
 12382  	            0x98000000: 0x8200,
 12383  	            0xa8000000: 0x808000,
 12384  	            0xb8000000: 0x800202,
 12385  	            0xc8000000: 0x800002,
 12386  	            0xd8000000: 0x8002,
 12387  	            0xe8000000: 0x202,
 12388  	            0xf8000000: 0x800000,
 12389  	            0x1: 0x8000,
 12390  	            0x10000001: 0x2,
 12391  	            0x20000001: 0x808200,
 12392  	            0x30000001: 0x800000,
 12393  	            0x40000001: 0x808002,
 12394  	            0x50000001: 0x8200,
 12395  	            0x60000001: 0x200,
 12396  	            0x70000001: 0x800202,
 12397  	            0x80000001: 0x808202,
 12398  	            0x90000001: 0x808000,
 12399  	            0xa0000001: 0x800002,
 12400  	            0xb0000001: 0x8202,
 12401  	            0xc0000001: 0x202,
 12402  	            0xd0000001: 0x800200,
 12403  	            0xe0000001: 0x8002,
 12404  	            0xf0000001: 0x0,
 12405  	            0x8000001: 0x808202,
 12406  	            0x18000001: 0x808000,
 12407  	            0x28000001: 0x800000,
 12408  	            0x38000001: 0x200,
 12409  	            0x48000001: 0x8000,
 12410  	            0x58000001: 0x800002,
 12411  	            0x68000001: 0x2,
 12412  	            0x78000001: 0x8202,
 12413  	            0x88000001: 0x8002,
 12414  	            0x98000001: 0x800202,
 12415  	            0xa8000001: 0x202,
 12416  	            0xb8000001: 0x808200,
 12417  	            0xc8000001: 0x800200,
 12418  	            0xd8000001: 0x0,
 12419  	            0xe8000001: 0x8200,
 12420  	            0xf8000001: 0x808002
 12421  	        },
 12422  	        {
 12423  	            0x0: 0x40084010,
 12424  	            0x1000000: 0x4000,
 12425  	            0x2000000: 0x80000,
 12426  	            0x3000000: 0x40080010,
 12427  	            0x4000000: 0x40000010,
 12428  	            0x5000000: 0x40084000,
 12429  	            0x6000000: 0x40004000,
 12430  	            0x7000000: 0x10,
 12431  	            0x8000000: 0x84000,
 12432  	            0x9000000: 0x40004010,
 12433  	            0xa000000: 0x40000000,
 12434  	            0xb000000: 0x84010,
 12435  	            0xc000000: 0x80010,
 12436  	            0xd000000: 0x0,
 12437  	            0xe000000: 0x4010,
 12438  	            0xf000000: 0x40080000,
 12439  	            0x800000: 0x40004000,
 12440  	            0x1800000: 0x84010,
 12441  	            0x2800000: 0x10,
 12442  	            0x3800000: 0x40004010,
 12443  	            0x4800000: 0x40084010,
 12444  	            0x5800000: 0x40000000,
 12445  	            0x6800000: 0x80000,
 12446  	            0x7800000: 0x40080010,
 12447  	            0x8800000: 0x80010,
 12448  	            0x9800000: 0x0,
 12449  	            0xa800000: 0x4000,
 12450  	            0xb800000: 0x40080000,
 12451  	            0xc800000: 0x40000010,
 12452  	            0xd800000: 0x84000,
 12453  	            0xe800000: 0x40084000,
 12454  	            0xf800000: 0x4010,
 12455  	            0x10000000: 0x0,
 12456  	            0x11000000: 0x40080010,
 12457  	            0x12000000: 0x40004010,
 12458  	            0x13000000: 0x40084000,
 12459  	            0x14000000: 0x40080000,
 12460  	            0x15000000: 0x10,
 12461  	            0x16000000: 0x84010,
 12462  	            0x17000000: 0x4000,
 12463  	            0x18000000: 0x4010,
 12464  	            0x19000000: 0x80000,
 12465  	            0x1a000000: 0x80010,
 12466  	            0x1b000000: 0x40000010,
 12467  	            0x1c000000: 0x84000,
 12468  	            0x1d000000: 0x40004000,
 12469  	            0x1e000000: 0x40000000,
 12470  	            0x1f000000: 0x40084010,
 12471  	            0x10800000: 0x84010,
 12472  	            0x11800000: 0x80000,
 12473  	            0x12800000: 0x40080000,
 12474  	            0x13800000: 0x4000,
 12475  	            0x14800000: 0x40004000,
 12476  	            0x15800000: 0x40084010,
 12477  	            0x16800000: 0x10,
 12478  	            0x17800000: 0x40000000,
 12479  	            0x18800000: 0x40084000,
 12480  	            0x19800000: 0x40000010,
 12481  	            0x1a800000: 0x40004010,
 12482  	            0x1b800000: 0x80010,
 12483  	            0x1c800000: 0x0,
 12484  	            0x1d800000: 0x4010,
 12485  	            0x1e800000: 0x40080010,
 12486  	            0x1f800000: 0x84000
 12487  	        },
 12488  	        {
 12489  	            0x0: 0x104,
 12490  	            0x100000: 0x0,
 12491  	            0x200000: 0x4000100,
 12492  	            0x300000: 0x10104,
 12493  	            0x400000: 0x10004,
 12494  	            0x500000: 0x4000004,
 12495  	            0x600000: 0x4010104,
 12496  	            0x700000: 0x4010000,
 12497  	            0x800000: 0x4000000,
 12498  	            0x900000: 0x4010100,
 12499  	            0xa00000: 0x10100,
 12500  	            0xb00000: 0x4010004,
 12501  	            0xc00000: 0x4000104,
 12502  	            0xd00000: 0x10000,
 12503  	            0xe00000: 0x4,
 12504  	            0xf00000: 0x100,
 12505  	            0x80000: 0x4010100,
 12506  	            0x180000: 0x4010004,
 12507  	            0x280000: 0x0,
 12508  	            0x380000: 0x4000100,
 12509  	            0x480000: 0x4000004,
 12510  	            0x580000: 0x10000,
 12511  	            0x680000: 0x10004,
 12512  	            0x780000: 0x104,
 12513  	            0x880000: 0x4,
 12514  	            0x980000: 0x100,
 12515  	            0xa80000: 0x4010000,
 12516  	            0xb80000: 0x10104,
 12517  	            0xc80000: 0x10100,
 12518  	            0xd80000: 0x4000104,
 12519  	            0xe80000: 0x4010104,
 12520  	            0xf80000: 0x4000000,
 12521  	            0x1000000: 0x4010100,
 12522  	            0x1100000: 0x10004,
 12523  	            0x1200000: 0x10000,
 12524  	            0x1300000: 0x4000100,
 12525  	            0x1400000: 0x100,
 12526  	            0x1500000: 0x4010104,
 12527  	            0x1600000: 0x4000004,
 12528  	            0x1700000: 0x0,
 12529  	            0x1800000: 0x4000104,
 12530  	            0x1900000: 0x4000000,
 12531  	            0x1a00000: 0x4,
 12532  	            0x1b00000: 0x10100,
 12533  	            0x1c00000: 0x4010000,
 12534  	            0x1d00000: 0x104,
 12535  	            0x1e00000: 0x10104,
 12536  	            0x1f00000: 0x4010004,
 12537  	            0x1080000: 0x4000000,
 12538  	            0x1180000: 0x104,
 12539  	            0x1280000: 0x4010100,
 12540  	            0x1380000: 0x0,
 12541  	            0x1480000: 0x10004,
 12542  	            0x1580000: 0x4000100,
 12543  	            0x1680000: 0x100,
 12544  	            0x1780000: 0x4010004,
 12545  	            0x1880000: 0x10000,
 12546  	            0x1980000: 0x4010104,
 12547  	            0x1a80000: 0x10104,
 12548  	            0x1b80000: 0x4000004,
 12549  	            0x1c80000: 0x4000104,
 12550  	            0x1d80000: 0x4010000,
 12551  	            0x1e80000: 0x4,
 12552  	            0x1f80000: 0x10100
 12553  	        },
 12554  	        {
 12555  	            0x0: 0x80401000,
 12556  	            0x10000: 0x80001040,
 12557  	            0x20000: 0x401040,
 12558  	            0x30000: 0x80400000,
 12559  	            0x40000: 0x0,
 12560  	            0x50000: 0x401000,
 12561  	            0x60000: 0x80000040,
 12562  	            0x70000: 0x400040,
 12563  	            0x80000: 0x80000000,
 12564  	            0x90000: 0x400000,
 12565  	            0xa0000: 0x40,
 12566  	            0xb0000: 0x80001000,
 12567  	            0xc0000: 0x80400040,
 12568  	            0xd0000: 0x1040,
 12569  	            0xe0000: 0x1000,
 12570  	            0xf0000: 0x80401040,
 12571  	            0x8000: 0x80001040,
 12572  	            0x18000: 0x40,
 12573  	            0x28000: 0x80400040,
 12574  	            0x38000: 0x80001000,
 12575  	            0x48000: 0x401000,
 12576  	            0x58000: 0x80401040,
 12577  	            0x68000: 0x0,
 12578  	            0x78000: 0x80400000,
 12579  	            0x88000: 0x1000,
 12580  	            0x98000: 0x80401000,
 12581  	            0xa8000: 0x400000,
 12582  	            0xb8000: 0x1040,
 12583  	            0xc8000: 0x80000000,
 12584  	            0xd8000: 0x400040,
 12585  	            0xe8000: 0x401040,
 12586  	            0xf8000: 0x80000040,
 12587  	            0x100000: 0x400040,
 12588  	            0x110000: 0x401000,
 12589  	            0x120000: 0x80000040,
 12590  	            0x130000: 0x0,
 12591  	            0x140000: 0x1040,
 12592  	            0x150000: 0x80400040,
 12593  	            0x160000: 0x80401000,
 12594  	            0x170000: 0x80001040,
 12595  	            0x180000: 0x80401040,
 12596  	            0x190000: 0x80000000,
 12597  	            0x1a0000: 0x80400000,
 12598  	            0x1b0000: 0x401040,
 12599  	            0x1c0000: 0x80001000,
 12600  	            0x1d0000: 0x400000,
 12601  	            0x1e0000: 0x40,
 12602  	            0x1f0000: 0x1000,
 12603  	            0x108000: 0x80400000,
 12604  	            0x118000: 0x80401040,
 12605  	            0x128000: 0x0,
 12606  	            0x138000: 0x401000,
 12607  	            0x148000: 0x400040,
 12608  	            0x158000: 0x80000000,
 12609  	            0x168000: 0x80001040,
 12610  	            0x178000: 0x40,
 12611  	            0x188000: 0x80000040,
 12612  	            0x198000: 0x1000,
 12613  	            0x1a8000: 0x80001000,
 12614  	            0x1b8000: 0x80400040,
 12615  	            0x1c8000: 0x1040,
 12616  	            0x1d8000: 0x80401000,
 12617  	            0x1e8000: 0x400000,
 12618  	            0x1f8000: 0x401040
 12619  	        },
 12620  	        {
 12621  	            0x0: 0x80,
 12622  	            0x1000: 0x1040000,
 12623  	            0x2000: 0x40000,
 12624  	            0x3000: 0x20000000,
 12625  	            0x4000: 0x20040080,
 12626  	            0x5000: 0x1000080,
 12627  	            0x6000: 0x21000080,
 12628  	            0x7000: 0x40080,
 12629  	            0x8000: 0x1000000,
 12630  	            0x9000: 0x20040000,
 12631  	            0xa000: 0x20000080,
 12632  	            0xb000: 0x21040080,
 12633  	            0xc000: 0x21040000,
 12634  	            0xd000: 0x0,
 12635  	            0xe000: 0x1040080,
 12636  	            0xf000: 0x21000000,
 12637  	            0x800: 0x1040080,
 12638  	            0x1800: 0x21000080,
 12639  	            0x2800: 0x80,
 12640  	            0x3800: 0x1040000,
 12641  	            0x4800: 0x40000,
 12642  	            0x5800: 0x20040080,
 12643  	            0x6800: 0x21040000,
 12644  	            0x7800: 0x20000000,
 12645  	            0x8800: 0x20040000,
 12646  	            0x9800: 0x0,
 12647  	            0xa800: 0x21040080,
 12648  	            0xb800: 0x1000080,
 12649  	            0xc800: 0x20000080,
 12650  	            0xd800: 0x21000000,
 12651  	            0xe800: 0x1000000,
 12652  	            0xf800: 0x40080,
 12653  	            0x10000: 0x40000,
 12654  	            0x11000: 0x80,
 12655  	            0x12000: 0x20000000,
 12656  	            0x13000: 0x21000080,
 12657  	            0x14000: 0x1000080,
 12658  	            0x15000: 0x21040000,
 12659  	            0x16000: 0x20040080,
 12660  	            0x17000: 0x1000000,
 12661  	            0x18000: 0x21040080,
 12662  	            0x19000: 0x21000000,
 12663  	            0x1a000: 0x1040000,
 12664  	            0x1b000: 0x20040000,
 12665  	            0x1c000: 0x40080,
 12666  	            0x1d000: 0x20000080,
 12667  	            0x1e000: 0x0,
 12668  	            0x1f000: 0x1040080,
 12669  	            0x10800: 0x21000080,
 12670  	            0x11800: 0x1000000,
 12671  	            0x12800: 0x1040000,
 12672  	            0x13800: 0x20040080,
 12673  	            0x14800: 0x20000000,
 12674  	            0x15800: 0x1040080,
 12675  	            0x16800: 0x80,
 12676  	            0x17800: 0x21040000,
 12677  	            0x18800: 0x40080,
 12678  	            0x19800: 0x21040080,
 12679  	            0x1a800: 0x0,
 12680  	            0x1b800: 0x21000000,
 12681  	            0x1c800: 0x1000080,
 12682  	            0x1d800: 0x40000,
 12683  	            0x1e800: 0x20040000,
 12684  	            0x1f800: 0x20000080
 12685  	        },
 12686  	        {
 12687  	            0x0: 0x10000008,
 12688  	            0x100: 0x2000,
 12689  	            0x200: 0x10200000,
 12690  	            0x300: 0x10202008,
 12691  	            0x400: 0x10002000,
 12692  	            0x500: 0x200000,
 12693  	            0x600: 0x200008,
 12694  	            0x700: 0x10000000,
 12695  	            0x800: 0x0,
 12696  	            0x900: 0x10002008,
 12697  	            0xa00: 0x202000,
 12698  	            0xb00: 0x8,
 12699  	            0xc00: 0x10200008,
 12700  	            0xd00: 0x202008,
 12701  	            0xe00: 0x2008,
 12702  	            0xf00: 0x10202000,
 12703  	            0x80: 0x10200000,
 12704  	            0x180: 0x10202008,
 12705  	            0x280: 0x8,
 12706  	            0x380: 0x200000,
 12707  	            0x480: 0x202008,
 12708  	            0x580: 0x10000008,
 12709  	            0x680: 0x10002000,
 12710  	            0x780: 0x2008,
 12711  	            0x880: 0x200008,
 12712  	            0x980: 0x2000,
 12713  	            0xa80: 0x10002008,
 12714  	            0xb80: 0x10200008,
 12715  	            0xc80: 0x0,
 12716  	            0xd80: 0x10202000,
 12717  	            0xe80: 0x202000,
 12718  	            0xf80: 0x10000000,
 12719  	            0x1000: 0x10002000,
 12720  	            0x1100: 0x10200008,
 12721  	            0x1200: 0x10202008,
 12722  	            0x1300: 0x2008,
 12723  	            0x1400: 0x200000,
 12724  	            0x1500: 0x10000000,
 12725  	            0x1600: 0x10000008,
 12726  	            0x1700: 0x202000,
 12727  	            0x1800: 0x202008,
 12728  	            0x1900: 0x0,
 12729  	            0x1a00: 0x8,
 12730  	            0x1b00: 0x10200000,
 12731  	            0x1c00: 0x2000,
 12732  	            0x1d00: 0x10002008,
 12733  	            0x1e00: 0x10202000,
 12734  	            0x1f00: 0x200008,
 12735  	            0x1080: 0x8,
 12736  	            0x1180: 0x202000,
 12737  	            0x1280: 0x200000,
 12738  	            0x1380: 0x10000008,
 12739  	            0x1480: 0x10002000,
 12740  	            0x1580: 0x2008,
 12741  	            0x1680: 0x10202008,
 12742  	            0x1780: 0x10200000,
 12743  	            0x1880: 0x10202000,
 12744  	            0x1980: 0x10200008,
 12745  	            0x1a80: 0x2000,
 12746  	            0x1b80: 0x202008,
 12747  	            0x1c80: 0x200008,
 12748  	            0x1d80: 0x0,
 12749  	            0x1e80: 0x10000000,
 12750  	            0x1f80: 0x10002008
 12751  	        },
 12752  	        {
 12753  	            0x0: 0x100000,
 12754  	            0x10: 0x2000401,
 12755  	            0x20: 0x400,
 12756  	            0x30: 0x100401,
 12757  	            0x40: 0x2100401,
 12758  	            0x50: 0x0,
 12759  	            0x60: 0x1,
 12760  	            0x70: 0x2100001,
 12761  	            0x80: 0x2000400,
 12762  	            0x90: 0x100001,
 12763  	            0xa0: 0x2000001,
 12764  	            0xb0: 0x2100400,
 12765  	            0xc0: 0x2100000,
 12766  	            0xd0: 0x401,
 12767  	            0xe0: 0x100400,
 12768  	            0xf0: 0x2000000,
 12769  	            0x8: 0x2100001,
 12770  	            0x18: 0x0,
 12771  	            0x28: 0x2000401,
 12772  	            0x38: 0x2100400,
 12773  	            0x48: 0x100000,
 12774  	            0x58: 0x2000001,
 12775  	            0x68: 0x2000000,
 12776  	            0x78: 0x401,
 12777  	            0x88: 0x100401,
 12778  	            0x98: 0x2000400,
 12779  	            0xa8: 0x2100000,
 12780  	            0xb8: 0x100001,
 12781  	            0xc8: 0x400,
 12782  	            0xd8: 0x2100401,
 12783  	            0xe8: 0x1,
 12784  	            0xf8: 0x100400,
 12785  	            0x100: 0x2000000,
 12786  	            0x110: 0x100000,
 12787  	            0x120: 0x2000401,
 12788  	            0x130: 0x2100001,
 12789  	            0x140: 0x100001,
 12790  	            0x150: 0x2000400,
 12791  	            0x160: 0x2100400,
 12792  	            0x170: 0x100401,
 12793  	            0x180: 0x401,
 12794  	            0x190: 0x2100401,
 12795  	            0x1a0: 0x100400,
 12796  	            0x1b0: 0x1,
 12797  	            0x1c0: 0x0,
 12798  	            0x1d0: 0x2100000,
 12799  	            0x1e0: 0x2000001,
 12800  	            0x1f0: 0x400,
 12801  	            0x108: 0x100400,
 12802  	            0x118: 0x2000401,
 12803  	            0x128: 0x2100001,
 12804  	            0x138: 0x1,
 12805  	            0x148: 0x2000000,
 12806  	            0x158: 0x100000,
 12807  	            0x168: 0x401,
 12808  	            0x178: 0x2100400,
 12809  	            0x188: 0x2000001,
 12810  	            0x198: 0x2100000,
 12811  	            0x1a8: 0x0,
 12812  	            0x1b8: 0x2100401,
 12813  	            0x1c8: 0x100401,
 12814  	            0x1d8: 0x400,
 12815  	            0x1e8: 0x2000400,
 12816  	            0x1f8: 0x100001
 12817  	        },
 12818  	        {
 12819  	            0x0: 0x8000820,
 12820  	            0x1: 0x20000,
 12821  	            0x2: 0x8000000,
 12822  	            0x3: 0x20,
 12823  	            0x4: 0x20020,
 12824  	            0x5: 0x8020820,
 12825  	            0x6: 0x8020800,
 12826  	            0x7: 0x800,
 12827  	            0x8: 0x8020000,
 12828  	            0x9: 0x8000800,
 12829  	            0xa: 0x20800,
 12830  	            0xb: 0x8020020,
 12831  	            0xc: 0x820,
 12832  	            0xd: 0x0,
 12833  	            0xe: 0x8000020,
 12834  	            0xf: 0x20820,
 12835  	            0x80000000: 0x800,
 12836  	            0x80000001: 0x8020820,
 12837  	            0x80000002: 0x8000820,
 12838  	            0x80000003: 0x8000000,
 12839  	            0x80000004: 0x8020000,
 12840  	            0x80000005: 0x20800,
 12841  	            0x80000006: 0x20820,
 12842  	            0x80000007: 0x20,
 12843  	            0x80000008: 0x8000020,
 12844  	            0x80000009: 0x820,
 12845  	            0x8000000a: 0x20020,
 12846  	            0x8000000b: 0x8020800,
 12847  	            0x8000000c: 0x0,
 12848  	            0x8000000d: 0x8020020,
 12849  	            0x8000000e: 0x8000800,
 12850  	            0x8000000f: 0x20000,
 12851  	            0x10: 0x20820,
 12852  	            0x11: 0x8020800,
 12853  	            0x12: 0x20,
 12854  	            0x13: 0x800,
 12855  	            0x14: 0x8000800,
 12856  	            0x15: 0x8000020,
 12857  	            0x16: 0x8020020,
 12858  	            0x17: 0x20000,
 12859  	            0x18: 0x0,
 12860  	            0x19: 0x20020,
 12861  	            0x1a: 0x8020000,
 12862  	            0x1b: 0x8000820,
 12863  	            0x1c: 0x8020820,
 12864  	            0x1d: 0x20800,
 12865  	            0x1e: 0x820,
 12866  	            0x1f: 0x8000000,
 12867  	            0x80000010: 0x20000,
 12868  	            0x80000011: 0x800,
 12869  	            0x80000012: 0x8020020,
 12870  	            0x80000013: 0x20820,
 12871  	            0x80000014: 0x20,
 12872  	            0x80000015: 0x8020000,
 12873  	            0x80000016: 0x8000000,
 12874  	            0x80000017: 0x8000820,
 12875  	            0x80000018: 0x8020820,
 12876  	            0x80000019: 0x8000020,
 12877  	            0x8000001a: 0x8000800,
 12878  	            0x8000001b: 0x0,
 12879  	            0x8000001c: 0x20800,
 12880  	            0x8000001d: 0x820,
 12881  	            0x8000001e: 0x20020,
 12882  	            0x8000001f: 0x8020800
 12883  	        }
 12884  	    ];
 12885  
 12886  	    // Masks that select the SBOX input
 12887  	    var SBOX_MASK = [
 12888  	        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
 12889  	        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
 12890  	    ];
 12891  
 12892  	    /**
 12893  	     * DES block cipher algorithm.
 12894  	     */
 12895  	    var DES = C_algo.DES = BlockCipher.extend({
 12896  	        _doReset: function () {
 12897  	            // Shortcuts
 12898  	            var key = this._key;
 12899  	            var keyWords = key.words;
 12900  
 12901  	            // Select 56 bits according to PC1
 12902  	            var keyBits = [];
 12903  	            for (var i = 0; i < 56; i++) {
 12904  	                var keyBitPos = PC1[i] - 1;
 12905  	                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
 12906  	            }
 12907  
 12908  	            // Assemble 16 subkeys
 12909  	            var subKeys = this._subKeys = [];
 12910  	            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
 12911  	                // Create subkey
 12912  	                var subKey = subKeys[nSubKey] = [];
 12913  
 12914  	                // Shortcut
 12915  	                var bitShift = BIT_SHIFTS[nSubKey];
 12916  
 12917  	                // Select 48 bits according to PC2
 12918  	                for (var i = 0; i < 24; i++) {
 12919  	                    // Select from the left 28 key bits
 12920  	                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
 12921  
 12922  	                    // Select from the right 28 key bits
 12923  	                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
 12924  	                }
 12925  
 12926  	                // Since each subkey is applied to an expanded 32-bit input,
 12927  	                // the subkey can be broken into 8 values scaled to 32-bits,
 12928  	                // which allows the key to be used without expansion
 12929  	                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
 12930  	                for (var i = 1; i < 7; i++) {
 12931  	                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
 12932  	                }
 12933  	                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
 12934  	            }
 12935  
 12936  	            // Compute inverse subkeys
 12937  	            var invSubKeys = this._invSubKeys = [];
 12938  	            for (var i = 0; i < 16; i++) {
 12939  	                invSubKeys[i] = subKeys[15 - i];
 12940  	            }
 12941  	        },
 12942  
 12943  	        encryptBlock: function (M, offset) {
 12944  	            this._doCryptBlock(M, offset, this._subKeys);
 12945  	        },
 12946  
 12947  	        decryptBlock: function (M, offset) {
 12948  	            this._doCryptBlock(M, offset, this._invSubKeys);
 12949  	        },
 12950  
 12951  	        _doCryptBlock: function (M, offset, subKeys) {
 12952  	            // Get input
 12953  	            this._lBlock = M[offset];
 12954  	            this._rBlock = M[offset + 1];
 12955  
 12956  	            // Initial permutation
 12957  	            exchangeLR.call(this, 4,  0x0f0f0f0f);
 12958  	            exchangeLR.call(this, 16, 0x0000ffff);
 12959  	            exchangeRL.call(this, 2,  0x33333333);
 12960  	            exchangeRL.call(this, 8,  0x00ff00ff);
 12961  	            exchangeLR.call(this, 1,  0x55555555);
 12962  
 12963  	            // Rounds
 12964  	            for (var round = 0; round < 16; round++) {
 12965  	                // Shortcuts
 12966  	                var subKey = subKeys[round];
 12967  	                var lBlock = this._lBlock;
 12968  	                var rBlock = this._rBlock;
 12969  
 12970  	                // Feistel function
 12971  	                var f = 0;
 12972  	                for (var i = 0; i < 8; i++) {
 12973  	                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
 12974  	                }
 12975  	                this._lBlock = rBlock;
 12976  	                this._rBlock = lBlock ^ f;
 12977  	            }
 12978  
 12979  	            // Undo swap from last round
 12980  	            var t = this._lBlock;
 12981  	            this._lBlock = this._rBlock;
 12982  	            this._rBlock = t;
 12983  
 12984  	            // Final permutation
 12985  	            exchangeLR.call(this, 1,  0x55555555);
 12986  	            exchangeRL.call(this, 8,  0x00ff00ff);
 12987  	            exchangeRL.call(this, 2,  0x33333333);
 12988  	            exchangeLR.call(this, 16, 0x0000ffff);
 12989  	            exchangeLR.call(this, 4,  0x0f0f0f0f);
 12990  
 12991  	            // Set output
 12992  	            M[offset] = this._lBlock;
 12993  	            M[offset + 1] = this._rBlock;
 12994  	        },
 12995  
 12996  	        keySize: 64/32,
 12997  
 12998  	        ivSize: 64/32,
 12999  
 13000  	        blockSize: 64/32
 13001  	    });
 13002  
 13003  	    // Swap bits across the left and right words
 13004  	    function exchangeLR(offset, mask) {
 13005  	        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
 13006  	        this._rBlock ^= t;
 13007  	        this._lBlock ^= t << offset;
 13008  	    }
 13009  
 13010  	    function exchangeRL(offset, mask) {
 13011  	        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
 13012  	        this._lBlock ^= t;
 13013  	        this._rBlock ^= t << offset;
 13014  	    }
 13015  
 13016  	    /**
 13017  	     * Shortcut functions to the cipher's object interface.
 13018  	     *
 13019  	     * @example
 13020  	     *
 13021  	     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
 13022  	     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);
 13023  	     */
 13024  	    C.DES = BlockCipher._createHelper(DES);
 13025  
 13026  	    /**
 13027  	     * Triple-DES block cipher algorithm.
 13028  	     */
 13029  	    var TripleDES = C_algo.TripleDES = BlockCipher.extend({
 13030  	        _doReset: function () {
 13031  	            // Shortcuts
 13032  	            var key = this._key;
 13033  	            var keyWords = key.words;
 13034  
 13035  	            // Create DES instances
 13036  	            this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
 13037  	            this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
 13038  	            this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
 13039  	        },
 13040  
 13041  	        encryptBlock: function (M, offset) {
 13042  	            this._des1.encryptBlock(M, offset);
 13043  	            this._des2.decryptBlock(M, offset);
 13044  	            this._des3.encryptBlock(M, offset);
 13045  	        },
 13046  
 13047  	        decryptBlock: function (M, offset) {
 13048  	            this._des3.decryptBlock(M, offset);
 13049  	            this._des2.encryptBlock(M, offset);
 13050  	            this._des1.decryptBlock(M, offset);
 13051  	        },
 13052  
 13053  	        keySize: 192/32,
 13054  
 13055  	        ivSize: 64/32,
 13056  
 13057  	        blockSize: 64/32
 13058  	    });
 13059  
 13060  	    /**
 13061  	     * Shortcut functions to the cipher's object interface.
 13062  	     *
 13063  	     * @example
 13064  	     *
 13065  	     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
 13066  	     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
 13067  	     */
 13068  	    C.TripleDES = BlockCipher._createHelper(TripleDES);
 13069  	}());
 13070  
 13071  
 13072  	return CryptoJS.TripleDES;
 13073  
 13074  }));
 13075  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],84:[function(require,module,exports){
 13076  ;(function (root, factory) {
 13077  	if (typeof exports === "object") {
 13078  		// CommonJS
 13079  		module.exports = exports = factory(require("./core"));
 13080  	}
 13081  	else if (typeof define === "function" && define.amd) {
 13082  		// AMD
 13083  		define(["./core"], factory);
 13084  	}
 13085  	else {
 13086  		// Global (browser)
 13087  		factory(root.CryptoJS);
 13088  	}
 13089  }(this, function (CryptoJS) {
 13090  
 13091  	(function (undefined) {
 13092  	    // Shortcuts
 13093  	    var C = CryptoJS;
 13094  	    var C_lib = C.lib;
 13095  	    var Base = C_lib.Base;
 13096  	    var X32WordArray = C_lib.WordArray;
 13097  
 13098  	    /**
 13099  	     * x64 namespace.
 13100  	     */
 13101  	    var C_x64 = C.x64 = {};
 13102  
 13103  	    /**
 13104  	     * A 64-bit word.
 13105  	     */
 13106  	    var X64Word = C_x64.Word = Base.extend({
 13107  	        /**
 13108  	         * Initializes a newly created 64-bit word.
 13109  	         *
 13110  	         * @param {number} high The high 32 bits.
 13111  	         * @param {number} low The low 32 bits.
 13112  	         *
 13113  	         * @example
 13114  	         *
 13115  	         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
 13116  	         */
 13117  	        init: function (high, low) {
 13118  	            this.high = high;
 13119  	            this.low = low;
 13120  	        }
 13121  
 13122  	        /**
 13123  	         * Bitwise NOTs this word.
 13124  	         *
 13125  	         * @return {X64Word} A new x64-Word object after negating.
 13126  	         *
 13127  	         * @example
 13128  	         *
 13129  	         *     var negated = x64Word.not();
 13130  	         */
 13131  	        // not: function () {
 13132  	            // var high = ~this.high;
 13133  	            // var low = ~this.low;
 13134  
 13135  	            // return X64Word.create(high, low);
 13136  	        // },
 13137  
 13138  	        /**
 13139  	         * Bitwise ANDs this word with the passed word.
 13140  	         *
 13141  	         * @param {X64Word} word The x64-Word to AND with this word.
 13142  	         *
 13143  	         * @return {X64Word} A new x64-Word object after ANDing.
 13144  	         *
 13145  	         * @example
 13146  	         *
 13147  	         *     var anded = x64Word.and(anotherX64Word);
 13148  	         */
 13149  	        // and: function (word) {
 13150  	            // var high = this.high & word.high;
 13151  	            // var low = this.low & word.low;
 13152  
 13153  	            // return X64Word.create(high, low);
 13154  	        // },
 13155  
 13156  	        /**
 13157  	         * Bitwise ORs this word with the passed word.
 13158  	         *
 13159  	         * @param {X64Word} word The x64-Word to OR with this word.
 13160  	         *
 13161  	         * @return {X64Word} A new x64-Word object after ORing.
 13162  	         *
 13163  	         * @example
 13164  	         *
 13165  	         *     var ored = x64Word.or(anotherX64Word);
 13166  	         */
 13167  	        // or: function (word) {
 13168  	            // var high = this.high | word.high;
 13169  	            // var low = this.low | word.low;
 13170  
 13171  	            // return X64Word.create(high, low);
 13172  	        // },
 13173  
 13174  	        /**
 13175  	         * Bitwise XORs this word with the passed word.
 13176  	         *
 13177  	         * @param {X64Word} word The x64-Word to XOR with this word.
 13178  	         *
 13179  	         * @return {X64Word} A new x64-Word object after XORing.
 13180  	         *
 13181  	         * @example
 13182  	         *
 13183  	         *     var xored = x64Word.xor(anotherX64Word);
 13184  	         */
 13185  	        // xor: function (word) {
 13186  	            // var high = this.high ^ word.high;
 13187  	            // var low = this.low ^ word.low;
 13188  
 13189  	            // return X64Word.create(high, low);
 13190  	        // },
 13191  
 13192  	        /**
 13193  	         * Shifts this word n bits to the left.
 13194  	         *
 13195  	         * @param {number} n The number of bits to shift.
 13196  	         *
 13197  	         * @return {X64Word} A new x64-Word object after shifting.
 13198  	         *
 13199  	         * @example
 13200  	         *
 13201  	         *     var shifted = x64Word.shiftL(25);
 13202  	         */
 13203  	        // shiftL: function (n) {
 13204  	            // if (n < 32) {
 13205  	                // var high = (this.high << n) | (this.low >>> (32 - n));
 13206  	                // var low = this.low << n;
 13207  	            // } else {
 13208  	                // var high = this.low << (n - 32);
 13209  	                // var low = 0;
 13210  	            // }
 13211  
 13212  	            // return X64Word.create(high, low);
 13213  	        // },
 13214  
 13215  	        /**
 13216  	         * Shifts this word n bits to the right.
 13217  	         *
 13218  	         * @param {number} n The number of bits to shift.
 13219  	         *
 13220  	         * @return {X64Word} A new x64-Word object after shifting.
 13221  	         *
 13222  	         * @example
 13223  	         *
 13224  	         *     var shifted = x64Word.shiftR(7);
 13225  	         */
 13226  	        // shiftR: function (n) {
 13227  	            // if (n < 32) {
 13228  	                // var low = (this.low >>> n) | (this.high << (32 - n));
 13229  	                // var high = this.high >>> n;
 13230  	            // } else {
 13231  	                // var low = this.high >>> (n - 32);
 13232  	                // var high = 0;
 13233  	            // }
 13234  
 13235  	            // return X64Word.create(high, low);
 13236  	        // },
 13237  
 13238  	        /**
 13239  	         * Rotates this word n bits to the left.
 13240  	         *
 13241  	         * @param {number} n The number of bits to rotate.
 13242  	         *
 13243  	         * @return {X64Word} A new x64-Word object after rotating.
 13244  	         *
 13245  	         * @example
 13246  	         *
 13247  	         *     var rotated = x64Word.rotL(25);
 13248  	         */
 13249  	        // rotL: function (n) {
 13250  	            // return this.shiftL(n).or(this.shiftR(64 - n));
 13251  	        // },
 13252  
 13253  	        /**
 13254  	         * Rotates this word n bits to the right.
 13255  	         *
 13256  	         * @param {number} n The number of bits to rotate.
 13257  	         *
 13258  	         * @return {X64Word} A new x64-Word object after rotating.
 13259  	         *
 13260  	         * @example
 13261  	         *
 13262  	         *     var rotated = x64Word.rotR(7);
 13263  	         */
 13264  	        // rotR: function (n) {
 13265  	            // return this.shiftR(n).or(this.shiftL(64 - n));
 13266  	        // },
 13267  
 13268  	        /**
 13269  	         * Adds this word with the passed word.
 13270  	         *
 13271  	         * @param {X64Word} word The x64-Word to add with this word.
 13272  	         *
 13273  	         * @return {X64Word} A new x64-Word object after adding.
 13274  	         *
 13275  	         * @example
 13276  	         *
 13277  	         *     var added = x64Word.add(anotherX64Word);
 13278  	         */
 13279  	        // add: function (word) {
 13280  	            // var low = (this.low + word.low) | 0;
 13281  	            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
 13282  	            // var high = (this.high + word.high + carry) | 0;
 13283  
 13284  	            // return X64Word.create(high, low);
 13285  	        // }
 13286  	    });
 13287  
 13288  	    /**
 13289  	     * An array of 64-bit words.
 13290  	     *
 13291  	     * @property {Array} words The array of CryptoJS.x64.Word objects.
 13292  	     * @property {number} sigBytes The number of significant bytes in this word array.
 13293  	     */
 13294  	    var X64WordArray = C_x64.WordArray = Base.extend({
 13295  	        /**
 13296  	         * Initializes a newly created word array.
 13297  	         *
 13298  	         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
 13299  	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
 13300  	         *
 13301  	         * @example
 13302  	         *
 13303  	         *     var wordArray = CryptoJS.x64.WordArray.create();
 13304  	         *
 13305  	         *     var wordArray = CryptoJS.x64.WordArray.create([
 13306  	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
 13307  	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
 13308  	         *     ]);
 13309  	         *
 13310  	         *     var wordArray = CryptoJS.x64.WordArray.create([
 13311  	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
 13312  	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
 13313  	         *     ], 10);
 13314  	         */
 13315  	        init: function (words, sigBytes) {
 13316  	            words = this.words = words || [];
 13317  
 13318  	            if (sigBytes != undefined) {
 13319  	                this.sigBytes = sigBytes;
 13320  	            } else {
 13321  	                this.sigBytes = words.length * 8;
 13322  	            }
 13323  	        },
 13324  
 13325  	        /**
 13326  	         * Converts this 64-bit word array to a 32-bit word array.
 13327  	         *
 13328  	         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
 13329  	         *
 13330  	         * @example
 13331  	         *
 13332  	         *     var x32WordArray = x64WordArray.toX32();
 13333  	         */
 13334  	        toX32: function () {
 13335  	            // Shortcuts
 13336  	            var x64Words = this.words;
 13337  	            var x64WordsLength = x64Words.length;
 13338  
 13339  	            // Convert
 13340  	            var x32Words = [];
 13341  	            for (var i = 0; i < x64WordsLength; i++) {
 13342  	                var x64Word = x64Words[i];
 13343  	                x32Words.push(x64Word.high);
 13344  	                x32Words.push(x64Word.low);
 13345  	            }
 13346  
 13347  	            return X32WordArray.create(x32Words, this.sigBytes);
 13348  	        },
 13349  
 13350  	        /**
 13351  	         * Creates a copy of this word array.
 13352  	         *
 13353  	         * @return {X64WordArray} The clone.
 13354  	         *
 13355  	         * @example
 13356  	         *
 13357  	         *     var clone = x64WordArray.clone();
 13358  	         */
 13359  	        clone: function () {
 13360  	            var clone = Base.clone.call(this);
 13361  
 13362  	            // Clone "words" array
 13363  	            var words = clone.words = this.words.slice(0);
 13364  
 13365  	            // Clone each X64Word object
 13366  	            var wordsLength = words.length;
 13367  	            for (var i = 0; i < wordsLength; i++) {
 13368  	                words[i] = words[i].clone();
 13369  	            }
 13370  
 13371  	            return clone;
 13372  	        }
 13373  	    });
 13374  	}());
 13375  
 13376  
 13377  	return CryptoJS;
 13378  
 13379  }));
 13380  },{"./core":53}],85:[function(require,module,exports){
 13381  /*! https://mths.be/utf8js v2.1.2 by @mathias */
 13382  ;(function(root) {
 13383  
 13384  	// Detect free variables `exports`
 13385  	var freeExports = typeof exports == 'object' && exports;
 13386  
 13387  	// Detect free variable `module`
 13388  	var freeModule = typeof module == 'object' && module &&
 13389  		module.exports == freeExports && module;
 13390  
 13391  	// Detect free variable `global`, from Node.js or Browserified code,
 13392  	// and use it as `root`
 13393  	var freeGlobal = typeof global == 'object' && global;
 13394  	if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
 13395  		root = freeGlobal;
 13396  	}
 13397  
 13398  	/*--------------------------------------------------------------------------*/
 13399  
 13400  	var stringFromCharCode = String.fromCharCode;
 13401  
 13402  	// Taken from https://mths.be/punycode
 13403  	function ucs2decode(string) {
 13404  		var output = [];
 13405  		var counter = 0;
 13406  		var length = string.length;
 13407  		var value;
 13408  		var extra;
 13409  		while (counter < length) {
 13410  			value = string.charCodeAt(counter++);
 13411  			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
 13412  				// high surrogate, and there is a next character
 13413  				extra = string.charCodeAt(counter++);
 13414  				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
 13415  					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
 13416  				} else {
 13417  					// unmatched surrogate; only append this code unit, in case the next
 13418  					// code unit is the high surrogate of a surrogate pair
 13419  					output.push(value);
 13420  					counter--;
 13421  				}
 13422  			} else {
 13423  				output.push(value);
 13424  			}
 13425  		}
 13426  		return output;
 13427  	}
 13428  
 13429  	// Taken from https://mths.be/punycode
 13430  	function ucs2encode(array) {
 13431  		var length = array.length;
 13432  		var index = -1;
 13433  		var value;
 13434  		var output = '';
 13435  		while (++index < length) {
 13436  			value = array[index];
 13437  			if (value > 0xFFFF) {
 13438  				value -= 0x10000;
 13439  				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
 13440  				value = 0xDC00 | value & 0x3FF;
 13441  			}
 13442  			output += stringFromCharCode(value);
 13443  		}
 13444  		return output;
 13445  	}
 13446  
 13447  	function checkScalarValue(codePoint) {
 13448  		if (codePoint >= 0xD800 && codePoint <= 0xDFFF) {
 13449  			throw Error(
 13450  				'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +
 13451  				' is not a scalar value'
 13452  			);
 13453  		}
 13454  	}
 13455  	/*--------------------------------------------------------------------------*/
 13456  
 13457  	function createByte(codePoint, shift) {
 13458  		return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);
 13459  	}
 13460  
 13461  	function encodeCodePoint(codePoint) {
 13462  		if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence
 13463  			return stringFromCharCode(codePoint);
 13464  		}
 13465  		var symbol = '';
 13466  		if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence
 13467  			symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);
 13468  		}
 13469  		else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence
 13470  			checkScalarValue(codePoint);
 13471  			symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);
 13472  			symbol += createByte(codePoint, 6);
 13473  		}
 13474  		else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence
 13475  			symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);
 13476  			symbol += createByte(codePoint, 12);
 13477  			symbol += createByte(codePoint, 6);
 13478  		}
 13479  		symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);
 13480  		return symbol;
 13481  	}
 13482  
 13483  	function utf8encode(string) {
 13484  		var codePoints = ucs2decode(string);
 13485  		var length = codePoints.length;
 13486  		var index = -1;
 13487  		var codePoint;
 13488  		var byteString = '';
 13489  		while (++index < length) {
 13490  			codePoint = codePoints[index];
 13491  			byteString += encodeCodePoint(codePoint);
 13492  		}
 13493  		return byteString;
 13494  	}
 13495  
 13496  	/*--------------------------------------------------------------------------*/
 13497  
 13498  	function readContinuationByte() {
 13499  		if (byteIndex >= byteCount) {
 13500  			throw Error('Invalid byte index');
 13501  		}
 13502  
 13503  		var continuationByte = byteArray[byteIndex] & 0xFF;
 13504  		byteIndex++;
 13505  
 13506  		if ((continuationByte & 0xC0) == 0x80) {
 13507  			return continuationByte & 0x3F;
 13508  		}
 13509  
 13510  		// If we end up here, it’s not a continuation byte
 13511  		throw Error('Invalid continuation byte');
 13512  	}
 13513  
 13514  	function decodeSymbol() {
 13515  		var byte1;
 13516  		var byte2;
 13517  		var byte3;
 13518  		var byte4;
 13519  		var codePoint;
 13520  
 13521  		if (byteIndex > byteCount) {
 13522  			throw Error('Invalid byte index');
 13523  		}
 13524  
 13525  		if (byteIndex == byteCount) {
 13526  			return false;
 13527  		}
 13528  
 13529  		// Read first byte
 13530  		byte1 = byteArray[byteIndex] & 0xFF;
 13531  		byteIndex++;
 13532  
 13533  		// 1-byte sequence (no continuation bytes)
 13534  		if ((byte1 & 0x80) == 0) {
 13535  			return byte1;
 13536  		}
 13537  
 13538  		// 2-byte sequence
 13539  		if ((byte1 & 0xE0) == 0xC0) {
 13540  			byte2 = readContinuationByte();
 13541  			codePoint = ((byte1 & 0x1F) << 6) | byte2;
 13542  			if (codePoint >= 0x80) {
 13543  				return codePoint;
 13544  			} else {
 13545  				throw Error('Invalid continuation byte');
 13546  			}
 13547  		}
 13548  
 13549  		// 3-byte sequence (may include unpaired surrogates)
 13550  		if ((byte1 & 0xF0) == 0xE0) {
 13551  			byte2 = readContinuationByte();
 13552  			byte3 = readContinuationByte();
 13553  			codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;
 13554  			if (codePoint >= 0x0800) {
 13555  				checkScalarValue(codePoint);
 13556  				return codePoint;
 13557  			} else {
 13558  				throw Error('Invalid continuation byte');
 13559  			}
 13560  		}
 13561  
 13562  		// 4-byte sequence
 13563  		if ((byte1 & 0xF8) == 0xF0) {
 13564  			byte2 = readContinuationByte();
 13565  			byte3 = readContinuationByte();
 13566  			byte4 = readContinuationByte();
 13567  			codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |
 13568  				(byte3 << 0x06) | byte4;
 13569  			if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {
 13570  				return codePoint;
 13571  			}
 13572  		}
 13573  
 13574  		throw Error('Invalid UTF-8 detected');
 13575  	}
 13576  
 13577  	var byteArray;
 13578  	var byteCount;
 13579  	var byteIndex;
 13580  	function utf8decode(byteString) {
 13581  		byteArray = ucs2decode(byteString);
 13582  		byteCount = byteArray.length;
 13583  		byteIndex = 0;
 13584  		var codePoints = [];
 13585  		var tmp;
 13586  		while ((tmp = decodeSymbol()) !== false) {
 13587  			codePoints.push(tmp);
 13588  		}
 13589  		return ucs2encode(codePoints);
 13590  	}
 13591  
 13592  	/*--------------------------------------------------------------------------*/
 13593  
 13594  	var utf8 = {
 13595  		'version': '2.1.2',
 13596  		'encode': utf8encode,
 13597  		'decode': utf8decode
 13598  	};
 13599  
 13600  	// Some AMD build optimizers, like r.js, check for specific condition patterns
 13601  	// like the following:
 13602  	if (
 13603  		typeof define == 'function' &&
 13604  		typeof define.amd == 'object' &&
 13605  		define.amd
 13606  	) {
 13607  		define(function() {
 13608  			return utf8;
 13609  		});
 13610  	}	else if (freeExports && !freeExports.nodeType) {
 13611  		if (freeModule) { // in Node.js or RingoJS v0.8.0+
 13612  			freeModule.exports = utf8;
 13613  		} else { // in Narwhal or RingoJS v0.7.0-
 13614  			var object = {};
 13615  			var hasOwnProperty = object.hasOwnProperty;
 13616  			for (var key in utf8) {
 13617  				hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);
 13618  			}
 13619  		}
 13620  	} else { // in Rhino or a web browser
 13621  		root.utf8 = utf8;
 13622  	}
 13623  
 13624  }(this));
 13625  
 13626  },{}],86:[function(require,module,exports){
 13627  module.exports = XMLHttpRequest;
 13628  
 13629  },{}],"bignumber.js":[function(require,module,exports){
 13630  'use strict';
 13631  
 13632  module.exports = BigNumber; // jshint ignore:line
 13633  
 13634  
 13635  },{}],"web3":[function(require,module,exports){
 13636  var Web3 = require('./lib/web3');
 13637  
 13638  // don't override global variable
 13639  if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') {
 13640      window.Web3 = Web3;
 13641  }
 13642  
 13643  module.exports = Web3;
 13644  
 13645  },{"./lib/web3":22}]},{},["web3"])
 13646