github.com/cryptotooltop/go-ethereum@v0.0.0-20231103184714-151d1922f3e5/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 prootype 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 prootype 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 prootype 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 prootype 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 prootype 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 prootype 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 addres 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 Eth = require('./web3/methods/eth');
  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.eth = new Eth(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: 'eth_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/eth":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, 'eth', this._requestManager, watches.eth(), 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._eth, 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._eth._requestManager, events, contract.address);
  2871      All.attachToContract(contract);
  2872  
  2873      events.map(function (json) {
  2874          return new SolidityEvent(contract._eth._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._eth.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._eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){
  2913                      if(receipt && !callbackFired) {
  2914  
  2915                          contract._eth.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 (eth, abi) {
  2959      this.eth = eth;
  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.eth, 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.eth.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.eth.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.eth, 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 (eth, abi, address) {
  3097      this._eth = eth;
  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';
  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      if(tx.queueIndex !== undefined) {
  3794          tx.queueIndex = utils.toBigNumber(tx.queueIndex);
  3795      }
  3796      return tx;
  3797  };
  3798  
  3799  /**
  3800   * Formats the output of a transaction receipt to its proper values
  3801   *
  3802   * @method outputTransactionReceiptFormatter
  3803   * @param {Object} receipt
  3804   * @returns {Object}
  3805  */
  3806  var outputTransactionReceiptFormatter = function (receipt){
  3807      if(receipt.blockNumber !== null)
  3808          receipt.blockNumber = utils.toDecimal(receipt.blockNumber);
  3809      if(receipt.transactionIndex !== null)
  3810          receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex);
  3811      receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed);
  3812      receipt.gasUsed = utils.toDecimal(receipt.gasUsed);
  3813      if(receipt.effectiveGasPrice !== undefined) {
  3814        receipt.effectiveGasPrice = utils.toBigNumber(receipt.effectiveGasPrice);
  3815      }
  3816      if(utils.isArray(receipt.logs)) {
  3817          receipt.logs = receipt.logs.map(function(log){
  3818              return outputLogFormatter(log);
  3819          });
  3820      }
  3821  
  3822      return receipt;
  3823  };
  3824  
  3825  /**
  3826   * Formats the output of a block to its proper values
  3827   *
  3828   * @method outputBlockFormatter
  3829   * @param {Object} block
  3830   * @returns {Object}
  3831  */
  3832  var outputBlockFormatter = function(block) {
  3833      // transform to number
  3834      if (block.baseFeePerGas !== undefined) {
  3835        block.baseFeePerGas = utils.toBigNumber(block.baseFeePerGas);
  3836      }
  3837      block.gasLimit = utils.toDecimal(block.gasLimit);
  3838      block.gasUsed = utils.toDecimal(block.gasUsed);
  3839      block.size = utils.toDecimal(block.size);
  3840      block.timestamp = utils.toDecimal(block.timestamp);
  3841      if(block.number !== null)
  3842          block.number = utils.toDecimal(block.number);
  3843  
  3844      block.difficulty = utils.toBigNumber(block.difficulty);
  3845      block.totalDifficulty = utils.toBigNumber(block.totalDifficulty);
  3846  
  3847      if (utils.isArray(block.transactions)) {
  3848          block.transactions.forEach(function(item){
  3849              if(!utils.isString(item))
  3850                  return outputTransactionFormatter(item);
  3851          });
  3852      }
  3853  
  3854      return block;
  3855  };
  3856  
  3857  /**
  3858   * Formats the output of a log
  3859   *
  3860   * @method outputLogFormatter
  3861   * @param {Object} log object
  3862   * @returns {Object} log
  3863  */
  3864  var outputLogFormatter = function(log) {
  3865      if(log.blockNumber)
  3866          log.blockNumber = utils.toDecimal(log.blockNumber);
  3867      if(log.transactionIndex)
  3868          log.transactionIndex = utils.toDecimal(log.transactionIndex);
  3869      if(log.logIndex)
  3870          log.logIndex = utils.toDecimal(log.logIndex);
  3871  
  3872      return log;
  3873  };
  3874  
  3875  /**
  3876   * Formats the input of a whisper post and converts all values to HEX
  3877   *
  3878   * @method inputPostFormatter
  3879   * @param {Object} transaction object
  3880   * @returns {Object}
  3881  */
  3882  var inputPostFormatter = function(post) {
  3883  
  3884      // post.payload = utils.toHex(post.payload);
  3885      post.ttl = utils.fromDecimal(post.ttl);
  3886      post.workToProve = utils.fromDecimal(post.workToProve);
  3887      post.priority = utils.fromDecimal(post.priority);
  3888  
  3889      // fallback
  3890      if (!utils.isArray(post.topics)) {
  3891          post.topics = post.topics ? [post.topics] : [];
  3892      }
  3893  
  3894      // format the following options
  3895      post.topics = post.topics.map(function(topic){
  3896          // convert only if not hex
  3897          return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic);
  3898      });
  3899  
  3900      return post;
  3901  };
  3902  
  3903  /**
  3904   * Formats the output of a received post message
  3905   *
  3906   * @method outputPostFormatter
  3907   * @param {Object}
  3908   * @returns {Object}
  3909   */
  3910  var outputPostFormatter = function(post){
  3911  
  3912      post.expiry = utils.toDecimal(post.expiry);
  3913      post.sent = utils.toDecimal(post.sent);
  3914      post.ttl = utils.toDecimal(post.ttl);
  3915      post.workProved = utils.toDecimal(post.workProved);
  3916      // post.payloadRaw = post.payload;
  3917      // post.payload = utils.toAscii(post.payload);
  3918  
  3919      // if (utils.isJson(post.payload)) {
  3920      //     post.payload = JSON.parse(post.payload);
  3921      // }
  3922  
  3923      // format the following options
  3924      if (!post.topics) {
  3925          post.topics = [];
  3926      }
  3927      post.topics = post.topics.map(function(topic){
  3928          return utils.toAscii(topic);
  3929      });
  3930  
  3931      return post;
  3932  };
  3933  
  3934  var inputAddressFormatter = function (address) {
  3935      var iban = new Iban(address);
  3936      if (iban.isValid() && iban.isDirect()) {
  3937          return '0x' + iban.address();
  3938      } else if (utils.isStrictAddress(address)) {
  3939          return address;
  3940      } else if (utils.isAddress(address)) {
  3941          return '0x' + address;
  3942      }
  3943      throw new Error('invalid address');
  3944  };
  3945  
  3946  
  3947  var outputSyncingFormatter = function(result) {
  3948      if (!result) {
  3949          return result;
  3950      }
  3951  
  3952      result.startingBlock = utils.toDecimal(result.startingBlock);
  3953      result.currentBlock = utils.toDecimal(result.currentBlock);
  3954      result.highestBlock = utils.toDecimal(result.highestBlock);
  3955      if (result.knownStates) {
  3956          result.knownStates = utils.toDecimal(result.knownStates);
  3957          result.pulledStates = utils.toDecimal(result.pulledStates);
  3958      }
  3959  
  3960      return result;
  3961  };
  3962  
  3963  module.exports = {
  3964      inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,
  3965      inputBlockNumberFormatter: inputBlockNumberFormatter,
  3966      inputCallFormatter: inputCallFormatter,
  3967      inputTransactionFormatter: inputTransactionFormatter,
  3968      inputAddressFormatter: inputAddressFormatter,
  3969      inputPostFormatter: inputPostFormatter,
  3970      outputBigNumberFormatter: outputBigNumberFormatter,
  3971      outputTransactionFormatter: outputTransactionFormatter,
  3972      outputTransactionReceiptFormatter: outputTransactionReceiptFormatter,
  3973      outputBlockFormatter: outputBlockFormatter,
  3974      outputLogFormatter: outputLogFormatter,
  3975      outputPostFormatter: outputPostFormatter,
  3976      outputSyncingFormatter: outputSyncingFormatter
  3977  };
  3978  
  3979  
  3980  },{"../utils/config":18,"../utils/utils":20,"./iban":33}],31:[function(require,module,exports){
  3981  /*
  3982      This file is part of web3.js.
  3983  
  3984      web3.js is free software: you can redistribute it and/or modify
  3985      it under the terms of the GNU Lesser General Public License as published by
  3986      the Free Software Foundation, either version 3 of the License, or
  3987      (at your option) any later version.
  3988  
  3989      web3.js is distributed in the hope that it will be useful,
  3990      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3991      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3992      GNU Lesser General Public License for more details.
  3993  
  3994      You should have received a copy of the GNU Lesser General Public License
  3995      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3996  */
  3997  /**
  3998   * @file function.js
  3999   * @author Marek Kotewicz <marek@ethdev.com>
  4000   * @date 2015
  4001   */
  4002  
  4003  var coder = require('../solidity/coder');
  4004  var utils = require('../utils/utils');
  4005  var errors = require('./errors');
  4006  var formatters = require('./formatters');
  4007  var sha3 = require('../utils/sha3');
  4008  
  4009  /**
  4010   * This prototype should be used to call/sendTransaction to solidity functions
  4011   */
  4012  var SolidityFunction = function (eth, json, address) {
  4013      this._eth = eth;
  4014      this._inputTypes = json.inputs.map(function (i) {
  4015          return i.type;
  4016      });
  4017      this._outputTypes = json.outputs.map(function (i) {
  4018          return i.type;
  4019      });
  4020      this._constant = json.constant;
  4021      this._payable = json.payable;
  4022      this._name = utils.transformToFullName(json);
  4023      this._address = address;
  4024  };
  4025  
  4026  SolidityFunction.prototype.extractCallback = function (args) {
  4027      if (utils.isFunction(args[args.length - 1])) {
  4028          return args.pop(); // modify the args array!
  4029      }
  4030  };
  4031  
  4032  SolidityFunction.prototype.extractDefaultBlock = function (args) {
  4033      if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) {
  4034          return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array!
  4035      }
  4036  };
  4037  
  4038  /**
  4039   * Should be called to check if the number of arguments is correct
  4040   *
  4041   * @method validateArgs
  4042   * @param {Array} arguments
  4043   * @throws {Error} if it is not
  4044   */
  4045  SolidityFunction.prototype.validateArgs = function (args) {
  4046      var inputArgs = args.filter(function (a) {
  4047        // filter the options object but not arguments that are arrays
  4048        return !( (utils.isObject(a) === true) &&
  4049                  (utils.isArray(a) === false) &&
  4050                  (utils.isBigNumber(a) === false)
  4051                );
  4052      });
  4053      if (inputArgs.length !== this._inputTypes.length) {
  4054          throw errors.InvalidNumberOfSolidityArgs();
  4055      }
  4056  };
  4057  
  4058  /**
  4059   * Should be used to create payload from arguments
  4060   *
  4061   * @method toPayload
  4062   * @param {Array} solidity function params
  4063   * @param {Object} optional payload options
  4064   */
  4065  SolidityFunction.prototype.toPayload = function (args) {
  4066      var options = {};
  4067      if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {
  4068          options = args[args.length - 1];
  4069      }
  4070      this.validateArgs(args);
  4071      options.to = this._address;
  4072      options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args);
  4073      return options;
  4074  };
  4075  
  4076  /**
  4077   * Should be used to get function signature
  4078   *
  4079   * @method signature
  4080   * @return {String} function signature
  4081   */
  4082  SolidityFunction.prototype.signature = function () {
  4083      return sha3(this._name).slice(0, 8);
  4084  };
  4085  
  4086  
  4087  SolidityFunction.prototype.unpackOutput = function (output) {
  4088      if (!output) {
  4089          return;
  4090      }
  4091  
  4092      output = output.length >= 2 ? output.slice(2) : output;
  4093      var result = coder.decodeParams(this._outputTypes, output);
  4094      return result.length === 1 ? result[0] : result;
  4095  };
  4096  
  4097  /**
  4098   * Calls a contract function.
  4099   *
  4100   * @method call
  4101   * @param {...Object} Contract function arguments
  4102   * @param {function} If the last argument is a function, the contract function
  4103   *   call will be asynchronous, and the callback will be passed the
  4104   *   error and result.
  4105   * @return {String} output bytes
  4106   */
  4107  SolidityFunction.prototype.call = function () {
  4108      var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
  4109      var callback = this.extractCallback(args);
  4110      var defaultBlock = this.extractDefaultBlock(args);
  4111      var payload = this.toPayload(args);
  4112  
  4113  
  4114      if (!callback) {
  4115          var output = this._eth.call(payload, defaultBlock);
  4116          return this.unpackOutput(output);
  4117      }
  4118  
  4119      var self = this;
  4120      this._eth.call(payload, defaultBlock, function (error, output) {
  4121          if (error) return callback(error, null);
  4122  
  4123          var unpacked = null;
  4124          try {
  4125              unpacked = self.unpackOutput(output);
  4126          }
  4127          catch (e) {
  4128              error = e;
  4129          }
  4130  
  4131          callback(error, unpacked);
  4132      });
  4133  };
  4134  
  4135  /**
  4136   * Should be used to sendTransaction to solidity function
  4137   *
  4138   * @method sendTransaction
  4139   */
  4140  SolidityFunction.prototype.sendTransaction = function () {
  4141      var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
  4142      var callback = this.extractCallback(args);
  4143      var payload = this.toPayload(args);
  4144  
  4145      if (payload.value > 0 && !this._payable) {
  4146          throw new Error('Cannot send value to non-payable function');
  4147      }
  4148  
  4149      if (!callback) {
  4150          return this._eth.sendTransaction(payload);
  4151      }
  4152  
  4153      this._eth.sendTransaction(payload, callback);
  4154  };
  4155  
  4156  /**
  4157   * Should be used to estimateGas of solidity function
  4158   *
  4159   * @method estimateGas
  4160   */
  4161  SolidityFunction.prototype.estimateGas = function () {
  4162      var args = Array.prototype.slice.call(arguments);
  4163      var callback = this.extractCallback(args);
  4164      var payload = this.toPayload(args);
  4165  
  4166      if (!callback) {
  4167          return this._eth.estimateGas(payload);
  4168      }
  4169  
  4170      this._eth.estimateGas(payload, callback);
  4171  };
  4172  
  4173  /**
  4174   * Return the encoded data of the call
  4175   *
  4176   * @method getData
  4177   * @return {String} the encoded data
  4178   */
  4179  SolidityFunction.prototype.getData = function () {
  4180      var args = Array.prototype.slice.call(arguments);
  4181      var payload = this.toPayload(args);
  4182  
  4183      return payload.data;
  4184  };
  4185  
  4186  /**
  4187   * Should be used to get function display name
  4188   *
  4189   * @method displayName
  4190   * @return {String} display name of the function
  4191   */
  4192  SolidityFunction.prototype.displayName = function () {
  4193      return utils.extractDisplayName(this._name);
  4194  };
  4195  
  4196  /**
  4197   * Should be used to get function type name
  4198   *
  4199   * @method typeName
  4200   * @return {String} type name of the function
  4201   */
  4202  SolidityFunction.prototype.typeName = function () {
  4203      return utils.extractTypeName(this._name);
  4204  };
  4205  
  4206  /**
  4207   * Should be called to get rpc requests from solidity function
  4208   *
  4209   * @method request
  4210   * @returns {Object}
  4211   */
  4212  SolidityFunction.prototype.request = function () {
  4213      var args = Array.prototype.slice.call(arguments);
  4214      var callback = this.extractCallback(args);
  4215      var payload = this.toPayload(args);
  4216      var format = this.unpackOutput.bind(this);
  4217  
  4218      return {
  4219          method: this._constant ? 'eth_call' : 'eth_sendTransaction',
  4220          callback: callback,
  4221          params: [payload],
  4222          format: format
  4223      };
  4224  };
  4225  
  4226  /**
  4227   * Should be called to execute function
  4228   *
  4229   * @method execute
  4230   */
  4231  SolidityFunction.prototype.execute = function () {
  4232      var transaction = !this._constant;
  4233  
  4234      // send transaction
  4235      if (transaction) {
  4236          return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));
  4237      }
  4238  
  4239      // call
  4240      return this.call.apply(this, Array.prototype.slice.call(arguments));
  4241  };
  4242  
  4243  /**
  4244   * Should be called to attach function to contract
  4245   *
  4246   * @method attachToContract
  4247   * @param {Contract}
  4248   */
  4249  SolidityFunction.prototype.attachToContract = function (contract) {
  4250      var execute = this.execute.bind(this);
  4251      execute.request = this.request.bind(this);
  4252      execute.call = this.call.bind(this);
  4253      execute.sendTransaction = this.sendTransaction.bind(this);
  4254      execute.estimateGas = this.estimateGas.bind(this);
  4255      execute.getData = this.getData.bind(this);
  4256      var displayName = this.displayName();
  4257      if (!contract[displayName]) {
  4258          contract[displayName] = execute;
  4259      }
  4260      contract[displayName][this.typeName()] = execute; // circular!!!!
  4261  };
  4262  
  4263  module.exports = SolidityFunction;
  4264  
  4265  },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./errors":26,"./formatters":30}],32:[function(require,module,exports){
  4266  /*
  4267      This file is part of web3.js.
  4268  
  4269      web3.js is free software: you can redistribute it and/or modify
  4270      it under the terms of the GNU Lesser General Public License as published by
  4271      the Free Software Foundation, either version 3 of the License, or
  4272      (at your option) any later version.
  4273  
  4274      web3.js is distributed in the hope that it will be useful,
  4275      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4276      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4277      GNU Lesser General Public License for more details.
  4278  
  4279      You should have received a copy of the GNU Lesser General Public License
  4280      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4281  */
  4282  /** @file httpprovider.js
  4283   * @authors:
  4284   *   Marek Kotewicz <marek@ethdev.com>
  4285   *   Marian Oancea <marian@ethdev.com>
  4286   *   Fabian Vogelsteller <fabian@ethdev.com>
  4287   * @date 2015
  4288   */
  4289  
  4290  var errors = require('./errors');
  4291  
  4292  // workaround to use httpprovider in different envs
  4293  
  4294  // browser
  4295  if (typeof window !== 'undefined' && window.XMLHttpRequest) {
  4296    XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line
  4297  // node
  4298  } else {
  4299    XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line
  4300  }
  4301  
  4302  var XHR2 = require('xhr2'); // jshint ignore: line
  4303  
  4304  /**
  4305   * HttpProvider should be used to send rpc calls over http
  4306   */
  4307  var HttpProvider = function (host, timeout, user, password) {
  4308    this.host = host || 'http://localhost:8545';
  4309    this.timeout = timeout || 0;
  4310    this.user = user;
  4311    this.password = password;
  4312  };
  4313  
  4314  /**
  4315   * Should be called to prepare new XMLHttpRequest
  4316   *
  4317   * @method prepareRequest
  4318   * @param {Boolean} true if request should be async
  4319   * @return {XMLHttpRequest} object
  4320   */
  4321  HttpProvider.prototype.prepareRequest = function (async) {
  4322    var request;
  4323  
  4324    if (async) {
  4325      request = new XHR2();
  4326      request.timeout = this.timeout;
  4327    } else {
  4328      request = new XMLHttpRequest();
  4329    }
  4330  
  4331    request.open('POST', this.host, async);
  4332    if (this.user && this.password) {
  4333      var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64');
  4334      request.setRequestHeader('Authorization', auth);
  4335    } request.setRequestHeader('Content-Type', 'application/json');
  4336    return request;
  4337  };
  4338  
  4339  /**
  4340   * Should be called to make sync request
  4341   *
  4342   * @method send
  4343   * @param {Object} payload
  4344   * @return {Object} result
  4345   */
  4346  HttpProvider.prototype.send = function (payload) {
  4347    var request = this.prepareRequest(false);
  4348  
  4349    try {
  4350      request.send(JSON.stringify(payload));
  4351    } catch (error) {
  4352      throw errors.InvalidConnection(this.host);
  4353    }
  4354  
  4355    var result = request.responseText;
  4356  
  4357    try {
  4358      result = JSON.parse(result);
  4359    } catch (e) {
  4360      throw errors.InvalidResponse(request.responseText);
  4361    }
  4362  
  4363    return result;
  4364  };
  4365  
  4366  /**
  4367   * Should be used to make async request
  4368   *
  4369   * @method sendAsync
  4370   * @param {Object} payload
  4371   * @param {Function} callback triggered on end with (err, result)
  4372   */
  4373  HttpProvider.prototype.sendAsync = function (payload, callback) {
  4374    var request = this.prepareRequest(true);
  4375  
  4376    request.onreadystatechange = function () {
  4377      if (request.readyState === 4 && request.timeout !== 1) {
  4378        var result = request.responseText;
  4379        var error = null;
  4380  
  4381        try {
  4382          result = JSON.parse(result);
  4383        } catch (e) {
  4384          error = errors.InvalidResponse(request.responseText);
  4385        }
  4386  
  4387        callback(error, result);
  4388      }
  4389    };
  4390  
  4391    request.ontimeout = function () {
  4392      callback(errors.ConnectionTimeout(this.timeout));
  4393    };
  4394  
  4395    try {
  4396      request.send(JSON.stringify(payload));
  4397    } catch (error) {
  4398      callback(errors.InvalidConnection(this.host));
  4399    }
  4400  };
  4401  
  4402  /**
  4403   * Synchronously tries to make Http request
  4404   *
  4405   * @method isConnected
  4406   * @return {Boolean} returns true if request haven't failed. Otherwise false
  4407   */
  4408  HttpProvider.prototype.isConnected = function () {
  4409    try {
  4410      this.send({
  4411        id: 9999999999,
  4412        jsonrpc: '2.0',
  4413        method: 'net_listening',
  4414        params: []
  4415      });
  4416      return true;
  4417    } catch (e) {
  4418      return false;
  4419    }
  4420  };
  4421  
  4422  module.exports = HttpProvider;
  4423  
  4424  },{"./errors":26,"xhr2":86,"xmlhttprequest":17}],33:[function(require,module,exports){
  4425  /*
  4426      This file is part of web3.js.
  4427  
  4428      web3.js is free software: you can redistribute it and/or modify
  4429      it under the terms of the GNU Lesser General Public License as published by
  4430      the Free Software Foundation, either version 3 of the License, or
  4431      (at your option) any later version.
  4432  
  4433      web3.js is distributed in the hope that it will be useful,
  4434      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4435      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4436      GNU Lesser General Public License for more details.
  4437  
  4438      You should have received a copy of the GNU Lesser General Public License
  4439      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4440  */
  4441  /** 
  4442   * @file iban.js
  4443   * @author Marek Kotewicz <marek@ethdev.com>
  4444   * @date 2015
  4445   */
  4446  
  4447  var BigNumber = require('bignumber.js');
  4448  
  4449  var padLeft = function (string, bytes) {
  4450      var result = string;
  4451      while (result.length < bytes * 2) {
  4452          result = '0' + result;
  4453      }
  4454      return result;
  4455  };
  4456  
  4457  /**
  4458   * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to
  4459   * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.
  4460   *
  4461   * @method iso13616Prepare
  4462   * @param {String} iban the IBAN
  4463   * @returns {String} the prepared IBAN
  4464   */
  4465  var iso13616Prepare = function (iban) {
  4466      var A = 'A'.charCodeAt(0);
  4467      var Z = 'Z'.charCodeAt(0);
  4468  
  4469      iban = iban.toUpperCase();
  4470      iban = iban.substr(4) + iban.substr(0,4);
  4471  
  4472      return iban.split('').map(function(n){
  4473          var code = n.charCodeAt(0);
  4474          if (code >= A && code <= Z){
  4475              // A = 10, B = 11, ... Z = 35
  4476              return code - A + 10;
  4477          } else {
  4478              return n;
  4479          }
  4480      }).join('');
  4481  };
  4482  
  4483  /**
  4484   * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064.
  4485   *
  4486   * @method mod9710
  4487   * @param {String} iban
  4488   * @returns {Number}
  4489   */
  4490  var mod9710 = function (iban) {
  4491      var remainder = iban,
  4492          block;
  4493  
  4494      while (remainder.length > 2){
  4495          block = remainder.slice(0, 9);
  4496          remainder = parseInt(block, 10) % 97 + remainder.slice(block.length);
  4497      }
  4498  
  4499      return parseInt(remainder, 10) % 97;
  4500  };
  4501  
  4502  /**
  4503   * This prototype should be used to create iban object from iban correct string
  4504   *
  4505   * @param {String} iban
  4506   */
  4507  var Iban = function (iban) {
  4508      this._iban = iban;
  4509  };
  4510  
  4511  /**
  4512   * This method should be used to create iban object from ethereum address
  4513   *
  4514   * @method fromAddress
  4515   * @param {String} address
  4516   * @return {Iban} the IBAN object
  4517   */
  4518  Iban.fromAddress = function (address) {
  4519      var asBn = new BigNumber(address, 16);
  4520      var base36 = asBn.toString(36);
  4521      var padded = padLeft(base36, 15);
  4522      return Iban.fromBban(padded.toUpperCase());
  4523  };
  4524  
  4525  /**
  4526   * Convert the passed BBAN to an IBAN for this country specification.
  4527   * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>.
  4528   * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits
  4529   *
  4530   * @method fromBban
  4531   * @param {String} bban the BBAN to convert to IBAN
  4532   * @returns {Iban} the IBAN object
  4533   */
  4534  Iban.fromBban = function (bban) {
  4535      var countryCode = 'XE';
  4536  
  4537      var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban));
  4538      var checkDigit = ('0' + (98 - remainder)).slice(-2);
  4539  
  4540      return new Iban(countryCode + checkDigit + bban);
  4541  };
  4542  
  4543  /**
  4544   * Should be used to create IBAN object for given institution and identifier
  4545   *
  4546   * @method createIndirect
  4547   * @param {Object} options, required options are "institution" and "identifier"
  4548   * @return {Iban} the IBAN object
  4549   */
  4550  Iban.createIndirect = function (options) {
  4551      return Iban.fromBban('ETH' + options.institution + options.identifier);
  4552  };
  4553  
  4554  /**
  4555   * Thos method should be used to check if given string is valid iban object
  4556   *
  4557   * @method isValid
  4558   * @param {String} iban string
  4559   * @return {Boolean} true if it is valid IBAN
  4560   */
  4561  Iban.isValid = function (iban) {
  4562      var i = new Iban(iban);
  4563      return i.isValid();
  4564  };
  4565  
  4566  /**
  4567   * Should be called to check if iban is correct
  4568   *
  4569   * @method isValid
  4570   * @returns {Boolean} true if it is, otherwise false
  4571   */
  4572  Iban.prototype.isValid = function () {
  4573      return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) &&
  4574          mod9710(iso13616Prepare(this._iban)) === 1;
  4575  };
  4576  
  4577  /**
  4578   * Should be called to check if iban number is direct
  4579   *
  4580   * @method isDirect
  4581   * @returns {Boolean} true if it is, otherwise false
  4582   */
  4583  Iban.prototype.isDirect = function () {
  4584      return this._iban.length === 34 || this._iban.length === 35;
  4585  };
  4586  
  4587  /**
  4588   * Should be called to check if iban number if indirect
  4589   *
  4590   * @method isIndirect
  4591   * @returns {Boolean} true if it is, otherwise false
  4592   */
  4593  Iban.prototype.isIndirect = function () {
  4594      return this._iban.length === 20;
  4595  };
  4596  
  4597  /**
  4598   * Should be called to get iban checksum
  4599   * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003)
  4600   *
  4601   * @method checksum
  4602   * @returns {String} checksum
  4603   */
  4604  Iban.prototype.checksum = function () {
  4605      return this._iban.substr(2, 2);
  4606  };
  4607  
  4608  /**
  4609   * Should be called to get institution identifier
  4610   * eg. XREG
  4611   *
  4612   * @method institution
  4613   * @returns {String} institution identifier
  4614   */
  4615  Iban.prototype.institution = function () {
  4616      return this.isIndirect() ? this._iban.substr(7, 4) : '';
  4617  };
  4618  
  4619  /**
  4620   * Should be called to get client identifier within institution
  4621   * eg. GAVOFYORK
  4622   *
  4623   * @method client
  4624   * @returns {String} client identifier
  4625   */
  4626  Iban.prototype.client = function () {
  4627      return this.isIndirect() ? this._iban.substr(11) : '';
  4628  };
  4629  
  4630  /**
  4631   * Should be called to get client direct address
  4632   *
  4633   * @method address
  4634   * @returns {String} client direct address
  4635   */
  4636  Iban.prototype.address = function () {
  4637      if (this.isDirect()) {
  4638          var base36 = this._iban.substr(4);
  4639          var asBn = new BigNumber(base36, 36);
  4640          return padLeft(asBn.toString(16), 20);
  4641      } 
  4642  
  4643      return '';
  4644  };
  4645  
  4646  Iban.prototype.toString = function () {
  4647      return this._iban;
  4648  };
  4649  
  4650  module.exports = Iban;
  4651  
  4652  
  4653  },{"bignumber.js":"bignumber.js"}],34:[function(require,module,exports){
  4654  /*
  4655      This file is part of web3.js.
  4656  
  4657      web3.js is free software: you can redistribute it and/or modify
  4658      it under the terms of the GNU Lesser General Public License as published by
  4659      the Free Software Foundation, either version 3 of the License, or
  4660      (at your option) any later version.
  4661  
  4662      web3.js is distributed in the hope that it will be useful,
  4663      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4664      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4665      GNU Lesser General Public License for more details.
  4666  
  4667      You should have received a copy of the GNU Lesser General Public License
  4668      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4669  */
  4670  /** @file ipcprovider.js
  4671   * @authors:
  4672   *   Fabian Vogelsteller <fabian@ethdev.com>
  4673   * @date 2015
  4674   */
  4675  
  4676  "use strict";
  4677  
  4678  var utils = require('../utils/utils');
  4679  var errors = require('./errors');
  4680  
  4681  
  4682  var IpcProvider = function (path, net) {
  4683      var _this = this;
  4684      this.responseCallbacks = {};
  4685      this.path = path;
  4686      
  4687      this.connection = net.connect({path: this.path});
  4688  
  4689      this.connection.on('error', function(e){
  4690          console.error('IPC Connection Error', e);
  4691          _this._timeout();
  4692      });
  4693  
  4694      this.connection.on('end', function(){
  4695          _this._timeout();
  4696      }); 
  4697  
  4698  
  4699      // LISTEN FOR CONNECTION RESPONSES
  4700      this.connection.on('data', function(data) {
  4701          /*jshint maxcomplexity: 6 */
  4702  
  4703          _this._parseResponse(data.toString()).forEach(function(result){
  4704  
  4705              var id = null;
  4706  
  4707              // get the id which matches the returned id
  4708              if(utils.isArray(result)) {
  4709                  result.forEach(function(load){
  4710                      if(_this.responseCallbacks[load.id])
  4711                          id = load.id;
  4712                  });
  4713              } else {
  4714                  id = result.id;
  4715              }
  4716  
  4717              // fire the callback
  4718              if(_this.responseCallbacks[id]) {
  4719                  _this.responseCallbacks[id](null, result);
  4720                  delete _this.responseCallbacks[id];
  4721              }
  4722          });
  4723      });
  4724  };
  4725  
  4726  /**
  4727  Will parse the response and make an array out of it.
  4728  
  4729  @method _parseResponse
  4730  @param {String} data
  4731  */
  4732  IpcProvider.prototype._parseResponse = function(data) {
  4733      var _this = this,
  4734          returnValues = [];
  4735      
  4736      // DE-CHUNKER
  4737      var dechunkedData = data
  4738          .replace(/\}[\n\r]?\{/g,'}|--|{') // }{
  4739          .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{
  4740          .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{
  4741          .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{
  4742          .split('|--|');
  4743  
  4744      dechunkedData.forEach(function(data){
  4745  
  4746          // prepend the last chunk
  4747          if(_this.lastChunk)
  4748              data = _this.lastChunk + data;
  4749  
  4750          var result = null;
  4751  
  4752          try {
  4753              result = JSON.parse(data);
  4754  
  4755          } catch(e) {
  4756  
  4757              _this.lastChunk = data;
  4758  
  4759              // start timeout to cancel all requests
  4760              clearTimeout(_this.lastChunkTimeout);
  4761              _this.lastChunkTimeout = setTimeout(function(){
  4762                  _this._timeout();
  4763                  throw errors.InvalidResponse(data);
  4764              }, 1000 * 15);
  4765  
  4766              return;
  4767          }
  4768  
  4769          // cancel timeout and set chunk to null
  4770          clearTimeout(_this.lastChunkTimeout);
  4771          _this.lastChunk = null;
  4772  
  4773          if(result)
  4774              returnValues.push(result);
  4775      });
  4776  
  4777      return returnValues;
  4778  };
  4779  
  4780  
  4781  /**
  4782  Get the adds a callback to the responseCallbacks object,
  4783  which will be called if a response matching the response Id will arrive.
  4784  
  4785  @method _addResponseCallback
  4786  */
  4787  IpcProvider.prototype._addResponseCallback = function(payload, callback) {
  4788      var id = payload.id || payload[0].id;
  4789      var method = payload.method || payload[0].method;
  4790  
  4791      this.responseCallbacks[id] = callback;
  4792      this.responseCallbacks[id].method = method;
  4793  };
  4794  
  4795  /**
  4796  Timeout all requests when the end/error event is fired
  4797  
  4798  @method _timeout
  4799  */
  4800  IpcProvider.prototype._timeout = function() {
  4801      for(var key in this.responseCallbacks) {
  4802          if(this.responseCallbacks.hasOwnProperty(key)){
  4803              this.responseCallbacks[key](errors.InvalidConnection('on IPC'));
  4804              delete this.responseCallbacks[key];
  4805          }
  4806      }
  4807  };
  4808  
  4809  
  4810  /**
  4811  Check if the current connection is still valid.
  4812  
  4813  @method isConnected
  4814  */
  4815  IpcProvider.prototype.isConnected = function() {
  4816      var _this = this;
  4817  
  4818      // try reconnect, when connection is gone
  4819      if(!_this.connection.writable)
  4820          _this.connection.connect({path: _this.path});
  4821  
  4822      return !!this.connection.writable;
  4823  };
  4824  
  4825  IpcProvider.prototype.send = function (payload) {
  4826  
  4827      if(this.connection.writeSync) {
  4828          var result;
  4829  
  4830          // try reconnect, when connection is gone
  4831          if(!this.connection.writable)
  4832              this.connection.connect({path: this.path});
  4833  
  4834          var data = this.connection.writeSync(JSON.stringify(payload));
  4835  
  4836          try {
  4837              result = JSON.parse(data);
  4838          } catch(e) {
  4839              throw errors.InvalidResponse(data);                
  4840          }
  4841  
  4842          return result;
  4843  
  4844      } else {
  4845          throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.');
  4846      }
  4847  };
  4848  
  4849  IpcProvider.prototype.sendAsync = function (payload, callback) {
  4850      // try reconnect, when connection is gone
  4851      if(!this.connection.writable)
  4852          this.connection.connect({path: this.path});
  4853  
  4854  
  4855      this.connection.write(JSON.stringify(payload));
  4856      this._addResponseCallback(payload, callback);
  4857  };
  4858  
  4859  module.exports = IpcProvider;
  4860  
  4861  
  4862  },{"../utils/utils":20,"./errors":26}],35:[function(require,module,exports){
  4863  /*
  4864      This file is part of web3.js.
  4865  
  4866      web3.js is free software: you can redistribute it and/or modify
  4867      it under the terms of the GNU Lesser General Public License as published by
  4868      the Free Software Foundation, either version 3 of the License, or
  4869      (at your option) any later version.
  4870  
  4871      web3.js is distributed in the hope that it will be useful,
  4872      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4873      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4874      GNU Lesser General Public License for more details.
  4875  
  4876      You should have received a copy of the GNU Lesser General Public License
  4877      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4878  */
  4879  /** @file jsonrpc.js
  4880   * @authors:
  4881   *   Marek Kotewicz <marek@ethdev.com>
  4882   *   Aaron Kumavis <aaron@kumavis.me>
  4883   * @date 2015
  4884   */
  4885  
  4886  // Initialize Jsonrpc as a simple object with utility functions.
  4887  var Jsonrpc = {
  4888      messageId: 0
  4889  };
  4890  
  4891  /**
  4892   * Should be called to valid json create payload object
  4893   *
  4894   * @method toPayload
  4895   * @param {Function} method of jsonrpc call, required
  4896   * @param {Array} params, an array of method params, optional
  4897   * @returns {Object} valid jsonrpc payload object
  4898   */
  4899  Jsonrpc.toPayload = function (method, params) {
  4900      if (!method)
  4901          console.error('jsonrpc method should be specified!');
  4902  
  4903      // advance message ID
  4904      Jsonrpc.messageId++;
  4905  
  4906      return {
  4907          jsonrpc: '2.0',
  4908          id: Jsonrpc.messageId,
  4909          method: method,
  4910          params: params || []
  4911      };
  4912  };
  4913  
  4914  /**
  4915   * Should be called to check if jsonrpc response is valid
  4916   *
  4917   * @method isValidResponse
  4918   * @param {Object}
  4919   * @returns {Boolean} true if response is valid, otherwise false
  4920   */
  4921  Jsonrpc.isValidResponse = function (response) {
  4922      return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response);
  4923  
  4924      function validateSingleMessage(message){
  4925        return !!message &&
  4926          !message.error &&
  4927          message.jsonrpc === '2.0' &&
  4928          typeof message.id === 'number' &&
  4929          message.result !== undefined; // only undefined is not valid json object
  4930      }
  4931  };
  4932  
  4933  /**
  4934   * Should be called to create batch payload object
  4935   *
  4936   * @method toBatchPayload
  4937   * @param {Array} messages, an array of objects with method (required) and params (optional) fields
  4938   * @returns {Array} batch payload
  4939   */
  4940  Jsonrpc.toBatchPayload = function (messages) {
  4941      return messages.map(function (message) {
  4942          return Jsonrpc.toPayload(message.method, message.params);
  4943      });
  4944  };
  4945  
  4946  module.exports = Jsonrpc;
  4947  
  4948  
  4949  },{}],36:[function(require,module,exports){
  4950  /*
  4951      This file is part of web3.js.
  4952  
  4953      web3.js is free software: you can redistribute it and/or modify
  4954      it under the terms of the GNU Lesser General Public License as published by
  4955      the Free Software Foundation, either version 3 of the License, or
  4956      (at your option) any later version.
  4957  
  4958      web3.js is distributed in the hope that it will be useful,
  4959      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4960      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4961      GNU Lesser General Public License for more details.
  4962  
  4963      You should have received a copy of the GNU Lesser General Public License
  4964      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4965  */
  4966  /**
  4967   * @file method.js
  4968   * @author Marek Kotewicz <marek@ethdev.com>
  4969   * @date 2015
  4970   */
  4971  
  4972  var utils = require('../utils/utils');
  4973  var errors = require('./errors');
  4974  
  4975  var Method = function (options) {
  4976      this.name = options.name;
  4977      this.call = options.call;
  4978      this.params = options.params || 0;
  4979      this.inputFormatter = options.inputFormatter;
  4980      this.outputFormatter = options.outputFormatter;
  4981      this.requestManager = null;
  4982  };
  4983  
  4984  Method.prototype.setRequestManager = function (rm) {
  4985      this.requestManager = rm;
  4986  };
  4987  
  4988  /**
  4989   * Should be used to determine name of the jsonrpc method based on arguments
  4990   *
  4991   * @method getCall
  4992   * @param {Array} arguments
  4993   * @return {String} name of jsonrpc method
  4994   */
  4995  Method.prototype.getCall = function (args) {
  4996      return utils.isFunction(this.call) ? this.call(args) : this.call;
  4997  };
  4998  
  4999  /**
  5000   * Should be used to extract callback from array of arguments. Modifies input param
  5001   *
  5002   * @method extractCallback
  5003   * @param {Array} arguments
  5004   * @return {Function|Null} callback, if exists
  5005   */
  5006  Method.prototype.extractCallback = function (args) {
  5007      if (utils.isFunction(args[args.length - 1])) {
  5008          return args.pop(); // modify the args array!
  5009      }
  5010  };
  5011  
  5012  /**
  5013   * Should be called to check if the number of arguments is correct
  5014   * 
  5015   * @method validateArgs
  5016   * @param {Array} arguments
  5017   * @throws {Error} if it is not
  5018   */
  5019  Method.prototype.validateArgs = function (args) {
  5020      if (args.length !== this.params) {
  5021          throw errors.InvalidNumberOfRPCParams();
  5022      }
  5023  };
  5024  
  5025  /**
  5026   * Should be called to format input args of method
  5027   * 
  5028   * @method formatInput
  5029   * @param {Array}
  5030   * @return {Array}
  5031   */
  5032  Method.prototype.formatInput = function (args) {
  5033      if (!this.inputFormatter) {
  5034          return args;
  5035      }
  5036  
  5037      return this.inputFormatter.map(function (formatter, index) {
  5038          return formatter ? formatter(args[index]) : args[index];
  5039      });
  5040  };
  5041  
  5042  /**
  5043   * Should be called to format output(result) of method
  5044   *
  5045   * @method formatOutput
  5046   * @param {Object}
  5047   * @return {Object}
  5048   */
  5049  Method.prototype.formatOutput = function (result) {
  5050      return this.outputFormatter && result ? this.outputFormatter(result) : result;
  5051  };
  5052  
  5053  /**
  5054   * Should create payload from given input args
  5055   *
  5056   * @method toPayload
  5057   * @param {Array} args
  5058   * @return {Object}
  5059   */
  5060  Method.prototype.toPayload = function (args) {
  5061      var call = this.getCall(args);
  5062      var callback = this.extractCallback(args);
  5063      var params = this.formatInput(args);
  5064      this.validateArgs(params);
  5065  
  5066      return {
  5067          method: call,
  5068          params: params,
  5069          callback: callback
  5070      };
  5071  };
  5072  
  5073  Method.prototype.attachToObject = function (obj) {
  5074      var func = this.buildCall();
  5075      func.call = this.call; // TODO!!! that's ugly. filter.js uses it
  5076      var name = this.name.split('.');
  5077      if (name.length > 1) {
  5078          obj[name[0]] = obj[name[0]] || {};
  5079          obj[name[0]][name[1]] = func;
  5080      } else {
  5081          obj[name[0]] = func; 
  5082      }
  5083  };
  5084  
  5085  Method.prototype.buildCall = function() {
  5086      var method = this;
  5087      var send = function () {
  5088          var payload = method.toPayload(Array.prototype.slice.call(arguments));
  5089          if (payload.callback) {
  5090              return method.requestManager.sendAsync(payload, function (err, result) {
  5091                  payload.callback(err, method.formatOutput(result));
  5092              });
  5093          }
  5094          return method.formatOutput(method.requestManager.send(payload));
  5095      };
  5096      send.request = this.request.bind(this);
  5097      return send;
  5098  };
  5099  
  5100  /**
  5101   * Should be called to create pure JSONRPC request which can be used in batch request
  5102   *
  5103   * @method request
  5104   * @param {...} params
  5105   * @return {Object} jsonrpc request
  5106   */
  5107  Method.prototype.request = function () {
  5108      var payload = this.toPayload(Array.prototype.slice.call(arguments));
  5109      payload.format = this.formatOutput.bind(this);
  5110      return payload;
  5111  };
  5112  
  5113  module.exports = Method;
  5114  
  5115  },{"../utils/utils":20,"./errors":26}],37:[function(require,module,exports){
  5116  /*
  5117      This file is part of web3.js.
  5118  
  5119      web3.js is free software: you can redistribute it and/or modify
  5120      it under the terms of the GNU Lesser General Public License as published by
  5121      the Free Software Foundation, either version 3 of the License, or
  5122      (at your option) any later version.
  5123  
  5124      web3.js is distributed in the hope that it will be useful,
  5125      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5126      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5127      GNU Lesser General Public License for more details.
  5128  
  5129      You should have received a copy of the GNU Lesser General Public License
  5130      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5131  */
  5132  /** @file db.js
  5133   * @authors:
  5134   *   Marek Kotewicz <marek@ethdev.com>
  5135   * @date 2015
  5136   */
  5137  
  5138  var Method = require('../method');
  5139  
  5140  var DB = function (web3) {
  5141      this._requestManager = web3._requestManager;
  5142  
  5143      var self = this;
  5144      
  5145      methods().forEach(function(method) { 
  5146          method.attachToObject(self);
  5147          method.setRequestManager(web3._requestManager);
  5148      });
  5149  };
  5150  
  5151  var methods = function () {
  5152      var putString = new Method({
  5153          name: 'putString',
  5154          call: 'db_putString',
  5155          params: 3
  5156      });
  5157  
  5158      var getString = new Method({
  5159          name: 'getString',
  5160          call: 'db_getString',
  5161          params: 2
  5162      });
  5163  
  5164      var putHex = new Method({
  5165          name: 'putHex',
  5166          call: 'db_putHex',
  5167          params: 3
  5168      });
  5169  
  5170      var getHex = new Method({
  5171          name: 'getHex',
  5172          call: 'db_getHex',
  5173          params: 2
  5174      });
  5175  
  5176      return [
  5177          putString, getString, putHex, getHex
  5178      ];
  5179  };
  5180  
  5181  module.exports = DB;
  5182  
  5183  },{"../method":36}],38:[function(require,module,exports){
  5184  /*
  5185      This file is part of web3.js.
  5186  
  5187      web3.js is free software: you can redistribute it and/or modify
  5188      it under the terms of the GNU Lesser General Public License as published by
  5189      the Free Software Foundation, either version 3 of the License, or
  5190      (at your option) any later version.
  5191  
  5192      web3.js is distributed in the hope that it will be useful,
  5193      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5194      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5195      GNU Lesser General Public License for more details.
  5196  
  5197      You should have received a copy of the GNU Lesser General Public License
  5198      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5199  */
  5200  /**
  5201   * @file eth.js
  5202   * @author Marek Kotewicz <marek@ethdev.com>
  5203   * @author Fabian Vogelsteller <fabian@ethdev.com>
  5204   * @date 2015
  5205   */
  5206  
  5207  "use strict";
  5208  
  5209  var formatters = require('../formatters');
  5210  var utils = require('../../utils/utils');
  5211  var Method = require('../method');
  5212  var Property = require('../property');
  5213  var c = require('../../utils/config');
  5214  var Contract = require('../contract');
  5215  var watches = require('./watches');
  5216  var Filter = require('../filter');
  5217  var IsSyncing = require('../syncing');
  5218  var namereg = require('../namereg');
  5219  var Iban = require('../iban');
  5220  var transfer = require('../transfer');
  5221  
  5222  var blockCall = function (args) {
  5223      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber";
  5224  };
  5225  
  5226  var transactionFromBlockCall = function (args) {
  5227      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex';
  5228  };
  5229  
  5230  var uncleCall = function (args) {
  5231      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex';
  5232  };
  5233  
  5234  var getBlockTransactionCountCall = function (args) {
  5235      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber';
  5236  };
  5237  
  5238  var uncleCountCall = function (args) {
  5239      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber';
  5240  };
  5241  
  5242  function Eth(web3) {
  5243      this._requestManager = web3._requestManager;
  5244  
  5245      var self = this;
  5246  
  5247      methods().forEach(function(method) {
  5248          method.attachToObject(self);
  5249          method.setRequestManager(self._requestManager);
  5250      });
  5251  
  5252      properties().forEach(function(p) {
  5253          p.attachToObject(self);
  5254          p.setRequestManager(self._requestManager);
  5255      });
  5256  
  5257  
  5258      this.iban = Iban;
  5259      this.sendIBANTransaction = transfer.bind(null, this);
  5260  }
  5261  
  5262  Object.defineProperty(Eth.prototype, 'defaultBlock', {
  5263      get: function () {
  5264          return c.defaultBlock;
  5265      },
  5266      set: function (val) {
  5267          c.defaultBlock = val;
  5268          return val;
  5269      }
  5270  });
  5271  
  5272  Object.defineProperty(Eth.prototype, 'defaultAccount', {
  5273      get: function () {
  5274          return c.defaultAccount;
  5275      },
  5276      set: function (val) {
  5277          c.defaultAccount = val;
  5278          return val;
  5279      }
  5280  });
  5281  
  5282  var methods = function () {
  5283      var getBalance = new Method({
  5284          name: 'getBalance',
  5285          call: 'eth_getBalance',
  5286          params: 2,
  5287          inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter],
  5288          outputFormatter: formatters.outputBigNumberFormatter
  5289      });
  5290  
  5291      var getStorageAt = new Method({
  5292          name: 'getStorageAt',
  5293          call: 'eth_getStorageAt',
  5294          params: 3,
  5295          inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter]
  5296      });
  5297  
  5298      var getCode = new Method({
  5299          name: 'getCode',
  5300          call: 'eth_getCode',
  5301          params: 2,
  5302          inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter]
  5303      });
  5304  
  5305      var getBlock = new Method({
  5306          name: 'getBlock',
  5307          call: blockCall,
  5308          params: 2,
  5309          inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }],
  5310          outputFormatter: formatters.outputBlockFormatter
  5311      });
  5312  
  5313      var getUncle = new Method({
  5314          name: 'getUncle',
  5315          call: uncleCall,
  5316          params: 2,
  5317          inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
  5318          outputFormatter: formatters.outputBlockFormatter,
  5319  
  5320      });
  5321  
  5322      var getCompilers = new Method({
  5323          name: 'getCompilers',
  5324          call: 'eth_getCompilers',
  5325          params: 0
  5326      });
  5327  
  5328      var getBlockTransactionCount = new Method({
  5329          name: 'getBlockTransactionCount',
  5330          call: getBlockTransactionCountCall,
  5331          params: 1,
  5332          inputFormatter: [formatters.inputBlockNumberFormatter],
  5333          outputFormatter: utils.toDecimal
  5334      });
  5335  
  5336      var getBlockUncleCount = new Method({
  5337          name: 'getBlockUncleCount',
  5338          call: uncleCountCall,
  5339          params: 1,
  5340          inputFormatter: [formatters.inputBlockNumberFormatter],
  5341          outputFormatter: utils.toDecimal
  5342      });
  5343  
  5344      var getTransaction = new Method({
  5345          name: 'getTransaction',
  5346          call: 'eth_getTransactionByHash',
  5347          params: 1,
  5348          outputFormatter: formatters.outputTransactionFormatter
  5349      });
  5350  
  5351      var getTransactionFromBlock = new Method({
  5352          name: 'getTransactionFromBlock',
  5353          call: transactionFromBlockCall,
  5354          params: 2,
  5355          inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
  5356          outputFormatter: formatters.outputTransactionFormatter
  5357      });
  5358  
  5359      var getTransactionReceipt = new Method({
  5360          name: 'getTransactionReceipt',
  5361          call: 'eth_getTransactionReceipt',
  5362          params: 1,
  5363          outputFormatter: formatters.outputTransactionReceiptFormatter
  5364      });
  5365  
  5366      var getTransactionCount = new Method({
  5367          name: 'getTransactionCount',
  5368          call: 'eth_getTransactionCount',
  5369          params: 2,
  5370          inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter],
  5371          outputFormatter: utils.toDecimal
  5372      });
  5373  
  5374      var sendRawTransaction = new Method({
  5375          name: 'sendRawTransaction',
  5376          call: 'eth_sendRawTransaction',
  5377          params: 1,
  5378          inputFormatter: [null]
  5379      });
  5380  
  5381      var sendTransaction = new Method({
  5382          name: 'sendTransaction',
  5383          call: 'eth_sendTransaction',
  5384          params: 1,
  5385          inputFormatter: [formatters.inputTransactionFormatter]
  5386      });
  5387  
  5388      var signTransaction = new Method({
  5389          name: 'signTransaction',
  5390          call: 'eth_signTransaction',
  5391          params: 1,
  5392          inputFormatter: [formatters.inputTransactionFormatter]
  5393      });
  5394  
  5395      var sign = new Method({
  5396          name: 'sign',
  5397          call: 'eth_sign',
  5398          params: 2,
  5399          inputFormatter: [formatters.inputAddressFormatter, null]
  5400      });
  5401  
  5402      var call = new Method({
  5403          name: 'call',
  5404          call: 'eth_call',
  5405          params: 2,
  5406          inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter]
  5407      });
  5408  
  5409      var estimateGas = new Method({
  5410          name: 'estimateGas',
  5411          call: 'eth_estimateGas',
  5412          params: 1,
  5413          inputFormatter: [formatters.inputCallFormatter],
  5414          outputFormatter: utils.toDecimal
  5415      });
  5416  
  5417      var compileSolidity = new Method({
  5418          name: 'compile.solidity',
  5419          call: 'eth_compileSolidity',
  5420          params: 1
  5421      });
  5422  
  5423      var compileLLL = new Method({
  5424          name: 'compile.lll',
  5425          call: 'eth_compileLLL',
  5426          params: 1
  5427      });
  5428  
  5429      var compileSerpent = new Method({
  5430          name: 'compile.serpent',
  5431          call: 'eth_compileSerpent',
  5432          params: 1
  5433      });
  5434  
  5435      var submitWork = new Method({
  5436          name: 'submitWork',
  5437          call: 'eth_submitWork',
  5438          params: 3
  5439      });
  5440  
  5441      var getWork = new Method({
  5442          name: 'getWork',
  5443          call: 'eth_getWork',
  5444          params: 0
  5445      });
  5446  
  5447      return [
  5448          getBalance,
  5449          getStorageAt,
  5450          getCode,
  5451          getBlock,
  5452          getUncle,
  5453          getCompilers,
  5454          getBlockTransactionCount,
  5455          getBlockUncleCount,
  5456          getTransaction,
  5457          getTransactionFromBlock,
  5458          getTransactionReceipt,
  5459          getTransactionCount,
  5460          call,
  5461          estimateGas,
  5462          sendRawTransaction,
  5463          signTransaction,
  5464          sendTransaction,
  5465          sign,
  5466          compileSolidity,
  5467          compileLLL,
  5468          compileSerpent,
  5469          submitWork,
  5470          getWork
  5471      ];
  5472  };
  5473  
  5474  
  5475  var properties = function () {
  5476      return [
  5477          new Property({
  5478              name: 'coinbase',
  5479              getter: 'eth_coinbase'
  5480          }),
  5481          new Property({
  5482              name: 'mining',
  5483              getter: 'eth_mining'
  5484          }),
  5485          new Property({
  5486              name: 'hashrate',
  5487              getter: 'eth_hashrate',
  5488              outputFormatter: utils.toDecimal
  5489          }),
  5490          new Property({
  5491              name: 'syncing',
  5492              getter: 'eth_syncing',
  5493              outputFormatter: formatters.outputSyncingFormatter
  5494          }),
  5495          new Property({
  5496              name: 'gasPrice',
  5497              getter: 'eth_gasPrice',
  5498              outputFormatter: formatters.outputBigNumberFormatter
  5499          }),
  5500          new Property({
  5501              name: 'accounts',
  5502              getter: 'eth_accounts'
  5503          }),
  5504          new Property({
  5505              name: 'blockNumber',
  5506              getter: 'eth_blockNumber',
  5507              outputFormatter: utils.toDecimal
  5508          }),
  5509          new Property({
  5510              name: 'protocolVersion',
  5511              getter: 'eth_protocolVersion'
  5512          })
  5513      ];
  5514  };
  5515  
  5516  Eth.prototype.contract = function (abi) {
  5517      var factory = new Contract(this, abi);
  5518      return factory;
  5519  };
  5520  
  5521  Eth.prototype.filter = function (options, callback, filterCreationErrorCallback) {
  5522      return new Filter(options, 'eth', this._requestManager, watches.eth(), formatters.outputLogFormatter, callback, filterCreationErrorCallback);
  5523  };
  5524  
  5525  Eth.prototype.namereg = function () {
  5526      return this.contract(namereg.global.abi).at(namereg.global.address);
  5527  };
  5528  
  5529  Eth.prototype.icapNamereg = function () {
  5530      return this.contract(namereg.icap.abi).at(namereg.icap.address);
  5531  };
  5532  
  5533  Eth.prototype.isSyncing = function (callback) {
  5534      return new IsSyncing(this._requestManager, callback);
  5535  };
  5536  
  5537  module.exports = Eth;
  5538  
  5539  },{"../../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){
  5540  /*
  5541      This file is part of web3.js.
  5542  
  5543      web3.js is free software: you can redistribute it and/or modify
  5544      it under the terms of the GNU Lesser General Public License as published by
  5545      the Free Software Foundation, either version 3 of the License, or
  5546      (at your option) any later version.
  5547  
  5548      web3.js is distributed in the hope that it will be useful,
  5549      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5550      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5551      GNU Lesser General Public License for more details.
  5552  
  5553      You should have received a copy of the GNU Lesser General Public License
  5554      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5555  */
  5556  /** @file eth.js
  5557   * @authors:
  5558   *   Marek Kotewicz <marek@ethdev.com>
  5559   * @date 2015
  5560   */
  5561  
  5562  var utils = require('../../utils/utils');
  5563  var Property = require('../property');
  5564  
  5565  var Net = function (web3) {
  5566      this._requestManager = web3._requestManager;
  5567  
  5568      var self = this;
  5569  
  5570      properties().forEach(function(p) { 
  5571          p.attachToObject(self);
  5572          p.setRequestManager(web3._requestManager);
  5573      });
  5574  };
  5575  
  5576  /// @returns an array of objects describing web3.eth api properties
  5577  var properties = function () {
  5578      return [
  5579          new Property({
  5580              name: 'listening',
  5581              getter: 'net_listening'
  5582          }),
  5583          new Property({
  5584              name: 'peerCount',
  5585              getter: 'net_peerCount',
  5586              outputFormatter: utils.toDecimal
  5587          })
  5588      ];
  5589  };
  5590  
  5591  module.exports = Net;
  5592  
  5593  },{"../../utils/utils":20,"../property":45}],40:[function(require,module,exports){
  5594  /*
  5595      This file is part of web3.js.
  5596  
  5597      web3.js is free software: you can redistribute it and/or modify
  5598      it under the terms of the GNU Lesser General Public License as published by
  5599      the Free Software Foundation, either version 3 of the License, or
  5600      (at your option) any later version.
  5601  
  5602      web3.js is distributed in the hope that it will be useful,
  5603      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5604      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5605      GNU Lesser General Public License for more details.
  5606  
  5607      You should have received a copy of the GNU Lesser General Public License
  5608      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5609  */
  5610  /**
  5611   * @file eth.js
  5612   * @author Marek Kotewicz <marek@ethdev.com>
  5613   * @author Fabian Vogelsteller <fabian@ethdev.com>
  5614   * @date 2015
  5615   */
  5616  
  5617  "use strict";
  5618  
  5619  var Method = require('../method');
  5620  var Property = require('../property');
  5621  var formatters = require('../formatters');
  5622  
  5623  function Personal(web3) {
  5624      this._requestManager = web3._requestManager;
  5625  
  5626      var self = this;
  5627  
  5628      methods().forEach(function(method) {
  5629          method.attachToObject(self);
  5630          method.setRequestManager(self._requestManager);
  5631      });
  5632  
  5633      properties().forEach(function(p) {
  5634          p.attachToObject(self);
  5635          p.setRequestManager(self._requestManager);
  5636      });
  5637  }
  5638  
  5639  var methods = function () {
  5640      var newAccount = new Method({
  5641          name: 'newAccount',
  5642          call: 'personal_newAccount',
  5643          params: 1,
  5644          inputFormatter: [null]
  5645      });
  5646  
  5647      var importRawKey = new Method({
  5648          name: 'importRawKey',
  5649  		call: 'personal_importRawKey',
  5650  		params: 2
  5651      });
  5652  
  5653      var sign = new Method({
  5654          name: 'sign',
  5655  		call: 'personal_sign',
  5656  		params: 3,
  5657  		inputFormatter: [null, formatters.inputAddressFormatter, null]
  5658      });
  5659  
  5660      var ecRecover = new Method({
  5661          name: 'ecRecover',
  5662  		call: 'personal_ecRecover',
  5663  		params: 2
  5664      });
  5665  
  5666      var unlockAccount = new Method({
  5667          name: 'unlockAccount',
  5668          call: 'personal_unlockAccount',
  5669          params: 3,
  5670          inputFormatter: [formatters.inputAddressFormatter, null, null]
  5671      });
  5672  
  5673      var sendTransaction = new Method({
  5674          name: 'sendTransaction',
  5675          call: 'personal_sendTransaction',
  5676          params: 2,
  5677          inputFormatter: [formatters.inputTransactionFormatter, null]
  5678      });
  5679  
  5680      var lockAccount = new Method({
  5681          name: 'lockAccount',
  5682          call: 'personal_lockAccount',
  5683          params: 1,
  5684          inputFormatter: [formatters.inputAddressFormatter]
  5685      });
  5686  
  5687      return [
  5688          newAccount,
  5689          importRawKey,
  5690          unlockAccount,
  5691          ecRecover,
  5692          sign,
  5693          sendTransaction,
  5694          lockAccount
  5695      ];
  5696  };
  5697  
  5698  var properties = function () {
  5699      return [
  5700          new Property({
  5701              name: 'listAccounts',
  5702              getter: 'personal_listAccounts'
  5703          })
  5704      ];
  5705  };
  5706  
  5707  
  5708  module.exports = Personal;
  5709  
  5710  },{"../formatters":30,"../method":36,"../property":45}],41:[function(require,module,exports){
  5711  /*
  5712      This file is part of web3.js.
  5713  
  5714      web3.js is free software: you can redistribute it and/or modify
  5715      it under the terms of the GNU Lesser General Public License as published by
  5716      the Free Software Foundation, either version 3 of the License, or
  5717      (at your option) any later version.
  5718  
  5719      web3.js is distributed in the hope that it will be useful,
  5720      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5721      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5722      GNU Lesser General Public License for more details.
  5723  
  5724      You should have received a copy of the GNU Lesser General Public License
  5725      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5726  */
  5727  /** @file shh.js
  5728   * @authors:
  5729   *   Fabian Vogelsteller <fabian@ethereum.org>
  5730   *   Marek Kotewicz <marek@ethcore.io>
  5731   * @date 2017
  5732   */
  5733  
  5734  var Method = require('../method');
  5735  var Filter = require('../filter');
  5736  var watches = require('./watches');
  5737  
  5738  var Shh = function (web3) {
  5739      this._requestManager = web3._requestManager;
  5740  
  5741      var self = this;
  5742  
  5743      methods().forEach(function(method) {
  5744          method.attachToObject(self);
  5745          method.setRequestManager(self._requestManager);
  5746      });
  5747  };
  5748  
  5749  Shh.prototype.newMessageFilter = function (options, callback, filterCreationErrorCallback) {
  5750      return new Filter(options, 'shh', this._requestManager, watches.shh(), null, callback, filterCreationErrorCallback);
  5751  };
  5752  
  5753  var methods = function () {
  5754  
  5755      return [
  5756          new Method({
  5757              name: 'version',
  5758              call: 'shh_version',
  5759              params: 0
  5760          }),
  5761          new Method({
  5762              name: 'info',
  5763              call: 'shh_info',
  5764              params: 0
  5765          }),
  5766          new Method({
  5767              name: 'setMaxMessageSize',
  5768              call: 'shh_setMaxMessageSize',
  5769              params: 1
  5770          }),
  5771          new Method({
  5772              name: 'setMinPoW',
  5773              call: 'shh_setMinPoW',
  5774              params: 1
  5775          }),
  5776          new Method({
  5777              name: 'markTrustedPeer',
  5778              call: 'shh_markTrustedPeer',
  5779              params: 1
  5780          }),
  5781          new Method({
  5782              name: 'newKeyPair',
  5783              call: 'shh_newKeyPair',
  5784              params: 0
  5785          }),
  5786          new Method({
  5787              name: 'addPrivateKey',
  5788              call: 'shh_addPrivateKey',
  5789              params: 1
  5790          }),
  5791          new Method({
  5792              name: 'deleteKeyPair',
  5793              call: 'shh_deleteKeyPair',
  5794              params: 1
  5795          }),
  5796          new Method({
  5797              name: 'hasKeyPair',
  5798              call: 'shh_hasKeyPair',
  5799              params: 1
  5800          }),
  5801          new Method({
  5802              name: 'getPublicKey',
  5803              call: 'shh_getPublicKey',
  5804              params: 1
  5805          }),
  5806          new Method({
  5807              name: 'getPrivateKey',
  5808              call: 'shh_getPrivateKey',
  5809              params: 1
  5810          }),
  5811          new Method({
  5812              name: 'newSymKey',
  5813              call: 'shh_newSymKey',
  5814              params: 0
  5815          }),
  5816          new Method({
  5817              name: 'addSymKey',
  5818              call: 'shh_addSymKey',
  5819              params: 1
  5820          }),
  5821          new Method({
  5822              name: 'generateSymKeyFromPassword',
  5823              call: 'shh_generateSymKeyFromPassword',
  5824              params: 1
  5825          }),
  5826          new Method({
  5827              name: 'hasSymKey',
  5828              call: 'shh_hasSymKey',
  5829              params: 1
  5830          }),
  5831          new Method({
  5832              name: 'getSymKey',
  5833              call: 'shh_getSymKey',
  5834              params: 1
  5835          }),
  5836          new Method({
  5837              name: 'deleteSymKey',
  5838              call: 'shh_deleteSymKey',
  5839              params: 1
  5840          }),
  5841  
  5842          // subscribe and unsubscribe missing
  5843  
  5844          new Method({
  5845              name: 'post',
  5846              call: 'shh_post',
  5847              params: 1,
  5848              inputFormatter: [null]
  5849          })
  5850      ];
  5851  };
  5852  
  5853  module.exports = Shh;
  5854  
  5855  
  5856  },{"../filter":29,"../method":36,"./watches":43}],42:[function(require,module,exports){
  5857  /*
  5858      This file is part of web3.js.
  5859  
  5860      web3.js is free software: you can redistribute it and/or modify
  5861      it under the terms of the GNU Lesser General Public License as published by
  5862      the Free Software Foundation, either version 3 of the License, or
  5863      (at your option) any later version.
  5864  
  5865      web3.js is distributed in the hope that it will be useful,
  5866      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5867      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5868      GNU Lesser General Public License for more details.
  5869  
  5870      You should have received a copy of the GNU Lesser General Public License
  5871      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5872  */
  5873  /**
  5874   * @file bzz.js
  5875   * @author Alex Beregszaszi <alex@rtfs.hu>
  5876   * @date 2016
  5877   *
  5878   * Reference: https://github.com/scroll-tech/go-ethereum/blob/swarm/internal/web3ext/web3ext.go#L33
  5879   */
  5880  
  5881  "use strict";
  5882  
  5883  var Method = require('../method');
  5884  var Property = require('../property');
  5885  
  5886  function Swarm(web3) {
  5887      this._requestManager = web3._requestManager;
  5888  
  5889      var self = this;
  5890  
  5891      methods().forEach(function(method) {
  5892          method.attachToObject(self);
  5893          method.setRequestManager(self._requestManager);
  5894      });
  5895  
  5896      properties().forEach(function(p) {
  5897          p.attachToObject(self);
  5898          p.setRequestManager(self._requestManager);
  5899      });
  5900  }
  5901  
  5902  var methods = function () {
  5903      var blockNetworkRead = new Method({
  5904          name: 'blockNetworkRead',
  5905          call: 'bzz_blockNetworkRead',
  5906          params: 1,
  5907          inputFormatter: [null]
  5908      });
  5909  
  5910      var syncEnabled = new Method({
  5911          name: 'syncEnabled',
  5912          call: 'bzz_syncEnabled',
  5913          params: 1,
  5914          inputFormatter: [null]
  5915      });
  5916  
  5917      var swapEnabled = new Method({
  5918          name: 'swapEnabled',
  5919          call: 'bzz_swapEnabled',
  5920          params: 1,
  5921          inputFormatter: [null]
  5922      });
  5923  
  5924      var download = new Method({
  5925          name: 'download',
  5926          call: 'bzz_download',
  5927          params: 2,
  5928          inputFormatter: [null, null]
  5929      });
  5930  
  5931      var upload = new Method({
  5932          name: 'upload',
  5933          call: 'bzz_upload',
  5934          params: 2,
  5935          inputFormatter: [null, null]
  5936      });
  5937  
  5938      var retrieve = new Method({
  5939          name: 'retrieve',
  5940          call: 'bzz_retrieve',
  5941          params: 1,
  5942          inputFormatter: [null]
  5943      });
  5944  
  5945      var store = new Method({
  5946          name: 'store',
  5947          call: 'bzz_store',
  5948          params: 2,
  5949          inputFormatter: [null, null]
  5950      });
  5951  
  5952      var get = new Method({
  5953          name: 'get',
  5954          call: 'bzz_get',
  5955          params: 1,
  5956          inputFormatter: [null]
  5957      });
  5958  
  5959      var put = new Method({
  5960          name: 'put',
  5961          call: 'bzz_put',
  5962          params: 2,
  5963          inputFormatter: [null, null]
  5964      });
  5965  
  5966      var modify = new Method({
  5967          name: 'modify',
  5968          call: 'bzz_modify',
  5969          params: 4,
  5970          inputFormatter: [null, null, null, null]
  5971      });
  5972  
  5973      return [
  5974          blockNetworkRead,
  5975          syncEnabled,
  5976          swapEnabled,
  5977          download,
  5978          upload,
  5979          retrieve,
  5980          store,
  5981          get,
  5982          put,
  5983          modify
  5984      ];
  5985  };
  5986  
  5987  var properties = function () {
  5988      return [
  5989          new Property({
  5990              name: 'hive',
  5991              getter: 'bzz_hive'
  5992          }),
  5993          new Property({
  5994              name: 'info',
  5995              getter: 'bzz_info'
  5996          })
  5997      ];
  5998  };
  5999  
  6000  
  6001  module.exports = Swarm;
  6002  
  6003  },{"../method":36,"../property":45}],43:[function(require,module,exports){
  6004  /*
  6005      This file is part of web3.js.
  6006  
  6007      web3.js is free software: you can redistribute it and/or modify
  6008      it under the terms of the GNU Lesser General Public License as published by
  6009      the Free Software Foundation, either version 3 of the License, or
  6010      (at your option) any later version.
  6011  
  6012      web3.js is distributed in the hope that it will be useful,
  6013      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6014      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6015      GNU Lesser General Public License for more details.
  6016  
  6017      You should have received a copy of the GNU Lesser General Public License
  6018      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6019  */
  6020  /** @file watches.js
  6021   * @authors:
  6022   *   Marek Kotewicz <marek@ethdev.com>
  6023   * @date 2015
  6024   */
  6025  
  6026  var Method = require('../method');
  6027  
  6028  /// @returns an array of objects describing web3.eth.filter api methods
  6029  var eth = function () {
  6030      var newFilterCall = function (args) {
  6031          var type = args[0];
  6032  
  6033          switch(type) {
  6034              case 'latest':
  6035                  args.shift();
  6036                  this.params = 0;
  6037                  return 'eth_newBlockFilter';
  6038              case 'pending':
  6039                  args.shift();
  6040                  this.params = 0;
  6041                  return 'eth_newPendingTransactionFilter';
  6042              default:
  6043                  return 'eth_newFilter';
  6044          }
  6045      };
  6046  
  6047      var newFilter = new Method({
  6048          name: 'newFilter',
  6049          call: newFilterCall,
  6050          params: 1
  6051      });
  6052  
  6053      var uninstallFilter = new Method({
  6054          name: 'uninstallFilter',
  6055          call: 'eth_uninstallFilter',
  6056          params: 1
  6057      });
  6058  
  6059      var getLogs = new Method({
  6060          name: 'getLogs',
  6061          call: 'eth_getFilterLogs',
  6062          params: 1
  6063      });
  6064  
  6065      var poll = new Method({
  6066          name: 'poll',
  6067          call: 'eth_getFilterChanges',
  6068          params: 1
  6069      });
  6070  
  6071      return [
  6072          newFilter,
  6073          uninstallFilter,
  6074          getLogs,
  6075          poll
  6076      ];
  6077  };
  6078  
  6079  /// @returns an array of objects describing web3.shh.watch api methods
  6080  var shh = function () {
  6081  
  6082      return [
  6083          new Method({
  6084              name: 'newFilter',
  6085              call: 'shh_newMessageFilter',
  6086              params: 1
  6087          }),
  6088          new Method({
  6089              name: 'uninstallFilter',
  6090              call: 'shh_deleteMessageFilter',
  6091              params: 1
  6092          }),
  6093          new Method({
  6094              name: 'getLogs',
  6095              call: 'shh_getFilterMessages',
  6096              params: 1
  6097          }),
  6098          new Method({
  6099              name: 'poll',
  6100              call: 'shh_getFilterMessages',
  6101              params: 1
  6102          })
  6103      ];
  6104  };
  6105  
  6106  module.exports = {
  6107      eth: eth,
  6108      shh: shh
  6109  };
  6110  
  6111  
  6112  },{"../method":36}],44:[function(require,module,exports){
  6113  /*
  6114      This file is part of web3.js.
  6115  
  6116      web3.js is free software: you can redistribute it and/or modify
  6117      it under the terms of the GNU Lesser General Public License as published by
  6118      the Free Software Foundation, either version 3 of the License, or
  6119      (at your option) any later version.
  6120  
  6121      web3.js is distributed in the hope that it will be useful,
  6122      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6123      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6124      GNU Lesser General Public License for more details.
  6125  
  6126      You should have received a copy of the GNU Lesser General Public License
  6127      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6128  */
  6129  /** 
  6130   * @file namereg.js
  6131   * @author Marek Kotewicz <marek@ethdev.com>
  6132   * @date 2015
  6133   */
  6134  
  6135  var globalRegistrarAbi = require('../contracts/GlobalRegistrar.json');
  6136  var icapRegistrarAbi= require('../contracts/ICAPRegistrar.json');
  6137  
  6138  var globalNameregAddress = '0xc6d9d2cd449a754c494264e1809c50e34d64562b';
  6139  var icapNameregAddress = '0xa1a111bc074c9cfa781f0c38e63bd51c91b8af00';
  6140  
  6141  module.exports = {
  6142      global: {
  6143          abi: globalRegistrarAbi,
  6144          address: globalNameregAddress
  6145      },
  6146      icap: {
  6147          abi: icapRegistrarAbi,
  6148          address: icapNameregAddress
  6149      }
  6150  };
  6151  
  6152  
  6153  },{"../contracts/GlobalRegistrar.json":1,"../contracts/ICAPRegistrar.json":2}],45:[function(require,module,exports){
  6154  /*
  6155      This file is part of web3.js.
  6156  
  6157      web3.js is free software: you can redistribute it and/or modify
  6158      it under the terms of the GNU Lesser General Public License as published by
  6159      the Free Software Foundation, either version 3 of the License, or
  6160      (at your option) any later version.
  6161  
  6162      web3.js is distributed in the hope that it will be useful,
  6163      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6164      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6165      GNU Lesser General Public License for more details.
  6166  
  6167      You should have received a copy of the GNU Lesser General Public License
  6168      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6169  */
  6170  /**
  6171   * @file property.js
  6172   * @author Fabian Vogelsteller <fabian@frozeman.de>
  6173   * @author Marek Kotewicz <marek@ethdev.com>
  6174   * @date 2015
  6175   */
  6176  
  6177  var utils = require('../utils/utils');
  6178  
  6179  var Property = function (options) {
  6180      this.name = options.name;
  6181      this.getter = options.getter;
  6182      this.setter = options.setter;
  6183      this.outputFormatter = options.outputFormatter;
  6184      this.inputFormatter = options.inputFormatter;
  6185      this.requestManager = null;
  6186  };
  6187  
  6188  Property.prototype.setRequestManager = function (rm) {
  6189      this.requestManager = rm;
  6190  };
  6191  
  6192  /**
  6193   * Should be called to format input args of method
  6194   *
  6195   * @method formatInput
  6196   * @param {Array}
  6197   * @return {Array}
  6198   */
  6199  Property.prototype.formatInput = function (arg) {
  6200      return this.inputFormatter ? this.inputFormatter(arg) : arg;
  6201  };
  6202  
  6203  /**
  6204   * Should be called to format output(result) of method
  6205   *
  6206   * @method formatOutput
  6207   * @param {Object}
  6208   * @return {Object}
  6209   */
  6210  Property.prototype.formatOutput = function (result) {
  6211      return this.outputFormatter && result !== null && result !== undefined ? this.outputFormatter(result) : result;
  6212  };
  6213  
  6214  /**
  6215   * Should be used to extract callback from array of arguments. Modifies input param
  6216   *
  6217   * @method extractCallback
  6218   * @param {Array} arguments
  6219   * @return {Function|Null} callback, if exists
  6220   */
  6221  Property.prototype.extractCallback = function (args) {
  6222      if (utils.isFunction(args[args.length - 1])) {
  6223          return args.pop(); // modify the args array!
  6224      }
  6225  };
  6226  
  6227  
  6228  /**
  6229   * Should attach function to method
  6230   *
  6231   * @method attachToObject
  6232   * @param {Object}
  6233   * @param {Function}
  6234   */
  6235  Property.prototype.attachToObject = function (obj) {
  6236      var proto = {
  6237          get: this.buildGet(),
  6238          enumerable: true
  6239      };
  6240  
  6241      var names = this.name.split('.');
  6242      var name = names[0];
  6243      if (names.length > 1) {
  6244          obj[names[0]] = obj[names[0]] || {};
  6245          obj = obj[names[0]];
  6246          name = names[1];
  6247      }
  6248  
  6249      Object.defineProperty(obj, name, proto);
  6250      obj[asyncGetterName(name)] = this.buildAsyncGet();
  6251  };
  6252  
  6253  var asyncGetterName = function (name) {
  6254      return 'get' + name.charAt(0).toUpperCase() + name.slice(1);
  6255  };
  6256  
  6257  Property.prototype.buildGet = function () {
  6258      var property = this;
  6259      return function get() {
  6260          return property.formatOutput(property.requestManager.send({
  6261              method: property.getter
  6262          }));
  6263      };
  6264  };
  6265  
  6266  Property.prototype.buildAsyncGet = function () {
  6267      var property = this;
  6268      var get = function (callback) {
  6269          property.requestManager.sendAsync({
  6270              method: property.getter
  6271          }, function (err, result) {
  6272              callback(err, property.formatOutput(result));
  6273          });
  6274      };
  6275      get.request = this.request.bind(this);
  6276      return get;
  6277  };
  6278  
  6279  /**
  6280   * Should be called to create pure JSONRPC request which can be used in batch request
  6281   *
  6282   * @method request
  6283   * @param {...} params
  6284   * @return {Object} jsonrpc request
  6285   */
  6286  Property.prototype.request = function () {
  6287      var payload = {
  6288          method: this.getter,
  6289          params: [],
  6290          callback: this.extractCallback(Array.prototype.slice.call(arguments))
  6291      };
  6292      payload.format = this.formatOutput.bind(this);
  6293      return payload;
  6294  };
  6295  
  6296  module.exports = Property;
  6297  
  6298  
  6299  },{"../utils/utils":20}],46:[function(require,module,exports){
  6300  /*
  6301      This file is part of web3.js.
  6302  
  6303      web3.js is free software: you can redistribute it and/or modify
  6304      it under the terms of the GNU Lesser General Public License as published by
  6305      the Free Software Foundation, either version 3 of the License, or
  6306      (at your option) any later version.
  6307  
  6308      web3.js is distributed in the hope that it will be useful,
  6309      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6310      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6311      GNU Lesser General Public License for more details.
  6312  
  6313      You should have received a copy of the GNU Lesser General Public License
  6314      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6315  */
  6316  /** 
  6317   * @file requestmanager.js
  6318   * @author Jeffrey Wilcke <jeff@ethdev.com>
  6319   * @author Marek Kotewicz <marek@ethdev.com>
  6320   * @author Marian Oancea <marian@ethdev.com>
  6321   * @author Fabian Vogelsteller <fabian@ethdev.com>
  6322   * @author Gav Wood <g@ethdev.com>
  6323   * @date 2014
  6324   */
  6325  
  6326  var Jsonrpc = require('./jsonrpc');
  6327  var utils = require('../utils/utils');
  6328  var c = require('../utils/config');
  6329  var errors = require('./errors');
  6330  
  6331  /**
  6332   * It's responsible for passing messages to providers
  6333   * It's also responsible for polling the ethereum node for incoming messages
  6334   * Default poll timeout is 1 second
  6335   * Singleton
  6336   */
  6337  var RequestManager = function (provider) {
  6338      this.provider = provider;
  6339      this.polls = {};
  6340      this.timeout = null;
  6341  };
  6342  
  6343  /**
  6344   * Should be used to synchronously send request
  6345   *
  6346   * @method send
  6347   * @param {Object} data
  6348   * @return {Object}
  6349   */
  6350  RequestManager.prototype.send = function (data) {
  6351      if (!this.provider) {
  6352          console.error(errors.InvalidProvider());
  6353          return null;
  6354      }
  6355  
  6356      var payload = Jsonrpc.toPayload(data.method, data.params);
  6357      var result = this.provider.send(payload);
  6358  
  6359      if (!Jsonrpc.isValidResponse(result)) {
  6360          throw errors.InvalidResponse(result);
  6361      }
  6362  
  6363      return result.result;
  6364  };
  6365  
  6366  /**
  6367   * Should be used to asynchronously send request
  6368   *
  6369   * @method sendAsync
  6370   * @param {Object} data
  6371   * @param {Function} callback
  6372   */
  6373  RequestManager.prototype.sendAsync = function (data, callback) {
  6374      if (!this.provider) {
  6375          return callback(errors.InvalidProvider());
  6376      }
  6377  
  6378      var payload = Jsonrpc.toPayload(data.method, data.params);
  6379      this.provider.sendAsync(payload, function (err, result) {
  6380          if (err) {
  6381              return callback(err);
  6382          }
  6383          
  6384          if (!Jsonrpc.isValidResponse(result)) {
  6385              return callback(errors.InvalidResponse(result));
  6386          }
  6387  
  6388          callback(null, result.result);
  6389      });
  6390  };
  6391  
  6392  /**
  6393   * Should be called to asynchronously send batch request
  6394   *
  6395   * @method sendBatch
  6396   * @param {Array} batch data
  6397   * @param {Function} callback
  6398   */
  6399  RequestManager.prototype.sendBatch = function (data, callback) {
  6400      if (!this.provider) {
  6401          return callback(errors.InvalidProvider());
  6402      }
  6403  
  6404      var payload = Jsonrpc.toBatchPayload(data);
  6405  
  6406      this.provider.sendAsync(payload, function (err, results) {
  6407          if (err) {
  6408              return callback(err);
  6409          }
  6410  
  6411          if (!utils.isArray(results)) {
  6412              return callback(errors.InvalidResponse(results));
  6413          }
  6414  
  6415          callback(err, results);
  6416      }); 
  6417  };
  6418  
  6419  /**
  6420   * Should be used to set provider of request manager
  6421   *
  6422   * @method setProvider
  6423   * @param {Object}
  6424   */
  6425  RequestManager.prototype.setProvider = function (p) {
  6426      this.provider = p;
  6427  };
  6428  
  6429  /**
  6430   * Should be used to start polling
  6431   *
  6432   * @method startPolling
  6433   * @param {Object} data
  6434   * @param {Number} pollId
  6435   * @param {Function} callback
  6436   * @param {Function} uninstall
  6437   *
  6438   * @todo cleanup number of params
  6439   */
  6440  RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) {
  6441      this.polls[pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall};
  6442  
  6443  
  6444      // start polling
  6445      if (!this.timeout) {
  6446          this.poll();
  6447      }
  6448  };
  6449  
  6450  /**
  6451   * Should be used to stop polling for filter with given id
  6452   *
  6453   * @method stopPolling
  6454   * @param {Number} pollId
  6455   */
  6456  RequestManager.prototype.stopPolling = function (pollId) {
  6457      delete this.polls[pollId];
  6458  
  6459      // stop polling
  6460      if(Object.keys(this.polls).length === 0 && this.timeout) {
  6461          clearTimeout(this.timeout);
  6462          this.timeout = null;
  6463      }
  6464  };
  6465  
  6466  /**
  6467   * Should be called to reset the polling mechanism of the request manager
  6468   *
  6469   * @method reset
  6470   */
  6471  RequestManager.prototype.reset = function (keepIsSyncing) {
  6472      /*jshint maxcomplexity:5 */
  6473  
  6474      for (var key in this.polls) {
  6475          // remove all polls, except sync polls,
  6476          // they need to be removed manually by calling syncing.stopWatching()
  6477          if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) {
  6478              this.polls[key].uninstall();
  6479              delete this.polls[key];
  6480          }
  6481      }
  6482  
  6483      // stop polling
  6484      if(Object.keys(this.polls).length === 0 && this.timeout) {
  6485          clearTimeout(this.timeout);
  6486          this.timeout = null;
  6487      }
  6488  };
  6489  
  6490  /**
  6491   * Should be called to poll for changes on filter with given id
  6492   *
  6493   * @method poll
  6494   */
  6495  RequestManager.prototype.poll = function () {
  6496      /*jshint maxcomplexity: 6 */
  6497      this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT);
  6498  
  6499      if (Object.keys(this.polls).length === 0) {
  6500          return;
  6501      }
  6502  
  6503      if (!this.provider) {
  6504          console.error(errors.InvalidProvider());
  6505          return;
  6506      }
  6507  
  6508      var pollsData = [];
  6509      var pollsIds = [];
  6510      for (var key in this.polls) {
  6511          pollsData.push(this.polls[key].data);
  6512          pollsIds.push(key);
  6513      }
  6514  
  6515      if (pollsData.length === 0) {
  6516          return;
  6517      }
  6518  
  6519      var payload = Jsonrpc.toBatchPayload(pollsData);
  6520      
  6521      // map the request id to they poll id
  6522      var pollsIdMap = {};
  6523      payload.forEach(function(load, index){
  6524          pollsIdMap[load.id] = pollsIds[index];
  6525      });
  6526  
  6527  
  6528      var self = this;
  6529      this.provider.sendAsync(payload, function (error, results) {
  6530  
  6531  
  6532          // TODO: console log?
  6533          if (error) {
  6534              return;
  6535          }
  6536  
  6537          if (!utils.isArray(results)) {
  6538              throw errors.InvalidResponse(results);
  6539          }
  6540          results.map(function (result) {
  6541              var id = pollsIdMap[result.id];
  6542  
  6543              // make sure the filter is still installed after arrival of the request
  6544              if (self.polls[id]) {
  6545                  result.callback = self.polls[id].callback;
  6546                  return result;
  6547              } else
  6548                  return false;
  6549          }).filter(function (result) {
  6550              return !!result; 
  6551          }).filter(function (result) {
  6552              var valid = Jsonrpc.isValidResponse(result);
  6553              if (!valid) {
  6554                  result.callback(errors.InvalidResponse(result));
  6555              }
  6556              return valid;
  6557          }).forEach(function (result) {
  6558              result.callback(null, result.result);
  6559          });
  6560      });
  6561  };
  6562  
  6563  module.exports = RequestManager;
  6564  
  6565  
  6566  },{"../utils/config":18,"../utils/utils":20,"./errors":26,"./jsonrpc":35}],47:[function(require,module,exports){
  6567  
  6568  
  6569  var Settings = function () {
  6570      this.defaultBlock = 'latest';
  6571      this.defaultAccount = undefined;
  6572  };
  6573  
  6574  module.exports = Settings;
  6575  
  6576  
  6577  },{}],48:[function(require,module,exports){
  6578  /*
  6579      This file is part of web3.js.
  6580  
  6581      web3.js is free software: you can redistribute it and/or modify
  6582      it under the terms of the GNU Lesser General Public License as published by
  6583      the Free Software Foundation, either version 3 of the License, or
  6584      (at your option) any later version.
  6585  
  6586      web3.js is distributed in the hope that it will be useful,
  6587      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6588      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6589      GNU Lesser General Public License for more details.
  6590  
  6591      You should have received a copy of the GNU Lesser General Public License
  6592      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6593  */
  6594  /** @file syncing.js
  6595   * @authors:
  6596   *   Fabian Vogelsteller <fabian@ethdev.com>
  6597   * @date 2015
  6598   */
  6599  
  6600  var formatters = require('./formatters');
  6601  var utils = require('../utils/utils');
  6602  
  6603  var count = 1;
  6604  
  6605  /**
  6606  Adds the callback and sets up the methods, to iterate over the results.
  6607  
  6608  @method pollSyncing
  6609  @param {Object} self
  6610  */
  6611  var pollSyncing = function(self) {
  6612  
  6613      var onMessage = function (error, sync) {
  6614          if (error) {
  6615              return self.callbacks.forEach(function (callback) {
  6616                  callback(error);
  6617              });
  6618          }
  6619  
  6620          if(utils.isObject(sync) && sync.startingBlock)
  6621              sync = formatters.outputSyncingFormatter(sync);
  6622  
  6623          self.callbacks.forEach(function (callback) {
  6624              if (self.lastSyncState !== sync) {
  6625                  
  6626                  // call the callback with true first so the app can stop anything, before receiving the sync data
  6627                  if(!self.lastSyncState && utils.isObject(sync))
  6628                      callback(null, true);
  6629                  
  6630                  // call on the next CPU cycle, so the actions of the sync stop can be processes first
  6631                  setTimeout(function() {
  6632                      callback(null, sync);
  6633                  }, 0);
  6634                  
  6635                  self.lastSyncState = sync;
  6636              }
  6637          });
  6638      };
  6639  
  6640      self.requestManager.startPolling({
  6641          method: 'eth_syncing',
  6642          params: [],
  6643      }, self.pollId, onMessage, self.stopWatching.bind(self));
  6644  
  6645  };
  6646  
  6647  var IsSyncing = function (requestManager, callback) {
  6648      this.requestManager = requestManager;
  6649      this.pollId = 'syncPoll_'+ count++;
  6650      this.callbacks = [];
  6651      this.addCallback(callback);
  6652      this.lastSyncState = false;
  6653      pollSyncing(this);
  6654  
  6655      return this;
  6656  };
  6657  
  6658  IsSyncing.prototype.addCallback = function (callback) {
  6659      if(callback)
  6660          this.callbacks.push(callback);
  6661      return this;
  6662  };
  6663  
  6664  IsSyncing.prototype.stopWatching = function () {
  6665      this.requestManager.stopPolling(this.pollId);
  6666      this.callbacks = [];
  6667  };
  6668  
  6669  module.exports = IsSyncing;
  6670  
  6671  
  6672  },{"../utils/utils":20,"./formatters":30}],49:[function(require,module,exports){
  6673  /*
  6674      This file is part of web3.js.
  6675  
  6676      web3.js is free software: you can redistribute it and/or modify
  6677      it under the terms of the GNU Lesser General Public License as published by
  6678      the Free Software Foundation, either version 3 of the License, or
  6679      (at your option) any later version.
  6680  
  6681      web3.js is distributed in the hope that it will be useful,
  6682      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6683      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6684      GNU Lesser General Public License for more details.
  6685  
  6686      You should have received a copy of the GNU Lesser General Public License
  6687      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6688  */
  6689  /** 
  6690   * @file transfer.js
  6691   * @author Marek Kotewicz <marek@ethdev.com>
  6692   * @date 2015
  6693   */
  6694  
  6695  var Iban = require('./iban');
  6696  var exchangeAbi = require('../contracts/SmartExchange.json');
  6697  
  6698  /**
  6699   * Should be used to make Iban transfer
  6700   *
  6701   * @method transfer
  6702   * @param {String} from
  6703   * @param {String} to iban
  6704   * @param {Value} value to be tranfered
  6705   * @param {Function} callback, callback
  6706   */
  6707  var transfer = function (eth, from, to, value, callback) {
  6708      var iban = new Iban(to); 
  6709      if (!iban.isValid()) {
  6710          throw new Error('invalid iban address');
  6711      }
  6712  
  6713      if (iban.isDirect()) {
  6714          return transferToAddress(eth, from, iban.address(), value, callback);
  6715      }
  6716      
  6717      if (!callback) {
  6718          var address = eth.icapNamereg().addr(iban.institution());
  6719          return deposit(eth, from, address, value, iban.client());
  6720      }
  6721  
  6722      eth.icapNamereg().addr(iban.institution(), function (err, address) {
  6723          return deposit(eth, from, address, value, iban.client(), callback);
  6724      });
  6725      
  6726  };
  6727  
  6728  /**
  6729   * Should be used to transfer funds to certain address
  6730   *
  6731   * @method transferToAddress
  6732   * @param {String} from
  6733   * @param {String} to
  6734   * @param {Value} value to be tranfered
  6735   * @param {Function} callback, callback
  6736   */
  6737  var transferToAddress = function (eth, from, to, value, callback) {
  6738      return eth.sendTransaction({
  6739          address: to,
  6740          from: from,
  6741          value: value
  6742      }, callback);
  6743  };
  6744  
  6745  /**
  6746   * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!)
  6747   *
  6748   * @method deposit
  6749   * @param {String} from
  6750   * @param {String} to
  6751   * @param {Value} value to be transferred
  6752   * @param {String} client unique identifier
  6753   * @param {Function} callback, callback
  6754   */
  6755  var deposit = function (eth, from, to, value, client, callback) {
  6756      var abi = exchangeAbi;
  6757      return eth.contract(abi).at(to).deposit(client, {
  6758          from: from,
  6759          value: value
  6760      }, callback);
  6761  };
  6762  
  6763  module.exports = transfer;
  6764  
  6765  
  6766  },{"../contracts/SmartExchange.json":3,"./iban":33}],50:[function(require,module,exports){
  6767  
  6768  },{}],51:[function(require,module,exports){
  6769  ;(function (root, factory, undef) {
  6770  	if (typeof exports === "object") {
  6771  		// CommonJS
  6772  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
  6773  	}
  6774  	else if (typeof define === "function" && define.amd) {
  6775  		// AMD
  6776  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
  6777  	}
  6778  	else {
  6779  		// Global (browser)
  6780  		factory(root.CryptoJS);
  6781  	}
  6782  }(this, function (CryptoJS) {
  6783  
  6784  	(function () {
  6785  	    // Shortcuts
  6786  	    var C = CryptoJS;
  6787  	    var C_lib = C.lib;
  6788  	    var BlockCipher = C_lib.BlockCipher;
  6789  	    var C_algo = C.algo;
  6790  
  6791  	    // Lookup tables
  6792  	    var SBOX = [];
  6793  	    var INV_SBOX = [];
  6794  	    var SUB_MIX_0 = [];
  6795  	    var SUB_MIX_1 = [];
  6796  	    var SUB_MIX_2 = [];
  6797  	    var SUB_MIX_3 = [];
  6798  	    var INV_SUB_MIX_0 = [];
  6799  	    var INV_SUB_MIX_1 = [];
  6800  	    var INV_SUB_MIX_2 = [];
  6801  	    var INV_SUB_MIX_3 = [];
  6802  
  6803  	    // Compute lookup tables
  6804  	    (function () {
  6805  	        // Compute double table
  6806  	        var d = [];
  6807  	        for (var i = 0; i < 256; i++) {
  6808  	            if (i < 128) {
  6809  	                d[i] = i << 1;
  6810  	            } else {
  6811  	                d[i] = (i << 1) ^ 0x11b;
  6812  	            }
  6813  	        }
  6814  
  6815  	        // Walk GF(2^8)
  6816  	        var x = 0;
  6817  	        var xi = 0;
  6818  	        for (var i = 0; i < 256; i++) {
  6819  	            // Compute sbox
  6820  	            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
  6821  	            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
  6822  	            SBOX[x] = sx;
  6823  	            INV_SBOX[sx] = x;
  6824  
  6825  	            // Compute multiplication
  6826  	            var x2 = d[x];
  6827  	            var x4 = d[x2];
  6828  	            var x8 = d[x4];
  6829  
  6830  	            // Compute sub bytes, mix columns tables
  6831  	            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
  6832  	            SUB_MIX_0[x] = (t << 24) | (t >>> 8);
  6833  	            SUB_MIX_1[x] = (t << 16) | (t >>> 16);
  6834  	            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);
  6835  	            SUB_MIX_3[x] = t;
  6836  
  6837  	            // Compute inv sub bytes, inv mix columns tables
  6838  	            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
  6839  	            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
  6840  	            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
  6841  	            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);
  6842  	            INV_SUB_MIX_3[sx] = t;
  6843  
  6844  	            // Compute next counter
  6845  	            if (!x) {
  6846  	                x = xi = 1;
  6847  	            } else {
  6848  	                x = x2 ^ d[d[d[x8 ^ x2]]];
  6849  	                xi ^= d[d[xi]];
  6850  	            }
  6851  	        }
  6852  	    }());
  6853  
  6854  	    // Precomputed Rcon lookup
  6855  	    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
  6856  
  6857  	    /**
  6858  	     * AES block cipher algorithm.
  6859  	     */
  6860  	    var AES = C_algo.AES = BlockCipher.extend({
  6861  	        _doReset: function () {
  6862  	            // Skip reset of nRounds has been set before and key did not change
  6863  	            if (this._nRounds && this._keyPriorReset === this._key) {
  6864  	                return;
  6865  	            }
  6866  
  6867  	            // Shortcuts
  6868  	            var key = this._keyPriorReset = this._key;
  6869  	            var keyWords = key.words;
  6870  	            var keySize = key.sigBytes / 4;
  6871  
  6872  	            // Compute number of rounds
  6873  	            var nRounds = this._nRounds = keySize + 6;
  6874  
  6875  	            // Compute number of key schedule rows
  6876  	            var ksRows = (nRounds + 1) * 4;
  6877  
  6878  	            // Compute key schedule
  6879  	            var keySchedule = this._keySchedule = [];
  6880  	            for (var ksRow = 0; ksRow < ksRows; ksRow++) {
  6881  	                if (ksRow < keySize) {
  6882  	                    keySchedule[ksRow] = keyWords[ksRow];
  6883  	                } else {
  6884  	                    var t = keySchedule[ksRow - 1];
  6885  
  6886  	                    if (!(ksRow % keySize)) {
  6887  	                        // Rot word
  6888  	                        t = (t << 8) | (t >>> 24);
  6889  
  6890  	                        // Sub word
  6891  	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
  6892  
  6893  	                        // Mix Rcon
  6894  	                        t ^= RCON[(ksRow / keySize) | 0] << 24;
  6895  	                    } else if (keySize > 6 && ksRow % keySize == 4) {
  6896  	                        // Sub word
  6897  	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
  6898  	                    }
  6899  
  6900  	                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
  6901  	                }
  6902  	            }
  6903  
  6904  	            // Compute inv key schedule
  6905  	            var invKeySchedule = this._invKeySchedule = [];
  6906  	            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
  6907  	                var ksRow = ksRows - invKsRow;
  6908  
  6909  	                if (invKsRow % 4) {
  6910  	                    var t = keySchedule[ksRow];
  6911  	                } else {
  6912  	                    var t = keySchedule[ksRow - 4];
  6913  	                }
  6914  
  6915  	                if (invKsRow < 4 || ksRow <= 4) {
  6916  	                    invKeySchedule[invKsRow] = t;
  6917  	                } else {
  6918  	                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
  6919  	                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
  6920  	                }
  6921  	            }
  6922  	        },
  6923  
  6924  	        encryptBlock: function (M, offset) {
  6925  	            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
  6926  	        },
  6927  
  6928  	        decryptBlock: function (M, offset) {
  6929  	            // Swap 2nd and 4th rows
  6930  	            var t = M[offset + 1];
  6931  	            M[offset + 1] = M[offset + 3];
  6932  	            M[offset + 3] = t;
  6933  
  6934  	            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
  6935  
  6936  	            // Inv swap 2nd and 4th rows
  6937  	            var t = M[offset + 1];
  6938  	            M[offset + 1] = M[offset + 3];
  6939  	            M[offset + 3] = t;
  6940  	        },
  6941  
  6942  	        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
  6943  	            // Shortcut
  6944  	            var nRounds = this._nRounds;
  6945  
  6946  	            // Get input, add round key
  6947  	            var s0 = M[offset]     ^ keySchedule[0];
  6948  	            var s1 = M[offset + 1] ^ keySchedule[1];
  6949  	            var s2 = M[offset + 2] ^ keySchedule[2];
  6950  	            var s3 = M[offset + 3] ^ keySchedule[3];
  6951  
  6952  	            // Key schedule row counter
  6953  	            var ksRow = 4;
  6954  
  6955  	            // Rounds
  6956  	            for (var round = 1; round < nRounds; round++) {
  6957  	                // Shift rows, sub bytes, mix columns, add round key
  6958  	                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++];
  6959  	                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++];
  6960  	                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++];
  6961  	                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++];
  6962  
  6963  	                // Update state
  6964  	                s0 = t0;
  6965  	                s1 = t1;
  6966  	                s2 = t2;
  6967  	                s3 = t3;
  6968  	            }
  6969  
  6970  	            // Shift rows, sub bytes, add round key
  6971  	            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
  6972  	            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
  6973  	            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
  6974  	            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
  6975  
  6976  	            // Set output
  6977  	            M[offset]     = t0;
  6978  	            M[offset + 1] = t1;
  6979  	            M[offset + 2] = t2;
  6980  	            M[offset + 3] = t3;
  6981  	        },
  6982  
  6983  	        keySize: 256/32
  6984  	    });
  6985  
  6986  	    /**
  6987  	     * Shortcut functions to the cipher's object interface.
  6988  	     *
  6989  	     * @example
  6990  	     *
  6991  	     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
  6992  	     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
  6993  	     */
  6994  	    C.AES = BlockCipher._createHelper(AES);
  6995  	}());
  6996  
  6997  
  6998  	return CryptoJS.AES;
  6999  
  7000  }));
  7001  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],52:[function(require,module,exports){
  7002  ;(function (root, factory) {
  7003  	if (typeof exports === "object") {
  7004  		// CommonJS
  7005  		module.exports = exports = factory(require("./core"));
  7006  	}
  7007  	else if (typeof define === "function" && define.amd) {
  7008  		// AMD
  7009  		define(["./core"], factory);
  7010  	}
  7011  	else {
  7012  		// Global (browser)
  7013  		factory(root.CryptoJS);
  7014  	}
  7015  }(this, function (CryptoJS) {
  7016  
  7017  	/**
  7018  	 * Cipher core components.
  7019  	 */
  7020  	CryptoJS.lib.Cipher || (function (undefined) {
  7021  	    // Shortcuts
  7022  	    var C = CryptoJS;
  7023  	    var C_lib = C.lib;
  7024  	    var Base = C_lib.Base;
  7025  	    var WordArray = C_lib.WordArray;
  7026  	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
  7027  	    var C_enc = C.enc;
  7028  	    var Utf8 = C_enc.Utf8;
  7029  	    var Base64 = C_enc.Base64;
  7030  	    var C_algo = C.algo;
  7031  	    var EvpKDF = C_algo.EvpKDF;
  7032  
  7033  	    /**
  7034  	     * Abstract base cipher template.
  7035  	     *
  7036  	     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
  7037  	     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
  7038  	     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
  7039  	     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
  7040  	     */
  7041  	    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
  7042  	        /**
  7043  	         * Configuration options.
  7044  	         *
  7045  	         * @property {WordArray} iv The IV to use for this operation.
  7046  	         */
  7047  	        cfg: Base.extend(),
  7048  
  7049  	        /**
  7050  	         * Creates this cipher in encryption mode.
  7051  	         *
  7052  	         * @param {WordArray} key The key.
  7053  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7054  	         *
  7055  	         * @return {Cipher} A cipher instance.
  7056  	         *
  7057  	         * @static
  7058  	         *
  7059  	         * @example
  7060  	         *
  7061  	         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
  7062  	         */
  7063  	        createEncryptor: function (key, cfg) {
  7064  	            return this.create(this._ENC_XFORM_MODE, key, cfg);
  7065  	        },
  7066  
  7067  	        /**
  7068  	         * Creates this cipher in decryption mode.
  7069  	         *
  7070  	         * @param {WordArray} key The key.
  7071  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7072  	         *
  7073  	         * @return {Cipher} A cipher instance.
  7074  	         *
  7075  	         * @static
  7076  	         *
  7077  	         * @example
  7078  	         *
  7079  	         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
  7080  	         */
  7081  	        createDecryptor: function (key, cfg) {
  7082  	            return this.create(this._DEC_XFORM_MODE, key, cfg);
  7083  	        },
  7084  
  7085  	        /**
  7086  	         * Initializes a newly created cipher.
  7087  	         *
  7088  	         * @param {number} xformMode Either the encryption or decryption transormation mode constant.
  7089  	         * @param {WordArray} key The key.
  7090  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7091  	         *
  7092  	         * @example
  7093  	         *
  7094  	         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
  7095  	         */
  7096  	        init: function (xformMode, key, cfg) {
  7097  	            // Apply config defaults
  7098  	            this.cfg = this.cfg.extend(cfg);
  7099  
  7100  	            // Store transform mode and key
  7101  	            this._xformMode = xformMode;
  7102  	            this._key = key;
  7103  
  7104  	            // Set initial values
  7105  	            this.reset();
  7106  	        },
  7107  
  7108  	        /**
  7109  	         * Resets this cipher to its initial state.
  7110  	         *
  7111  	         * @example
  7112  	         *
  7113  	         *     cipher.reset();
  7114  	         */
  7115  	        reset: function () {
  7116  	            // Reset data buffer
  7117  	            BufferedBlockAlgorithm.reset.call(this);
  7118  
  7119  	            // Perform concrete-cipher logic
  7120  	            this._doReset();
  7121  	        },
  7122  
  7123  	        /**
  7124  	         * Adds data to be encrypted or decrypted.
  7125  	         *
  7126  	         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
  7127  	         *
  7128  	         * @return {WordArray} The data after processing.
  7129  	         *
  7130  	         * @example
  7131  	         *
  7132  	         *     var encrypted = cipher.process('data');
  7133  	         *     var encrypted = cipher.process(wordArray);
  7134  	         */
  7135  	        process: function (dataUpdate) {
  7136  	            // Append
  7137  	            this._append(dataUpdate);
  7138  
  7139  	            // Process available blocks
  7140  	            return this._process();
  7141  	        },
  7142  
  7143  	        /**
  7144  	         * Finalizes the encryption or decryption process.
  7145  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  7146  	         *
  7147  	         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
  7148  	         *
  7149  	         * @return {WordArray} The data after final processing.
  7150  	         *
  7151  	         * @example
  7152  	         *
  7153  	         *     var encrypted = cipher.finalize();
  7154  	         *     var encrypted = cipher.finalize('data');
  7155  	         *     var encrypted = cipher.finalize(wordArray);
  7156  	         */
  7157  	        finalize: function (dataUpdate) {
  7158  	            // Final data update
  7159  	            if (dataUpdate) {
  7160  	                this._append(dataUpdate);
  7161  	            }
  7162  
  7163  	            // Perform concrete-cipher logic
  7164  	            var finalProcessedData = this._doFinalize();
  7165  
  7166  	            return finalProcessedData;
  7167  	        },
  7168  
  7169  	        keySize: 128/32,
  7170  
  7171  	        ivSize: 128/32,
  7172  
  7173  	        _ENC_XFORM_MODE: 1,
  7174  
  7175  	        _DEC_XFORM_MODE: 2,
  7176  
  7177  	        /**
  7178  	         * Creates shortcut functions to a cipher's object interface.
  7179  	         *
  7180  	         * @param {Cipher} cipher The cipher to create a helper for.
  7181  	         *
  7182  	         * @return {Object} An object with encrypt and decrypt shortcut functions.
  7183  	         *
  7184  	         * @static
  7185  	         *
  7186  	         * @example
  7187  	         *
  7188  	         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
  7189  	         */
  7190  	        _createHelper: (function () {
  7191  	            function selectCipherStrategy(key) {
  7192  	                if (typeof key == 'string') {
  7193  	                    return PasswordBasedCipher;
  7194  	                } else {
  7195  	                    return SerializableCipher;
  7196  	                }
  7197  	            }
  7198  
  7199  	            return function (cipher) {
  7200  	                return {
  7201  	                    encrypt: function (message, key, cfg) {
  7202  	                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
  7203  	                    },
  7204  
  7205  	                    decrypt: function (ciphertext, key, cfg) {
  7206  	                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
  7207  	                    }
  7208  	                };
  7209  	            };
  7210  	        }())
  7211  	    });
  7212  
  7213  	    /**
  7214  	     * Abstract base stream cipher template.
  7215  	     *
  7216  	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
  7217  	     */
  7218  	    var StreamCipher = C_lib.StreamCipher = Cipher.extend({
  7219  	        _doFinalize: function () {
  7220  	            // Process partial blocks
  7221  	            var finalProcessedBlocks = this._process(!!'flush');
  7222  
  7223  	            return finalProcessedBlocks;
  7224  	        },
  7225  
  7226  	        blockSize: 1
  7227  	    });
  7228  
  7229  	    /**
  7230  	     * Mode namespace.
  7231  	     */
  7232  	    var C_mode = C.mode = {};
  7233  
  7234  	    /**
  7235  	     * Abstract base block cipher mode template.
  7236  	     */
  7237  	    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
  7238  	        /**
  7239  	         * Creates this mode for encryption.
  7240  	         *
  7241  	         * @param {Cipher} cipher A block cipher instance.
  7242  	         * @param {Array} iv The IV words.
  7243  	         *
  7244  	         * @static
  7245  	         *
  7246  	         * @example
  7247  	         *
  7248  	         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
  7249  	         */
  7250  	        createEncryptor: function (cipher, iv) {
  7251  	            return this.Encryptor.create(cipher, iv);
  7252  	        },
  7253  
  7254  	        /**
  7255  	         * Creates this mode for decryption.
  7256  	         *
  7257  	         * @param {Cipher} cipher A block cipher instance.
  7258  	         * @param {Array} iv The IV words.
  7259  	         *
  7260  	         * @static
  7261  	         *
  7262  	         * @example
  7263  	         *
  7264  	         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
  7265  	         */
  7266  	        createDecryptor: function (cipher, iv) {
  7267  	            return this.Decryptor.create(cipher, iv);
  7268  	        },
  7269  
  7270  	        /**
  7271  	         * Initializes a newly created mode.
  7272  	         *
  7273  	         * @param {Cipher} cipher A block cipher instance.
  7274  	         * @param {Array} iv The IV words.
  7275  	         *
  7276  	         * @example
  7277  	         *
  7278  	         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
  7279  	         */
  7280  	        init: function (cipher, iv) {
  7281  	            this._cipher = cipher;
  7282  	            this._iv = iv;
  7283  	        }
  7284  	    });
  7285  
  7286  	    /**
  7287  	     * Cipher Block Chaining mode.
  7288  	     */
  7289  	    var CBC = C_mode.CBC = (function () {
  7290  	        /**
  7291  	         * Abstract base CBC mode.
  7292  	         */
  7293  	        var CBC = BlockCipherMode.extend();
  7294  
  7295  	        /**
  7296  	         * CBC encryptor.
  7297  	         */
  7298  	        CBC.Encryptor = CBC.extend({
  7299  	            /**
  7300  	             * Processes the data block at offset.
  7301  	             *
  7302  	             * @param {Array} words The data words to operate on.
  7303  	             * @param {number} offset The offset where the block starts.
  7304  	             *
  7305  	             * @example
  7306  	             *
  7307  	             *     mode.processBlock(data.words, offset);
  7308  	             */
  7309  	            processBlock: function (words, offset) {
  7310  	                // Shortcuts
  7311  	                var cipher = this._cipher;
  7312  	                var blockSize = cipher.blockSize;
  7313  
  7314  	                // XOR and encrypt
  7315  	                xorBlock.call(this, words, offset, blockSize);
  7316  	                cipher.encryptBlock(words, offset);
  7317  
  7318  	                // Remember this block to use with next block
  7319  	                this._prevBlock = words.slice(offset, offset + blockSize);
  7320  	            }
  7321  	        });
  7322  
  7323  	        /**
  7324  	         * CBC decryptor.
  7325  	         */
  7326  	        CBC.Decryptor = CBC.extend({
  7327  	            /**
  7328  	             * Processes the data block at offset.
  7329  	             *
  7330  	             * @param {Array} words The data words to operate on.
  7331  	             * @param {number} offset The offset where the block starts.
  7332  	             *
  7333  	             * @example
  7334  	             *
  7335  	             *     mode.processBlock(data.words, offset);
  7336  	             */
  7337  	            processBlock: function (words, offset) {
  7338  	                // Shortcuts
  7339  	                var cipher = this._cipher;
  7340  	                var blockSize = cipher.blockSize;
  7341  
  7342  	                // Remember this block to use with next block
  7343  	                var thisBlock = words.slice(offset, offset + blockSize);
  7344  
  7345  	                // Decrypt and XOR
  7346  	                cipher.decryptBlock(words, offset);
  7347  	                xorBlock.call(this, words, offset, blockSize);
  7348  
  7349  	                // This block becomes the previous block
  7350  	                this._prevBlock = thisBlock;
  7351  	            }
  7352  	        });
  7353  
  7354  	        function xorBlock(words, offset, blockSize) {
  7355  	            // Shortcut
  7356  	            var iv = this._iv;
  7357  
  7358  	            // Choose mixing block
  7359  	            if (iv) {
  7360  	                var block = iv;
  7361  
  7362  	                // Remove IV for subsequent blocks
  7363  	                this._iv = undefined;
  7364  	            } else {
  7365  	                var block = this._prevBlock;
  7366  	            }
  7367  
  7368  	            // XOR blocks
  7369  	            for (var i = 0; i < blockSize; i++) {
  7370  	                words[offset + i] ^= block[i];
  7371  	            }
  7372  	        }
  7373  
  7374  	        return CBC;
  7375  	    }());
  7376  
  7377  	    /**
  7378  	     * Padding namespace.
  7379  	     */
  7380  	    var C_pad = C.pad = {};
  7381  
  7382  	    /**
  7383  	     * PKCS #5/7 padding strategy.
  7384  	     */
  7385  	    var Pkcs7 = C_pad.Pkcs7 = {
  7386  	        /**
  7387  	         * Pads data using the algorithm defined in PKCS #5/7.
  7388  	         *
  7389  	         * @param {WordArray} data The data to pad.
  7390  	         * @param {number} blockSize The multiple that the data should be padded to.
  7391  	         *
  7392  	         * @static
  7393  	         *
  7394  	         * @example
  7395  	         *
  7396  	         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);
  7397  	         */
  7398  	        pad: function (data, blockSize) {
  7399  	            // Shortcut
  7400  	            var blockSizeBytes = blockSize * 4;
  7401  
  7402  	            // Count padding bytes
  7403  	            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
  7404  
  7405  	            // Create padding word
  7406  	            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
  7407  
  7408  	            // Create padding
  7409  	            var paddingWords = [];
  7410  	            for (var i = 0; i < nPaddingBytes; i += 4) {
  7411  	                paddingWords.push(paddingWord);
  7412  	            }
  7413  	            var padding = WordArray.create(paddingWords, nPaddingBytes);
  7414  
  7415  	            // Add padding
  7416  	            data.concat(padding);
  7417  	        },
  7418  
  7419  	        /**
  7420  	         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
  7421  	         *
  7422  	         * @param {WordArray} data The data to unpad.
  7423  	         *
  7424  	         * @static
  7425  	         *
  7426  	         * @example
  7427  	         *
  7428  	         *     CryptoJS.pad.Pkcs7.unpad(wordArray);
  7429  	         */
  7430  	        unpad: function (data) {
  7431  	            // Get number of padding bytes from last byte
  7432  	            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
  7433  
  7434  	            // Remove padding
  7435  	            data.sigBytes -= nPaddingBytes;
  7436  	        }
  7437  	    };
  7438  
  7439  	    /**
  7440  	     * Abstract base block cipher template.
  7441  	     *
  7442  	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
  7443  	     */
  7444  	    var BlockCipher = C_lib.BlockCipher = Cipher.extend({
  7445  	        /**
  7446  	         * Configuration options.
  7447  	         *
  7448  	         * @property {Mode} mode The block mode to use. Default: CBC
  7449  	         * @property {Padding} padding The padding strategy to use. Default: Pkcs7
  7450  	         */
  7451  	        cfg: Cipher.cfg.extend({
  7452  	            mode: CBC,
  7453  	            padding: Pkcs7
  7454  	        }),
  7455  
  7456  	        reset: function () {
  7457  	            // Reset cipher
  7458  	            Cipher.reset.call(this);
  7459  
  7460  	            // Shortcuts
  7461  	            var cfg = this.cfg;
  7462  	            var iv = cfg.iv;
  7463  	            var mode = cfg.mode;
  7464  
  7465  	            // Reset block mode
  7466  	            if (this._xformMode == this._ENC_XFORM_MODE) {
  7467  	                var modeCreator = mode.createEncryptor;
  7468  	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
  7469  	                var modeCreator = mode.createDecryptor;
  7470  
  7471  	                // Keep at least one block in the buffer for unpadding
  7472  	                this._minBufferSize = 1;
  7473  	            }
  7474  	            this._mode = modeCreator.call(mode, this, iv && iv.words);
  7475  	        },
  7476  
  7477  	        _doProcessBlock: function (words, offset) {
  7478  	            this._mode.processBlock(words, offset);
  7479  	        },
  7480  
  7481  	        _doFinalize: function () {
  7482  	            // Shortcut
  7483  	            var padding = this.cfg.padding;
  7484  
  7485  	            // Finalize
  7486  	            if (this._xformMode == this._ENC_XFORM_MODE) {
  7487  	                // Pad data
  7488  	                padding.pad(this._data, this.blockSize);
  7489  
  7490  	                // Process final blocks
  7491  	                var finalProcessedBlocks = this._process(!!'flush');
  7492  	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
  7493  	                // Process final blocks
  7494  	                var finalProcessedBlocks = this._process(!!'flush');
  7495  
  7496  	                // Unpad data
  7497  	                padding.unpad(finalProcessedBlocks);
  7498  	            }
  7499  
  7500  	            return finalProcessedBlocks;
  7501  	        },
  7502  
  7503  	        blockSize: 128/32
  7504  	    });
  7505  
  7506  	    /**
  7507  	     * A collection of cipher parameters.
  7508  	     *
  7509  	     * @property {WordArray} ciphertext The raw ciphertext.
  7510  	     * @property {WordArray} key The key to this ciphertext.
  7511  	     * @property {WordArray} iv The IV used in the ciphering operation.
  7512  	     * @property {WordArray} salt The salt used with a key derivation function.
  7513  	     * @property {Cipher} algorithm The cipher algorithm.
  7514  	     * @property {Mode} mode The block mode used in the ciphering operation.
  7515  	     * @property {Padding} padding The padding scheme used in the ciphering operation.
  7516  	     * @property {number} blockSize The block size of the cipher.
  7517  	     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
  7518  	     */
  7519  	    var CipherParams = C_lib.CipherParams = Base.extend({
  7520  	        /**
  7521  	         * Initializes a newly created cipher params object.
  7522  	         *
  7523  	         * @param {Object} cipherParams An object with any of the possible cipher parameters.
  7524  	         *
  7525  	         * @example
  7526  	         *
  7527  	         *     var cipherParams = CryptoJS.lib.CipherParams.create({
  7528  	         *         ciphertext: ciphertextWordArray,
  7529  	         *         key: keyWordArray,
  7530  	         *         iv: ivWordArray,
  7531  	         *         salt: saltWordArray,
  7532  	         *         algorithm: CryptoJS.algo.AES,
  7533  	         *         mode: CryptoJS.mode.CBC,
  7534  	         *         padding: CryptoJS.pad.PKCS7,
  7535  	         *         blockSize: 4,
  7536  	         *         formatter: CryptoJS.format.OpenSSL
  7537  	         *     });
  7538  	         */
  7539  	        init: function (cipherParams) {
  7540  	            this.mixIn(cipherParams);
  7541  	        },
  7542  
  7543  	        /**
  7544  	         * Converts this cipher params object to a string.
  7545  	         *
  7546  	         * @param {Format} formatter (Optional) The formatting strategy to use.
  7547  	         *
  7548  	         * @return {string} The stringified cipher params.
  7549  	         *
  7550  	         * @throws Error If neither the formatter nor the default formatter is set.
  7551  	         *
  7552  	         * @example
  7553  	         *
  7554  	         *     var string = cipherParams + '';
  7555  	         *     var string = cipherParams.toString();
  7556  	         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);
  7557  	         */
  7558  	        toString: function (formatter) {
  7559  	            return (formatter || this.formatter).stringify(this);
  7560  	        }
  7561  	    });
  7562  
  7563  	    /**
  7564  	     * Format namespace.
  7565  	     */
  7566  	    var C_format = C.format = {};
  7567  
  7568  	    /**
  7569  	     * OpenSSL formatting strategy.
  7570  	     */
  7571  	    var OpenSSLFormatter = C_format.OpenSSL = {
  7572  	        /**
  7573  	         * Converts a cipher params object to an OpenSSL-compatible string.
  7574  	         *
  7575  	         * @param {CipherParams} cipherParams The cipher params object.
  7576  	         *
  7577  	         * @return {string} The OpenSSL-compatible string.
  7578  	         *
  7579  	         * @static
  7580  	         *
  7581  	         * @example
  7582  	         *
  7583  	         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
  7584  	         */
  7585  	        stringify: function (cipherParams) {
  7586  	            // Shortcuts
  7587  	            var ciphertext = cipherParams.ciphertext;
  7588  	            var salt = cipherParams.salt;
  7589  
  7590  	            // Format
  7591  	            if (salt) {
  7592  	                var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
  7593  	            } else {
  7594  	                var wordArray = ciphertext;
  7595  	            }
  7596  
  7597  	            return wordArray.toString(Base64);
  7598  	        },
  7599  
  7600  	        /**
  7601  	         * Converts an OpenSSL-compatible string to a cipher params object.
  7602  	         *
  7603  	         * @param {string} openSSLStr The OpenSSL-compatible string.
  7604  	         *
  7605  	         * @return {CipherParams} The cipher params object.
  7606  	         *
  7607  	         * @static
  7608  	         *
  7609  	         * @example
  7610  	         *
  7611  	         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
  7612  	         */
  7613  	        parse: function (openSSLStr) {
  7614  	            // Parse base64
  7615  	            var ciphertext = Base64.parse(openSSLStr);
  7616  
  7617  	            // Shortcut
  7618  	            var ciphertextWords = ciphertext.words;
  7619  
  7620  	            // Test for salt
  7621  	            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
  7622  	                // Extract salt
  7623  	                var salt = WordArray.create(ciphertextWords.slice(2, 4));
  7624  
  7625  	                // Remove salt from ciphertext
  7626  	                ciphertextWords.splice(0, 4);
  7627  	                ciphertext.sigBytes -= 16;
  7628  	            }
  7629  
  7630  	            return CipherParams.create({ ciphertext: ciphertext, salt: salt });
  7631  	        }
  7632  	    };
  7633  
  7634  	    /**
  7635  	     * A cipher wrapper that returns ciphertext as a serializable cipher params object.
  7636  	     */
  7637  	    var SerializableCipher = C_lib.SerializableCipher = Base.extend({
  7638  	        /**
  7639  	         * Configuration options.
  7640  	         *
  7641  	         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
  7642  	         */
  7643  	        cfg: Base.extend({
  7644  	            format: OpenSSLFormatter
  7645  	        }),
  7646  
  7647  	        /**
  7648  	         * Encrypts a message.
  7649  	         *
  7650  	         * @param {Cipher} cipher The cipher algorithm to use.
  7651  	         * @param {WordArray|string} message The message to encrypt.
  7652  	         * @param {WordArray} key The key.
  7653  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7654  	         *
  7655  	         * @return {CipherParams} A cipher params object.
  7656  	         *
  7657  	         * @static
  7658  	         *
  7659  	         * @example
  7660  	         *
  7661  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
  7662  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
  7663  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7664  	         */
  7665  	        encrypt: function (cipher, message, key, cfg) {
  7666  	            // Apply config defaults
  7667  	            cfg = this.cfg.extend(cfg);
  7668  
  7669  	            // Encrypt
  7670  	            var encryptor = cipher.createEncryptor(key, cfg);
  7671  	            var ciphertext = encryptor.finalize(message);
  7672  
  7673  	            // Shortcut
  7674  	            var cipherCfg = encryptor.cfg;
  7675  
  7676  	            // Create and return serializable cipher params
  7677  	            return CipherParams.create({
  7678  	                ciphertext: ciphertext,
  7679  	                key: key,
  7680  	                iv: cipherCfg.iv,
  7681  	                algorithm: cipher,
  7682  	                mode: cipherCfg.mode,
  7683  	                padding: cipherCfg.padding,
  7684  	                blockSize: cipher.blockSize,
  7685  	                formatter: cfg.format
  7686  	            });
  7687  	        },
  7688  
  7689  	        /**
  7690  	         * Decrypts serialized ciphertext.
  7691  	         *
  7692  	         * @param {Cipher} cipher The cipher algorithm to use.
  7693  	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
  7694  	         * @param {WordArray} key The key.
  7695  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7696  	         *
  7697  	         * @return {WordArray} The plaintext.
  7698  	         *
  7699  	         * @static
  7700  	         *
  7701  	         * @example
  7702  	         *
  7703  	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7704  	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7705  	         */
  7706  	        decrypt: function (cipher, ciphertext, key, cfg) {
  7707  	            // Apply config defaults
  7708  	            cfg = this.cfg.extend(cfg);
  7709  
  7710  	            // Convert string to CipherParams
  7711  	            ciphertext = this._parse(ciphertext, cfg.format);
  7712  
  7713  	            // Decrypt
  7714  	            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
  7715  
  7716  	            return plaintext;
  7717  	        },
  7718  
  7719  	        /**
  7720  	         * Converts serialized ciphertext to CipherParams,
  7721  	         * else assumed CipherParams already and returns ciphertext unchanged.
  7722  	         *
  7723  	         * @param {CipherParams|string} ciphertext The ciphertext.
  7724  	         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
  7725  	         *
  7726  	         * @return {CipherParams} The unserialized ciphertext.
  7727  	         *
  7728  	         * @static
  7729  	         *
  7730  	         * @example
  7731  	         *
  7732  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
  7733  	         */
  7734  	        _parse: function (ciphertext, format) {
  7735  	            if (typeof ciphertext == 'string') {
  7736  	                return format.parse(ciphertext, this);
  7737  	            } else {
  7738  	                return ciphertext;
  7739  	            }
  7740  	        }
  7741  	    });
  7742  
  7743  	    /**
  7744  	     * Key derivation function namespace.
  7745  	     */
  7746  	    var C_kdf = C.kdf = {};
  7747  
  7748  	    /**
  7749  	     * OpenSSL key derivation function.
  7750  	     */
  7751  	    var OpenSSLKdf = C_kdf.OpenSSL = {
  7752  	        /**
  7753  	         * Derives a key and IV from a password.
  7754  	         *
  7755  	         * @param {string} password The password to derive from.
  7756  	         * @param {number} keySize The size in words of the key to generate.
  7757  	         * @param {number} ivSize The size in words of the IV to generate.
  7758  	         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
  7759  	         *
  7760  	         * @return {CipherParams} A cipher params object with the key, IV, and salt.
  7761  	         *
  7762  	         * @static
  7763  	         *
  7764  	         * @example
  7765  	         *
  7766  	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
  7767  	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
  7768  	         */
  7769  	        execute: function (password, keySize, ivSize, salt) {
  7770  	            // Generate random salt
  7771  	            if (!salt) {
  7772  	                salt = WordArray.random(64/8);
  7773  	            }
  7774  
  7775  	            // Derive key and IV
  7776  	            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
  7777  
  7778  	            // Separate key and IV
  7779  	            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
  7780  	            key.sigBytes = keySize * 4;
  7781  
  7782  	            // Return params
  7783  	            return CipherParams.create({ key: key, iv: iv, salt: salt });
  7784  	        }
  7785  	    };
  7786  
  7787  	    /**
  7788  	     * A serializable cipher wrapper that derives the key from a password,
  7789  	     * and returns ciphertext as a serializable cipher params object.
  7790  	     */
  7791  	    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
  7792  	        /**
  7793  	         * Configuration options.
  7794  	         *
  7795  	         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
  7796  	         */
  7797  	        cfg: SerializableCipher.cfg.extend({
  7798  	            kdf: OpenSSLKdf
  7799  	        }),
  7800  
  7801  	        /**
  7802  	         * Encrypts a message using a password.
  7803  	         *
  7804  	         * @param {Cipher} cipher The cipher algorithm to use.
  7805  	         * @param {WordArray|string} message The message to encrypt.
  7806  	         * @param {string} password The password.
  7807  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7808  	         *
  7809  	         * @return {CipherParams} A cipher params object.
  7810  	         *
  7811  	         * @static
  7812  	         *
  7813  	         * @example
  7814  	         *
  7815  	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
  7816  	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
  7817  	         */
  7818  	        encrypt: function (cipher, message, password, cfg) {
  7819  	            // Apply config defaults
  7820  	            cfg = this.cfg.extend(cfg);
  7821  
  7822  	            // Derive key and other params
  7823  	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
  7824  
  7825  	            // Add IV to config
  7826  	            cfg.iv = derivedParams.iv;
  7827  
  7828  	            // Encrypt
  7829  	            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
  7830  
  7831  	            // Mix in derived params
  7832  	            ciphertext.mixIn(derivedParams);
  7833  
  7834  	            return ciphertext;
  7835  	        },
  7836  
  7837  	        /**
  7838  	         * Decrypts serialized ciphertext using a password.
  7839  	         *
  7840  	         * @param {Cipher} cipher The cipher algorithm to use.
  7841  	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
  7842  	         * @param {string} password The password.
  7843  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7844  	         *
  7845  	         * @return {WordArray} The plaintext.
  7846  	         *
  7847  	         * @static
  7848  	         *
  7849  	         * @example
  7850  	         *
  7851  	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
  7852  	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
  7853  	         */
  7854  	        decrypt: function (cipher, ciphertext, password, cfg) {
  7855  	            // Apply config defaults
  7856  	            cfg = this.cfg.extend(cfg);
  7857  
  7858  	            // Convert string to CipherParams
  7859  	            ciphertext = this._parse(ciphertext, cfg.format);
  7860  
  7861  	            // Derive key and other params
  7862  	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
  7863  
  7864  	            // Add IV to config
  7865  	            cfg.iv = derivedParams.iv;
  7866  
  7867  	            // Decrypt
  7868  	            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
  7869  
  7870  	            return plaintext;
  7871  	        }
  7872  	    });
  7873  	}());
  7874  
  7875  
  7876  }));
  7877  },{"./core":53}],53:[function(require,module,exports){
  7878  ;(function (root, factory) {
  7879  	if (typeof exports === "object") {
  7880  		// CommonJS
  7881  		module.exports = exports = factory();
  7882  	}
  7883  	else if (typeof define === "function" && define.amd) {
  7884  		// AMD
  7885  		define([], factory);
  7886  	}
  7887  	else {
  7888  		// Global (browser)
  7889  		root.CryptoJS = factory();
  7890  	}
  7891  }(this, function () {
  7892  
  7893  	/**
  7894  	 * CryptoJS core components.
  7895  	 */
  7896  	var CryptoJS = CryptoJS || (function (Math, undefined) {
  7897  	    /*
  7898  	     * Local polyfil of Object.create
  7899  	     */
  7900  	    var create = Object.create || (function () {
  7901  	        function F() {};
  7902  
  7903  	        return function (obj) {
  7904  	            var subtype;
  7905  
  7906  	            F.prototype = obj;
  7907  
  7908  	            subtype = new F();
  7909  
  7910  	            F.prototype = null;
  7911  
  7912  	            return subtype;
  7913  	        };
  7914  	    }())
  7915  
  7916  	    /**
  7917  	     * CryptoJS namespace.
  7918  	     */
  7919  	    var C = {};
  7920  
  7921  	    /**
  7922  	     * Library namespace.
  7923  	     */
  7924  	    var C_lib = C.lib = {};
  7925  
  7926  	    /**
  7927  	     * Base object for prototypal inheritance.
  7928  	     */
  7929  	    var Base = C_lib.Base = (function () {
  7930  
  7931  
  7932  	        return {
  7933  	            /**
  7934  	             * Creates a new object that inherits from this object.
  7935  	             *
  7936  	             * @param {Object} overrides Properties to copy into the new object.
  7937  	             *
  7938  	             * @return {Object} The new object.
  7939  	             *
  7940  	             * @static
  7941  	             *
  7942  	             * @example
  7943  	             *
  7944  	             *     var MyType = CryptoJS.lib.Base.extend({
  7945  	             *         field: 'value',
  7946  	             *
  7947  	             *         method: function () {
  7948  	             *         }
  7949  	             *     });
  7950  	             */
  7951  	            extend: function (overrides) {
  7952  	                // Spawn
  7953  	                var subtype = create(this);
  7954  
  7955  	                // Augment
  7956  	                if (overrides) {
  7957  	                    subtype.mixIn(overrides);
  7958  	                }
  7959  
  7960  	                // Create default initializer
  7961  	                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
  7962  	                    subtype.init = function () {
  7963  	                        subtype.$super.init.apply(this, arguments);
  7964  	                    };
  7965  	                }
  7966  
  7967  	                // Initializer's prototype is the subtype object
  7968  	                subtype.init.prototype = subtype;
  7969  
  7970  	                // Reference supertype
  7971  	                subtype.$super = this;
  7972  
  7973  	                return subtype;
  7974  	            },
  7975  
  7976  	            /**
  7977  	             * Extends this object and runs the init method.
  7978  	             * Arguments to create() will be passed to init().
  7979  	             *
  7980  	             * @return {Object} The new object.
  7981  	             *
  7982  	             * @static
  7983  	             *
  7984  	             * @example
  7985  	             *
  7986  	             *     var instance = MyType.create();
  7987  	             */
  7988  	            create: function () {
  7989  	                var instance = this.extend();
  7990  	                instance.init.apply(instance, arguments);
  7991  
  7992  	                return instance;
  7993  	            },
  7994  
  7995  	            /**
  7996  	             * Initializes a newly created object.
  7997  	             * Override this method to add some logic when your objects are created.
  7998  	             *
  7999  	             * @example
  8000  	             *
  8001  	             *     var MyType = CryptoJS.lib.Base.extend({
  8002  	             *         init: function () {
  8003  	             *             // ...
  8004  	             *         }
  8005  	             *     });
  8006  	             */
  8007  	            init: function () {
  8008  	            },
  8009  
  8010  	            /**
  8011  	             * Copies properties into this object.
  8012  	             *
  8013  	             * @param {Object} properties The properties to mix in.
  8014  	             *
  8015  	             * @example
  8016  	             *
  8017  	             *     MyType.mixIn({
  8018  	             *         field: 'value'
  8019  	             *     });
  8020  	             */
  8021  	            mixIn: function (properties) {
  8022  	                for (var propertyName in properties) {
  8023  	                    if (properties.hasOwnProperty(propertyName)) {
  8024  	                        this[propertyName] = properties[propertyName];
  8025  	                    }
  8026  	                }
  8027  
  8028  	                // IE won't copy toString using the loop above
  8029  	                if (properties.hasOwnProperty('toString')) {
  8030  	                    this.toString = properties.toString;
  8031  	                }
  8032  	            },
  8033  
  8034  	            /**
  8035  	             * Creates a copy of this object.
  8036  	             *
  8037  	             * @return {Object} The clone.
  8038  	             *
  8039  	             * @example
  8040  	             *
  8041  	             *     var clone = instance.clone();
  8042  	             */
  8043  	            clone: function () {
  8044  	                return this.init.prototype.extend(this);
  8045  	            }
  8046  	        };
  8047  	    }());
  8048  
  8049  	    /**
  8050  	     * An array of 32-bit words.
  8051  	     *
  8052  	     * @property {Array} words The array of 32-bit words.
  8053  	     * @property {number} sigBytes The number of significant bytes in this word array.
  8054  	     */
  8055  	    var WordArray = C_lib.WordArray = Base.extend({
  8056  	        /**
  8057  	         * Initializes a newly created word array.
  8058  	         *
  8059  	         * @param {Array} words (Optional) An array of 32-bit words.
  8060  	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
  8061  	         *
  8062  	         * @example
  8063  	         *
  8064  	         *     var wordArray = CryptoJS.lib.WordArray.create();
  8065  	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
  8066  	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
  8067  	         */
  8068  	        init: function (words, sigBytes) {
  8069  	            words = this.words = words || [];
  8070  
  8071  	            if (sigBytes != undefined) {
  8072  	                this.sigBytes = sigBytes;
  8073  	            } else {
  8074  	                this.sigBytes = words.length * 4;
  8075  	            }
  8076  	        },
  8077  
  8078  	        /**
  8079  	         * Converts this word array to a string.
  8080  	         *
  8081  	         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
  8082  	         *
  8083  	         * @return {string} The stringified word array.
  8084  	         *
  8085  	         * @example
  8086  	         *
  8087  	         *     var string = wordArray + '';
  8088  	         *     var string = wordArray.toString();
  8089  	         *     var string = wordArray.toString(CryptoJS.enc.Utf8);
  8090  	         */
  8091  	        toString: function (encoder) {
  8092  	            return (encoder || Hex).stringify(this);
  8093  	        },
  8094  
  8095  	        /**
  8096  	         * Concatenates a word array to this word array.
  8097  	         *
  8098  	         * @param {WordArray} wordArray The word array to append.
  8099  	         *
  8100  	         * @return {WordArray} This word array.
  8101  	         *
  8102  	         * @example
  8103  	         *
  8104  	         *     wordArray1.concat(wordArray2);
  8105  	         */
  8106  	        concat: function (wordArray) {
  8107  	            // Shortcuts
  8108  	            var thisWords = this.words;
  8109  	            var thatWords = wordArray.words;
  8110  	            var thisSigBytes = this.sigBytes;
  8111  	            var thatSigBytes = wordArray.sigBytes;
  8112  
  8113  	            // Clamp excess bits
  8114  	            this.clamp();
  8115  
  8116  	            // Concat
  8117  	            if (thisSigBytes % 4) {
  8118  	                // Copy one byte at a time
  8119  	                for (var i = 0; i < thatSigBytes; i++) {
  8120  	                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8121  	                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
  8122  	                }
  8123  	            } else {
  8124  	                // Copy one word at a time
  8125  	                for (var i = 0; i < thatSigBytes; i += 4) {
  8126  	                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
  8127  	                }
  8128  	            }
  8129  	            this.sigBytes += thatSigBytes;
  8130  
  8131  	            // Chainable
  8132  	            return this;
  8133  	        },
  8134  
  8135  	        /**
  8136  	         * Removes insignificant bits.
  8137  	         *
  8138  	         * @example
  8139  	         *
  8140  	         *     wordArray.clamp();
  8141  	         */
  8142  	        clamp: function () {
  8143  	            // Shortcuts
  8144  	            var words = this.words;
  8145  	            var sigBytes = this.sigBytes;
  8146  
  8147  	            // Clamp
  8148  	            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
  8149  	            words.length = Math.ceil(sigBytes / 4);
  8150  	        },
  8151  
  8152  	        /**
  8153  	         * Creates a copy of this word array.
  8154  	         *
  8155  	         * @return {WordArray} The clone.
  8156  	         *
  8157  	         * @example
  8158  	         *
  8159  	         *     var clone = wordArray.clone();
  8160  	         */
  8161  	        clone: function () {
  8162  	            var clone = Base.clone.call(this);
  8163  	            clone.words = this.words.slice(0);
  8164  
  8165  	            return clone;
  8166  	        },
  8167  
  8168  	        /**
  8169  	         * Creates a word array filled with random bytes.
  8170  	         *
  8171  	         * @param {number} nBytes The number of random bytes to generate.
  8172  	         *
  8173  	         * @return {WordArray} The random word array.
  8174  	         *
  8175  	         * @static
  8176  	         *
  8177  	         * @example
  8178  	         *
  8179  	         *     var wordArray = CryptoJS.lib.WordArray.random(16);
  8180  	         */
  8181  	        random: function (nBytes) {
  8182  	            var words = [];
  8183  
  8184  	            var r = (function (m_w) {
  8185  	                var m_w = m_w;
  8186  	                var m_z = 0x3ade68b1;
  8187  	                var mask = 0xffffffff;
  8188  
  8189  	                return function () {
  8190  	                    m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
  8191  	                    m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
  8192  	                    var result = ((m_z << 0x10) + m_w) & mask;
  8193  	                    result /= 0x100000000;
  8194  	                    result += 0.5;
  8195  	                    return result * (Math.random() > .5 ? 1 : -1);
  8196  	                }
  8197  	            });
  8198  
  8199  	            for (var i = 0, rcache; i < nBytes; i += 4) {
  8200  	                var _r = r((rcache || Math.random()) * 0x100000000);
  8201  
  8202  	                rcache = _r() * 0x3ade67b7;
  8203  	                words.push((_r() * 0x100000000) | 0);
  8204  	            }
  8205  
  8206  	            return new WordArray.init(words, nBytes);
  8207  	        }
  8208  	    });
  8209  
  8210  	    /**
  8211  	     * Encoder namespace.
  8212  	     */
  8213  	    var C_enc = C.enc = {};
  8214  
  8215  	    /**
  8216  	     * Hex encoding strategy.
  8217  	     */
  8218  	    var Hex = C_enc.Hex = {
  8219  	        /**
  8220  	         * Converts a word array to a hex string.
  8221  	         *
  8222  	         * @param {WordArray} wordArray The word array.
  8223  	         *
  8224  	         * @return {string} The hex string.
  8225  	         *
  8226  	         * @static
  8227  	         *
  8228  	         * @example
  8229  	         *
  8230  	         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
  8231  	         */
  8232  	        stringify: function (wordArray) {
  8233  	            // Shortcuts
  8234  	            var words = wordArray.words;
  8235  	            var sigBytes = wordArray.sigBytes;
  8236  
  8237  	            // Convert
  8238  	            var hexChars = [];
  8239  	            for (var i = 0; i < sigBytes; i++) {
  8240  	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8241  	                hexChars.push((bite >>> 4).toString(16));
  8242  	                hexChars.push((bite & 0x0f).toString(16));
  8243  	            }
  8244  
  8245  	            return hexChars.join('');
  8246  	        },
  8247  
  8248  	        /**
  8249  	         * Converts a hex string to a word array.
  8250  	         *
  8251  	         * @param {string} hexStr The hex string.
  8252  	         *
  8253  	         * @return {WordArray} The word array.
  8254  	         *
  8255  	         * @static
  8256  	         *
  8257  	         * @example
  8258  	         *
  8259  	         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
  8260  	         */
  8261  	        parse: function (hexStr) {
  8262  	            // Shortcut
  8263  	            var hexStrLength = hexStr.length;
  8264  
  8265  	            // Convert
  8266  	            var words = [];
  8267  	            for (var i = 0; i < hexStrLength; i += 2) {
  8268  	                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
  8269  	            }
  8270  
  8271  	            return new WordArray.init(words, hexStrLength / 2);
  8272  	        }
  8273  	    };
  8274  
  8275  	    /**
  8276  	     * Latin1 encoding strategy.
  8277  	     */
  8278  	    var Latin1 = C_enc.Latin1 = {
  8279  	        /**
  8280  	         * Converts a word array to a Latin1 string.
  8281  	         *
  8282  	         * @param {WordArray} wordArray The word array.
  8283  	         *
  8284  	         * @return {string} The Latin1 string.
  8285  	         *
  8286  	         * @static
  8287  	         *
  8288  	         * @example
  8289  	         *
  8290  	         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
  8291  	         */
  8292  	        stringify: function (wordArray) {
  8293  	            // Shortcuts
  8294  	            var words = wordArray.words;
  8295  	            var sigBytes = wordArray.sigBytes;
  8296  
  8297  	            // Convert
  8298  	            var latin1Chars = [];
  8299  	            for (var i = 0; i < sigBytes; i++) {
  8300  	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8301  	                latin1Chars.push(String.fromCharCode(bite));
  8302  	            }
  8303  
  8304  	            return latin1Chars.join('');
  8305  	        },
  8306  
  8307  	        /**
  8308  	         * Converts a Latin1 string to a word array.
  8309  	         *
  8310  	         * @param {string} latin1Str The Latin1 string.
  8311  	         *
  8312  	         * @return {WordArray} The word array.
  8313  	         *
  8314  	         * @static
  8315  	         *
  8316  	         * @example
  8317  	         *
  8318  	         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
  8319  	         */
  8320  	        parse: function (latin1Str) {
  8321  	            // Shortcut
  8322  	            var latin1StrLength = latin1Str.length;
  8323  
  8324  	            // Convert
  8325  	            var words = [];
  8326  	            for (var i = 0; i < latin1StrLength; i++) {
  8327  	                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
  8328  	            }
  8329  
  8330  	            return new WordArray.init(words, latin1StrLength);
  8331  	        }
  8332  	    };
  8333  
  8334  	    /**
  8335  	     * UTF-8 encoding strategy.
  8336  	     */
  8337  	    var Utf8 = C_enc.Utf8 = {
  8338  	        /**
  8339  	         * Converts a word array to a UTF-8 string.
  8340  	         *
  8341  	         * @param {WordArray} wordArray The word array.
  8342  	         *
  8343  	         * @return {string} The UTF-8 string.
  8344  	         *
  8345  	         * @static
  8346  	         *
  8347  	         * @example
  8348  	         *
  8349  	         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
  8350  	         */
  8351  	        stringify: function (wordArray) {
  8352  	            try {
  8353  	                return decodeURIComponent(escape(Latin1.stringify(wordArray)));
  8354  	            } catch (e) {
  8355  	                throw new Error('Malformed UTF-8 data');
  8356  	            }
  8357  	        },
  8358  
  8359  	        /**
  8360  	         * Converts a UTF-8 string to a word array.
  8361  	         *
  8362  	         * @param {string} utf8Str The UTF-8 string.
  8363  	         *
  8364  	         * @return {WordArray} The word array.
  8365  	         *
  8366  	         * @static
  8367  	         *
  8368  	         * @example
  8369  	         *
  8370  	         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
  8371  	         */
  8372  	        parse: function (utf8Str) {
  8373  	            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
  8374  	        }
  8375  	    };
  8376  
  8377  	    /**
  8378  	     * Abstract buffered block algorithm template.
  8379  	     *
  8380  	     * The property blockSize must be implemented in a concrete subtype.
  8381  	     *
  8382  	     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
  8383  	     */
  8384  	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
  8385  	        /**
  8386  	         * Resets this block algorithm's data buffer to its initial state.
  8387  	         *
  8388  	         * @example
  8389  	         *
  8390  	         *     bufferedBlockAlgorithm.reset();
  8391  	         */
  8392  	        reset: function () {
  8393  	            // Initial values
  8394  	            this._data = new WordArray.init();
  8395  	            this._nDataBytes = 0;
  8396  	        },
  8397  
  8398  	        /**
  8399  	         * Adds new data to this block algorithm's buffer.
  8400  	         *
  8401  	         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
  8402  	         *
  8403  	         * @example
  8404  	         *
  8405  	         *     bufferedBlockAlgorithm._append('data');
  8406  	         *     bufferedBlockAlgorithm._append(wordArray);
  8407  	         */
  8408  	        _append: function (data) {
  8409  	            // Convert string to WordArray, else assume WordArray already
  8410  	            if (typeof data == 'string') {
  8411  	                data = Utf8.parse(data);
  8412  	            }
  8413  
  8414  	            // Append
  8415  	            this._data.concat(data);
  8416  	            this._nDataBytes += data.sigBytes;
  8417  	        },
  8418  
  8419  	        /**
  8420  	         * Processes available data blocks.
  8421  	         *
  8422  	         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
  8423  	         *
  8424  	         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
  8425  	         *
  8426  	         * @return {WordArray} The processed data.
  8427  	         *
  8428  	         * @example
  8429  	         *
  8430  	         *     var processedData = bufferedBlockAlgorithm._process();
  8431  	         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
  8432  	         */
  8433  	        _process: function (doFlush) {
  8434  	            // Shortcuts
  8435  	            var data = this._data;
  8436  	            var dataWords = data.words;
  8437  	            var dataSigBytes = data.sigBytes;
  8438  	            var blockSize = this.blockSize;
  8439  	            var blockSizeBytes = blockSize * 4;
  8440  
  8441  	            // Count blocks ready
  8442  	            var nBlocksReady = dataSigBytes / blockSizeBytes;
  8443  	            if (doFlush) {
  8444  	                // Round up to include partial blocks
  8445  	                nBlocksReady = Math.ceil(nBlocksReady);
  8446  	            } else {
  8447  	                // Round down to include only full blocks,
  8448  	                // less the number of blocks that must remain in the buffer
  8449  	                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
  8450  	            }
  8451  
  8452  	            // Count words ready
  8453  	            var nWordsReady = nBlocksReady * blockSize;
  8454  
  8455  	            // Count bytes ready
  8456  	            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
  8457  
  8458  	            // Process blocks
  8459  	            if (nWordsReady) {
  8460  	                for (var offset = 0; offset < nWordsReady; offset += blockSize) {
  8461  	                    // Perform concrete-algorithm logic
  8462  	                    this._doProcessBlock(dataWords, offset);
  8463  	                }
  8464  
  8465  	                // Remove processed words
  8466  	                var processedWords = dataWords.splice(0, nWordsReady);
  8467  	                data.sigBytes -= nBytesReady;
  8468  	            }
  8469  
  8470  	            // Return processed words
  8471  	            return new WordArray.init(processedWords, nBytesReady);
  8472  	        },
  8473  
  8474  	        /**
  8475  	         * Creates a copy of this object.
  8476  	         *
  8477  	         * @return {Object} The clone.
  8478  	         *
  8479  	         * @example
  8480  	         *
  8481  	         *     var clone = bufferedBlockAlgorithm.clone();
  8482  	         */
  8483  	        clone: function () {
  8484  	            var clone = Base.clone.call(this);
  8485  	            clone._data = this._data.clone();
  8486  
  8487  	            return clone;
  8488  	        },
  8489  
  8490  	        _minBufferSize: 0
  8491  	    });
  8492  
  8493  	    /**
  8494  	     * Abstract hasher template.
  8495  	     *
  8496  	     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
  8497  	     */
  8498  	    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
  8499  	        /**
  8500  	         * Configuration options.
  8501  	         */
  8502  	        cfg: Base.extend(),
  8503  
  8504  	        /**
  8505  	         * Initializes a newly created hasher.
  8506  	         *
  8507  	         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
  8508  	         *
  8509  	         * @example
  8510  	         *
  8511  	         *     var hasher = CryptoJS.algo.SHA256.create();
  8512  	         */
  8513  	        init: function (cfg) {
  8514  	            // Apply config defaults
  8515  	            this.cfg = this.cfg.extend(cfg);
  8516  
  8517  	            // Set initial values
  8518  	            this.reset();
  8519  	        },
  8520  
  8521  	        /**
  8522  	         * Resets this hasher to its initial state.
  8523  	         *
  8524  	         * @example
  8525  	         *
  8526  	         *     hasher.reset();
  8527  	         */
  8528  	        reset: function () {
  8529  	            // Reset data buffer
  8530  	            BufferedBlockAlgorithm.reset.call(this);
  8531  
  8532  	            // Perform concrete-hasher logic
  8533  	            this._doReset();
  8534  	        },
  8535  
  8536  	        /**
  8537  	         * Updates this hasher with a message.
  8538  	         *
  8539  	         * @param {WordArray|string} messageUpdate The message to append.
  8540  	         *
  8541  	         * @return {Hasher} This hasher.
  8542  	         *
  8543  	         * @example
  8544  	         *
  8545  	         *     hasher.update('message');
  8546  	         *     hasher.update(wordArray);
  8547  	         */
  8548  	        update: function (messageUpdate) {
  8549  	            // Append
  8550  	            this._append(messageUpdate);
  8551  
  8552  	            // Update the hash
  8553  	            this._process();
  8554  
  8555  	            // Chainable
  8556  	            return this;
  8557  	        },
  8558  
  8559  	        /**
  8560  	         * Finalizes the hash computation.
  8561  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  8562  	         *
  8563  	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
  8564  	         *
  8565  	         * @return {WordArray} The hash.
  8566  	         *
  8567  	         * @example
  8568  	         *
  8569  	         *     var hash = hasher.finalize();
  8570  	         *     var hash = hasher.finalize('message');
  8571  	         *     var hash = hasher.finalize(wordArray);
  8572  	         */
  8573  	        finalize: function (messageUpdate) {
  8574  	            // Final message update
  8575  	            if (messageUpdate) {
  8576  	                this._append(messageUpdate);
  8577  	            }
  8578  
  8579  	            // Perform concrete-hasher logic
  8580  	            var hash = this._doFinalize();
  8581  
  8582  	            return hash;
  8583  	        },
  8584  
  8585  	        blockSize: 512/32,
  8586  
  8587  	        /**
  8588  	         * Creates a shortcut function to a hasher's object interface.
  8589  	         *
  8590  	         * @param {Hasher} hasher The hasher to create a helper for.
  8591  	         *
  8592  	         * @return {Function} The shortcut function.
  8593  	         *
  8594  	         * @static
  8595  	         *
  8596  	         * @example
  8597  	         *
  8598  	         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
  8599  	         */
  8600  	        _createHelper: function (hasher) {
  8601  	            return function (message, cfg) {
  8602  	                return new hasher.init(cfg).finalize(message);
  8603  	            };
  8604  	        },
  8605  
  8606  	        /**
  8607  	         * Creates a shortcut function to the HMAC's object interface.
  8608  	         *
  8609  	         * @param {Hasher} hasher The hasher to use in this HMAC helper.
  8610  	         *
  8611  	         * @return {Function} The shortcut function.
  8612  	         *
  8613  	         * @static
  8614  	         *
  8615  	         * @example
  8616  	         *
  8617  	         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
  8618  	         */
  8619  	        _createHmacHelper: function (hasher) {
  8620  	            return function (message, key) {
  8621  	                return new C_algo.HMAC.init(hasher, key).finalize(message);
  8622  	            };
  8623  	        }
  8624  	    });
  8625  
  8626  	    /**
  8627  	     * Algorithm namespace.
  8628  	     */
  8629  	    var C_algo = C.algo = {};
  8630  
  8631  	    return C;
  8632  	}(Math));
  8633  
  8634  
  8635  	return CryptoJS;
  8636  
  8637  }));
  8638  },{}],54:[function(require,module,exports){
  8639  ;(function (root, factory) {
  8640  	if (typeof exports === "object") {
  8641  		// CommonJS
  8642  		module.exports = exports = factory(require("./core"));
  8643  	}
  8644  	else if (typeof define === "function" && define.amd) {
  8645  		// AMD
  8646  		define(["./core"], factory);
  8647  	}
  8648  	else {
  8649  		// Global (browser)
  8650  		factory(root.CryptoJS);
  8651  	}
  8652  }(this, function (CryptoJS) {
  8653  
  8654  	(function () {
  8655  	    // Shortcuts
  8656  	    var C = CryptoJS;
  8657  	    var C_lib = C.lib;
  8658  	    var WordArray = C_lib.WordArray;
  8659  	    var C_enc = C.enc;
  8660  
  8661  	    /**
  8662  	     * Base64 encoding strategy.
  8663  	     */
  8664  	    var Base64 = C_enc.Base64 = {
  8665  	        /**
  8666  	         * Converts a word array to a Base64 string.
  8667  	         *
  8668  	         * @param {WordArray} wordArray The word array.
  8669  	         *
  8670  	         * @return {string} The Base64 string.
  8671  	         *
  8672  	         * @static
  8673  	         *
  8674  	         * @example
  8675  	         *
  8676  	         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);
  8677  	         */
  8678  	        stringify: function (wordArray) {
  8679  	            // Shortcuts
  8680  	            var words = wordArray.words;
  8681  	            var sigBytes = wordArray.sigBytes;
  8682  	            var map = this._map;
  8683  
  8684  	            // Clamp excess bits
  8685  	            wordArray.clamp();
  8686  
  8687  	            // Convert
  8688  	            var base64Chars = [];
  8689  	            for (var i = 0; i < sigBytes; i += 3) {
  8690  	                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
  8691  	                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
  8692  	                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
  8693  
  8694  	                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
  8695  
  8696  	                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
  8697  	                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
  8698  	                }
  8699  	            }
  8700  
  8701  	            // Add padding
  8702  	            var paddingChar = map.charAt(64);
  8703  	            if (paddingChar) {
  8704  	                while (base64Chars.length % 4) {
  8705  	                    base64Chars.push(paddingChar);
  8706  	                }
  8707  	            }
  8708  
  8709  	            return base64Chars.join('');
  8710  	        },
  8711  
  8712  	        /**
  8713  	         * Converts a Base64 string to a word array.
  8714  	         *
  8715  	         * @param {string} base64Str The Base64 string.
  8716  	         *
  8717  	         * @return {WordArray} The word array.
  8718  	         *
  8719  	         * @static
  8720  	         *
  8721  	         * @example
  8722  	         *
  8723  	         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);
  8724  	         */
  8725  	        parse: function (base64Str) {
  8726  	            // Shortcuts
  8727  	            var base64StrLength = base64Str.length;
  8728  	            var map = this._map;
  8729  	            var reverseMap = this._reverseMap;
  8730  
  8731  	            if (!reverseMap) {
  8732  	                    reverseMap = this._reverseMap = [];
  8733  	                    for (var j = 0; j < map.length; j++) {
  8734  	                        reverseMap[map.charCodeAt(j)] = j;
  8735  	                    }
  8736  	            }
  8737  
  8738  	            // Ignore padding
  8739  	            var paddingChar = map.charAt(64);
  8740  	            if (paddingChar) {
  8741  	                var paddingIndex = base64Str.indexOf(paddingChar);
  8742  	                if (paddingIndex !== -1) {
  8743  	                    base64StrLength = paddingIndex;
  8744  	                }
  8745  	            }
  8746  
  8747  	            // Convert
  8748  	            return parseLoop(base64Str, base64StrLength, reverseMap);
  8749  
  8750  	        },
  8751  
  8752  	        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  8753  	    };
  8754  
  8755  	    function parseLoop(base64Str, base64StrLength, reverseMap) {
  8756  	      var words = [];
  8757  	      var nBytes = 0;
  8758  	      for (var i = 0; i < base64StrLength; i++) {
  8759  	          if (i % 4) {
  8760  	              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
  8761  	              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
  8762  	              words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
  8763  	              nBytes++;
  8764  	          }
  8765  	      }
  8766  	      return WordArray.create(words, nBytes);
  8767  	    }
  8768  	}());
  8769  
  8770  
  8771  	return CryptoJS.enc.Base64;
  8772  
  8773  }));
  8774  },{"./core":53}],55:[function(require,module,exports){
  8775  ;(function (root, factory) {
  8776  	if (typeof exports === "object") {
  8777  		// CommonJS
  8778  		module.exports = exports = factory(require("./core"));
  8779  	}
  8780  	else if (typeof define === "function" && define.amd) {
  8781  		// AMD
  8782  		define(["./core"], factory);
  8783  	}
  8784  	else {
  8785  		// Global (browser)
  8786  		factory(root.CryptoJS);
  8787  	}
  8788  }(this, function (CryptoJS) {
  8789  
  8790  	(function () {
  8791  	    // Shortcuts
  8792  	    var C = CryptoJS;
  8793  	    var C_lib = C.lib;
  8794  	    var WordArray = C_lib.WordArray;
  8795  	    var C_enc = C.enc;
  8796  
  8797  	    /**
  8798  	     * UTF-16 BE encoding strategy.
  8799  	     */
  8800  	    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
  8801  	        /**
  8802  	         * Converts a word array to a UTF-16 BE string.
  8803  	         *
  8804  	         * @param {WordArray} wordArray The word array.
  8805  	         *
  8806  	         * @return {string} The UTF-16 BE string.
  8807  	         *
  8808  	         * @static
  8809  	         *
  8810  	         * @example
  8811  	         *
  8812  	         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
  8813  	         */
  8814  	        stringify: function (wordArray) {
  8815  	            // Shortcuts
  8816  	            var words = wordArray.words;
  8817  	            var sigBytes = wordArray.sigBytes;
  8818  
  8819  	            // Convert
  8820  	            var utf16Chars = [];
  8821  	            for (var i = 0; i < sigBytes; i += 2) {
  8822  	                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
  8823  	                utf16Chars.push(String.fromCharCode(codePoint));
  8824  	            }
  8825  
  8826  	            return utf16Chars.join('');
  8827  	        },
  8828  
  8829  	        /**
  8830  	         * Converts a UTF-16 BE string to a word array.
  8831  	         *
  8832  	         * @param {string} utf16Str The UTF-16 BE string.
  8833  	         *
  8834  	         * @return {WordArray} The word array.
  8835  	         *
  8836  	         * @static
  8837  	         *
  8838  	         * @example
  8839  	         *
  8840  	         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
  8841  	         */
  8842  	        parse: function (utf16Str) {
  8843  	            // Shortcut
  8844  	            var utf16StrLength = utf16Str.length;
  8845  
  8846  	            // Convert
  8847  	            var words = [];
  8848  	            for (var i = 0; i < utf16StrLength; i++) {
  8849  	                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
  8850  	            }
  8851  
  8852  	            return WordArray.create(words, utf16StrLength * 2);
  8853  	        }
  8854  	    };
  8855  
  8856  	    /**
  8857  	     * UTF-16 LE encoding strategy.
  8858  	     */
  8859  	    C_enc.Utf16LE = {
  8860  	        /**
  8861  	         * Converts a word array to a UTF-16 LE string.
  8862  	         *
  8863  	         * @param {WordArray} wordArray The word array.
  8864  	         *
  8865  	         * @return {string} The UTF-16 LE string.
  8866  	         *
  8867  	         * @static
  8868  	         *
  8869  	         * @example
  8870  	         *
  8871  	         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
  8872  	         */
  8873  	        stringify: function (wordArray) {
  8874  	            // Shortcuts
  8875  	            var words = wordArray.words;
  8876  	            var sigBytes = wordArray.sigBytes;
  8877  
  8878  	            // Convert
  8879  	            var utf16Chars = [];
  8880  	            for (var i = 0; i < sigBytes; i += 2) {
  8881  	                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
  8882  	                utf16Chars.push(String.fromCharCode(codePoint));
  8883  	            }
  8884  
  8885  	            return utf16Chars.join('');
  8886  	        },
  8887  
  8888  	        /**
  8889  	         * Converts a UTF-16 LE string to a word array.
  8890  	         *
  8891  	         * @param {string} utf16Str The UTF-16 LE string.
  8892  	         *
  8893  	         * @return {WordArray} The word array.
  8894  	         *
  8895  	         * @static
  8896  	         *
  8897  	         * @example
  8898  	         *
  8899  	         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
  8900  	         */
  8901  	        parse: function (utf16Str) {
  8902  	            // Shortcut
  8903  	            var utf16StrLength = utf16Str.length;
  8904  
  8905  	            // Convert
  8906  	            var words = [];
  8907  	            for (var i = 0; i < utf16StrLength; i++) {
  8908  	                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
  8909  	            }
  8910  
  8911  	            return WordArray.create(words, utf16StrLength * 2);
  8912  	        }
  8913  	    };
  8914  
  8915  	    function swapEndian(word) {
  8916  	        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
  8917  	    }
  8918  	}());
  8919  
  8920  
  8921  	return CryptoJS.enc.Utf16;
  8922  
  8923  }));
  8924  },{"./core":53}],56:[function(require,module,exports){
  8925  ;(function (root, factory, undef) {
  8926  	if (typeof exports === "object") {
  8927  		// CommonJS
  8928  		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
  8929  	}
  8930  	else if (typeof define === "function" && define.amd) {
  8931  		// AMD
  8932  		define(["./core", "./sha1", "./hmac"], factory);
  8933  	}
  8934  	else {
  8935  		// Global (browser)
  8936  		factory(root.CryptoJS);
  8937  	}
  8938  }(this, function (CryptoJS) {
  8939  
  8940  	(function () {
  8941  	    // Shortcuts
  8942  	    var C = CryptoJS;
  8943  	    var C_lib = C.lib;
  8944  	    var Base = C_lib.Base;
  8945  	    var WordArray = C_lib.WordArray;
  8946  	    var C_algo = C.algo;
  8947  	    var MD5 = C_algo.MD5;
  8948  
  8949  	    /**
  8950  	     * This key derivation function is meant to conform with EVP_BytesToKey.
  8951  	     * www.openssl.org/docs/crypto/EVP_BytesToKey.html
  8952  	     */
  8953  	    var EvpKDF = C_algo.EvpKDF = Base.extend({
  8954  	        /**
  8955  	         * Configuration options.
  8956  	         *
  8957  	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
  8958  	         * @property {Hasher} hasher The hash algorithm to use. Default: MD5
  8959  	         * @property {number} iterations The number of iterations to perform. Default: 1
  8960  	         */
  8961  	        cfg: Base.extend({
  8962  	            keySize: 128/32,
  8963  	            hasher: MD5,
  8964  	            iterations: 1
  8965  	        }),
  8966  
  8967  	        /**
  8968  	         * Initializes a newly created key derivation function.
  8969  	         *
  8970  	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
  8971  	         *
  8972  	         * @example
  8973  	         *
  8974  	         *     var kdf = CryptoJS.algo.EvpKDF.create();
  8975  	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
  8976  	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
  8977  	         */
  8978  	        init: function (cfg) {
  8979  	            this.cfg = this.cfg.extend(cfg);
  8980  	        },
  8981  
  8982  	        /**
  8983  	         * Derives a key from a password.
  8984  	         *
  8985  	         * @param {WordArray|string} password The password.
  8986  	         * @param {WordArray|string} salt A salt.
  8987  	         *
  8988  	         * @return {WordArray} The derived key.
  8989  	         *
  8990  	         * @example
  8991  	         *
  8992  	         *     var key = kdf.compute(password, salt);
  8993  	         */
  8994  	        compute: function (password, salt) {
  8995  	            // Shortcut
  8996  	            var cfg = this.cfg;
  8997  
  8998  	            // Init hasher
  8999  	            var hasher = cfg.hasher.create();
  9000  
  9001  	            // Initial values
  9002  	            var derivedKey = WordArray.create();
  9003  
  9004  	            // Shortcuts
  9005  	            var derivedKeyWords = derivedKey.words;
  9006  	            var keySize = cfg.keySize;
  9007  	            var iterations = cfg.iterations;
  9008  
  9009  	            // Generate key
  9010  	            while (derivedKeyWords.length < keySize) {
  9011  	                if (block) {
  9012  	                    hasher.update(block);
  9013  	                }
  9014  	                var block = hasher.update(password).finalize(salt);
  9015  	                hasher.reset();
  9016  
  9017  	                // Iterations
  9018  	                for (var i = 1; i < iterations; i++) {
  9019  	                    block = hasher.finalize(block);
  9020  	                    hasher.reset();
  9021  	                }
  9022  
  9023  	                derivedKey.concat(block);
  9024  	            }
  9025  	            derivedKey.sigBytes = keySize * 4;
  9026  
  9027  	            return derivedKey;
  9028  	        }
  9029  	    });
  9030  
  9031  	    /**
  9032  	     * Derives a key from a password.
  9033  	     *
  9034  	     * @param {WordArray|string} password The password.
  9035  	     * @param {WordArray|string} salt A salt.
  9036  	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
  9037  	     *
  9038  	     * @return {WordArray} The derived key.
  9039  	     *
  9040  	     * @static
  9041  	     *
  9042  	     * @example
  9043  	     *
  9044  	     *     var key = CryptoJS.EvpKDF(password, salt);
  9045  	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
  9046  	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
  9047  	     */
  9048  	    C.EvpKDF = function (password, salt, cfg) {
  9049  	        return EvpKDF.create(cfg).compute(password, salt);
  9050  	    };
  9051  	}());
  9052  
  9053  
  9054  	return CryptoJS.EvpKDF;
  9055  
  9056  }));
  9057  },{"./core":53,"./hmac":58,"./sha1":77}],57:[function(require,module,exports){
  9058  ;(function (root, factory, undef) {
  9059  	if (typeof exports === "object") {
  9060  		// CommonJS
  9061  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9062  	}
  9063  	else if (typeof define === "function" && define.amd) {
  9064  		// AMD
  9065  		define(["./core", "./cipher-core"], factory);
  9066  	}
  9067  	else {
  9068  		// Global (browser)
  9069  		factory(root.CryptoJS);
  9070  	}
  9071  }(this, function (CryptoJS) {
  9072  
  9073  	(function (undefined) {
  9074  	    // Shortcuts
  9075  	    var C = CryptoJS;
  9076  	    var C_lib = C.lib;
  9077  	    var CipherParams = C_lib.CipherParams;
  9078  	    var C_enc = C.enc;
  9079  	    var Hex = C_enc.Hex;
  9080  	    var C_format = C.format;
  9081  
  9082  	    var HexFormatter = C_format.Hex = {
  9083  	        /**
  9084  	         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
  9085  	         *
  9086  	         * @param {CipherParams} cipherParams The cipher params object.
  9087  	         *
  9088  	         * @return {string} The hexadecimally encoded string.
  9089  	         *
  9090  	         * @static
  9091  	         *
  9092  	         * @example
  9093  	         *
  9094  	         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);
  9095  	         */
  9096  	        stringify: function (cipherParams) {
  9097  	            return cipherParams.ciphertext.toString(Hex);
  9098  	        },
  9099  
  9100  	        /**
  9101  	         * Converts a hexadecimally encoded ciphertext string to a cipher params object.
  9102  	         *
  9103  	         * @param {string} input The hexadecimally encoded string.
  9104  	         *
  9105  	         * @return {CipherParams} The cipher params object.
  9106  	         *
  9107  	         * @static
  9108  	         *
  9109  	         * @example
  9110  	         *
  9111  	         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);
  9112  	         */
  9113  	        parse: function (input) {
  9114  	            var ciphertext = Hex.parse(input);
  9115  	            return CipherParams.create({ ciphertext: ciphertext });
  9116  	        }
  9117  	    };
  9118  	}());
  9119  
  9120  
  9121  	return CryptoJS.format.Hex;
  9122  
  9123  }));
  9124  },{"./cipher-core":52,"./core":53}],58:[function(require,module,exports){
  9125  ;(function (root, factory) {
  9126  	if (typeof exports === "object") {
  9127  		// CommonJS
  9128  		module.exports = exports = factory(require("./core"));
  9129  	}
  9130  	else if (typeof define === "function" && define.amd) {
  9131  		// AMD
  9132  		define(["./core"], factory);
  9133  	}
  9134  	else {
  9135  		// Global (browser)
  9136  		factory(root.CryptoJS);
  9137  	}
  9138  }(this, function (CryptoJS) {
  9139  
  9140  	(function () {
  9141  	    // Shortcuts
  9142  	    var C = CryptoJS;
  9143  	    var C_lib = C.lib;
  9144  	    var Base = C_lib.Base;
  9145  	    var C_enc = C.enc;
  9146  	    var Utf8 = C_enc.Utf8;
  9147  	    var C_algo = C.algo;
  9148  
  9149  	    /**
  9150  	     * HMAC algorithm.
  9151  	     */
  9152  	    var HMAC = C_algo.HMAC = Base.extend({
  9153  	        /**
  9154  	         * Initializes a newly created HMAC.
  9155  	         *
  9156  	         * @param {Hasher} hasher The hash algorithm to use.
  9157  	         * @param {WordArray|string} key The secret key.
  9158  	         *
  9159  	         * @example
  9160  	         *
  9161  	         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
  9162  	         */
  9163  	        init: function (hasher, key) {
  9164  	            // Init hasher
  9165  	            hasher = this._hasher = new hasher.init();
  9166  
  9167  	            // Convert string to WordArray, else assume WordArray already
  9168  	            if (typeof key == 'string') {
  9169  	                key = Utf8.parse(key);
  9170  	            }
  9171  
  9172  	            // Shortcuts
  9173  	            var hasherBlockSize = hasher.blockSize;
  9174  	            var hasherBlockSizeBytes = hasherBlockSize * 4;
  9175  
  9176  	            // Allow arbitrary length keys
  9177  	            if (key.sigBytes > hasherBlockSizeBytes) {
  9178  	                key = hasher.finalize(key);
  9179  	            }
  9180  
  9181  	            // Clamp excess bits
  9182  	            key.clamp();
  9183  
  9184  	            // Clone key for inner and outer pads
  9185  	            var oKey = this._oKey = key.clone();
  9186  	            var iKey = this._iKey = key.clone();
  9187  
  9188  	            // Shortcuts
  9189  	            var oKeyWords = oKey.words;
  9190  	            var iKeyWords = iKey.words;
  9191  
  9192  	            // XOR keys with pad constants
  9193  	            for (var i = 0; i < hasherBlockSize; i++) {
  9194  	                oKeyWords[i] ^= 0x5c5c5c5c;
  9195  	                iKeyWords[i] ^= 0x36363636;
  9196  	            }
  9197  	            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
  9198  
  9199  	            // Set initial values
  9200  	            this.reset();
  9201  	        },
  9202  
  9203  	        /**
  9204  	         * Resets this HMAC to its initial state.
  9205  	         *
  9206  	         * @example
  9207  	         *
  9208  	         *     hmacHasher.reset();
  9209  	         */
  9210  	        reset: function () {
  9211  	            // Shortcut
  9212  	            var hasher = this._hasher;
  9213  
  9214  	            // Reset
  9215  	            hasher.reset();
  9216  	            hasher.update(this._iKey);
  9217  	        },
  9218  
  9219  	        /**
  9220  	         * Updates this HMAC with a message.
  9221  	         *
  9222  	         * @param {WordArray|string} messageUpdate The message to append.
  9223  	         *
  9224  	         * @return {HMAC} This HMAC instance.
  9225  	         *
  9226  	         * @example
  9227  	         *
  9228  	         *     hmacHasher.update('message');
  9229  	         *     hmacHasher.update(wordArray);
  9230  	         */
  9231  	        update: function (messageUpdate) {
  9232  	            this._hasher.update(messageUpdate);
  9233  
  9234  	            // Chainable
  9235  	            return this;
  9236  	        },
  9237  
  9238  	        /**
  9239  	         * Finalizes the HMAC computation.
  9240  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  9241  	         *
  9242  	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
  9243  	         *
  9244  	         * @return {WordArray} The HMAC.
  9245  	         *
  9246  	         * @example
  9247  	         *
  9248  	         *     var hmac = hmacHasher.finalize();
  9249  	         *     var hmac = hmacHasher.finalize('message');
  9250  	         *     var hmac = hmacHasher.finalize(wordArray);
  9251  	         */
  9252  	        finalize: function (messageUpdate) {
  9253  	            // Shortcut
  9254  	            var hasher = this._hasher;
  9255  
  9256  	            // Compute HMAC
  9257  	            var innerHash = hasher.finalize(messageUpdate);
  9258  	            hasher.reset();
  9259  	            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
  9260  
  9261  	            return hmac;
  9262  	        }
  9263  	    });
  9264  	}());
  9265  
  9266  
  9267  }));
  9268  },{"./core":53}],59:[function(require,module,exports){
  9269  ;(function (root, factory, undef) {
  9270  	if (typeof exports === "object") {
  9271  		// CommonJS
  9272  		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"));
  9273  	}
  9274  	else if (typeof define === "function" && define.amd) {
  9275  		// AMD
  9276  		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);
  9277  	}
  9278  	else {
  9279  		// Global (browser)
  9280  		root.CryptoJS = factory(root.CryptoJS);
  9281  	}
  9282  }(this, function (CryptoJS) {
  9283  
  9284  	return CryptoJS;
  9285  
  9286  }));
  9287  },{"./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){
  9288  ;(function (root, factory) {
  9289  	if (typeof exports === "object") {
  9290  		// CommonJS
  9291  		module.exports = exports = factory(require("./core"));
  9292  	}
  9293  	else if (typeof define === "function" && define.amd) {
  9294  		// AMD
  9295  		define(["./core"], factory);
  9296  	}
  9297  	else {
  9298  		// Global (browser)
  9299  		factory(root.CryptoJS);
  9300  	}
  9301  }(this, function (CryptoJS) {
  9302  
  9303  	(function () {
  9304  	    // Check if typed arrays are supported
  9305  	    if (typeof ArrayBuffer != 'function') {
  9306  	        return;
  9307  	    }
  9308  
  9309  	    // Shortcuts
  9310  	    var C = CryptoJS;
  9311  	    var C_lib = C.lib;
  9312  	    var WordArray = C_lib.WordArray;
  9313  
  9314  	    // Reference original init
  9315  	    var superInit = WordArray.init;
  9316  
  9317  	    // Augment WordArray.init to handle typed arrays
  9318  	    var subInit = WordArray.init = function (typedArray) {
  9319  	        // Convert buffers to uint8
  9320  	        if (typedArray instanceof ArrayBuffer) {
  9321  	            typedArray = new Uint8Array(typedArray);
  9322  	        }
  9323  
  9324  	        // Convert other array views to uint8
  9325  	        if (
  9326  	            typedArray instanceof Int8Array ||
  9327  	            (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
  9328  	            typedArray instanceof Int16Array ||
  9329  	            typedArray instanceof Uint16Array ||
  9330  	            typedArray instanceof Int32Array ||
  9331  	            typedArray instanceof Uint32Array ||
  9332  	            typedArray instanceof Float32Array ||
  9333  	            typedArray instanceof Float64Array
  9334  	        ) {
  9335  	            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
  9336  	        }
  9337  
  9338  	        // Handle Uint8Array
  9339  	        if (typedArray instanceof Uint8Array) {
  9340  	            // Shortcut
  9341  	            var typedArrayByteLength = typedArray.byteLength;
  9342  
  9343  	            // Extract bytes
  9344  	            var words = [];
  9345  	            for (var i = 0; i < typedArrayByteLength; i++) {
  9346  	                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
  9347  	            }
  9348  
  9349  	            // Initialize this word array
  9350  	            superInit.call(this, words, typedArrayByteLength);
  9351  	        } else {
  9352  	            // Else call normal init
  9353  	            superInit.apply(this, arguments);
  9354  	        }
  9355  	    };
  9356  
  9357  	    subInit.prototype = WordArray;
  9358  	}());
  9359  
  9360  
  9361  	return CryptoJS.lib.WordArray;
  9362  
  9363  }));
  9364  },{"./core":53}],61:[function(require,module,exports){
  9365  ;(function (root, factory) {
  9366  	if (typeof exports === "object") {
  9367  		// CommonJS
  9368  		module.exports = exports = factory(require("./core"));
  9369  	}
  9370  	else if (typeof define === "function" && define.amd) {
  9371  		// AMD
  9372  		define(["./core"], factory);
  9373  	}
  9374  	else {
  9375  		// Global (browser)
  9376  		factory(root.CryptoJS);
  9377  	}
  9378  }(this, function (CryptoJS) {
  9379  
  9380  	(function (Math) {
  9381  	    // Shortcuts
  9382  	    var C = CryptoJS;
  9383  	    var C_lib = C.lib;
  9384  	    var WordArray = C_lib.WordArray;
  9385  	    var Hasher = C_lib.Hasher;
  9386  	    var C_algo = C.algo;
  9387  
  9388  	    // Constants table
  9389  	    var T = [];
  9390  
  9391  	    // Compute constants
  9392  	    (function () {
  9393  	        for (var i = 0; i < 64; i++) {
  9394  	            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
  9395  	        }
  9396  	    }());
  9397  
  9398  	    /**
  9399  	     * MD5 hash algorithm.
  9400  	     */
  9401  	    var MD5 = C_algo.MD5 = Hasher.extend({
  9402  	        _doReset: function () {
  9403  	            this._hash = new WordArray.init([
  9404  	                0x67452301, 0xefcdab89,
  9405  	                0x98badcfe, 0x10325476
  9406  	            ]);
  9407  	        },
  9408  
  9409  	        _doProcessBlock: function (M, offset) {
  9410  	            // Swap endian
  9411  	            for (var i = 0; i < 16; i++) {
  9412  	                // Shortcuts
  9413  	                var offset_i = offset + i;
  9414  	                var M_offset_i = M[offset_i];
  9415  
  9416  	                M[offset_i] = (
  9417  	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
  9418  	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
  9419  	                );
  9420  	            }
  9421  
  9422  	            // Shortcuts
  9423  	            var H = this._hash.words;
  9424  
  9425  	            var M_offset_0  = M[offset + 0];
  9426  	            var M_offset_1  = M[offset + 1];
  9427  	            var M_offset_2  = M[offset + 2];
  9428  	            var M_offset_3  = M[offset + 3];
  9429  	            var M_offset_4  = M[offset + 4];
  9430  	            var M_offset_5  = M[offset + 5];
  9431  	            var M_offset_6  = M[offset + 6];
  9432  	            var M_offset_7  = M[offset + 7];
  9433  	            var M_offset_8  = M[offset + 8];
  9434  	            var M_offset_9  = M[offset + 9];
  9435  	            var M_offset_10 = M[offset + 10];
  9436  	            var M_offset_11 = M[offset + 11];
  9437  	            var M_offset_12 = M[offset + 12];
  9438  	            var M_offset_13 = M[offset + 13];
  9439  	            var M_offset_14 = M[offset + 14];
  9440  	            var M_offset_15 = M[offset + 15];
  9441  
  9442  	            // Working varialbes
  9443  	            var a = H[0];
  9444  	            var b = H[1];
  9445  	            var c = H[2];
  9446  	            var d = H[3];
  9447  
  9448  	            // Computation
  9449  	            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);
  9450  	            d = FF(d, a, b, c, M_offset_1,  12, T[1]);
  9451  	            c = FF(c, d, a, b, M_offset_2,  17, T[2]);
  9452  	            b = FF(b, c, d, a, M_offset_3,  22, T[3]);
  9453  	            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);
  9454  	            d = FF(d, a, b, c, M_offset_5,  12, T[5]);
  9455  	            c = FF(c, d, a, b, M_offset_6,  17, T[6]);
  9456  	            b = FF(b, c, d, a, M_offset_7,  22, T[7]);
  9457  	            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);
  9458  	            d = FF(d, a, b, c, M_offset_9,  12, T[9]);
  9459  	            c = FF(c, d, a, b, M_offset_10, 17, T[10]);
  9460  	            b = FF(b, c, d, a, M_offset_11, 22, T[11]);
  9461  	            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);
  9462  	            d = FF(d, a, b, c, M_offset_13, 12, T[13]);
  9463  	            c = FF(c, d, a, b, M_offset_14, 17, T[14]);
  9464  	            b = FF(b, c, d, a, M_offset_15, 22, T[15]);
  9465  
  9466  	            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);
  9467  	            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);
  9468  	            c = GG(c, d, a, b, M_offset_11, 14, T[18]);
  9469  	            b = GG(b, c, d, a, M_offset_0,  20, T[19]);
  9470  	            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);
  9471  	            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);
  9472  	            c = GG(c, d, a, b, M_offset_15, 14, T[22]);
  9473  	            b = GG(b, c, d, a, M_offset_4,  20, T[23]);
  9474  	            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);
  9475  	            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);
  9476  	            c = GG(c, d, a, b, M_offset_3,  14, T[26]);
  9477  	            b = GG(b, c, d, a, M_offset_8,  20, T[27]);
  9478  	            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);
  9479  	            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);
  9480  	            c = GG(c, d, a, b, M_offset_7,  14, T[30]);
  9481  	            b = GG(b, c, d, a, M_offset_12, 20, T[31]);
  9482  
  9483  	            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);
  9484  	            d = HH(d, a, b, c, M_offset_8,  11, T[33]);
  9485  	            c = HH(c, d, a, b, M_offset_11, 16, T[34]);
  9486  	            b = HH(b, c, d, a, M_offset_14, 23, T[35]);
  9487  	            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);
  9488  	            d = HH(d, a, b, c, M_offset_4,  11, T[37]);
  9489  	            c = HH(c, d, a, b, M_offset_7,  16, T[38]);
  9490  	            b = HH(b, c, d, a, M_offset_10, 23, T[39]);
  9491  	            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);
  9492  	            d = HH(d, a, b, c, M_offset_0,  11, T[41]);
  9493  	            c = HH(c, d, a, b, M_offset_3,  16, T[42]);
  9494  	            b = HH(b, c, d, a, M_offset_6,  23, T[43]);
  9495  	            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);
  9496  	            d = HH(d, a, b, c, M_offset_12, 11, T[45]);
  9497  	            c = HH(c, d, a, b, M_offset_15, 16, T[46]);
  9498  	            b = HH(b, c, d, a, M_offset_2,  23, T[47]);
  9499  
  9500  	            a = II(a, b, c, d, M_offset_0,  6,  T[48]);
  9501  	            d = II(d, a, b, c, M_offset_7,  10, T[49]);
  9502  	            c = II(c, d, a, b, M_offset_14, 15, T[50]);
  9503  	            b = II(b, c, d, a, M_offset_5,  21, T[51]);
  9504  	            a = II(a, b, c, d, M_offset_12, 6,  T[52]);
  9505  	            d = II(d, a, b, c, M_offset_3,  10, T[53]);
  9506  	            c = II(c, d, a, b, M_offset_10, 15, T[54]);
  9507  	            b = II(b, c, d, a, M_offset_1,  21, T[55]);
  9508  	            a = II(a, b, c, d, M_offset_8,  6,  T[56]);
  9509  	            d = II(d, a, b, c, M_offset_15, 10, T[57]);
  9510  	            c = II(c, d, a, b, M_offset_6,  15, T[58]);
  9511  	            b = II(b, c, d, a, M_offset_13, 21, T[59]);
  9512  	            a = II(a, b, c, d, M_offset_4,  6,  T[60]);
  9513  	            d = II(d, a, b, c, M_offset_11, 10, T[61]);
  9514  	            c = II(c, d, a, b, M_offset_2,  15, T[62]);
  9515  	            b = II(b, c, d, a, M_offset_9,  21, T[63]);
  9516  
  9517  	            // Intermediate hash value
  9518  	            H[0] = (H[0] + a) | 0;
  9519  	            H[1] = (H[1] + b) | 0;
  9520  	            H[2] = (H[2] + c) | 0;
  9521  	            H[3] = (H[3] + d) | 0;
  9522  	        },
  9523  
  9524  	        _doFinalize: function () {
  9525  	            // Shortcuts
  9526  	            var data = this._data;
  9527  	            var dataWords = data.words;
  9528  
  9529  	            var nBitsTotal = this._nDataBytes * 8;
  9530  	            var nBitsLeft = data.sigBytes * 8;
  9531  
  9532  	            // Add padding
  9533  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
  9534  
  9535  	            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
  9536  	            var nBitsTotalL = nBitsTotal;
  9537  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
  9538  	                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
  9539  	                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)
  9540  	            );
  9541  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
  9542  	                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
  9543  	                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)
  9544  	            );
  9545  
  9546  	            data.sigBytes = (dataWords.length + 1) * 4;
  9547  
  9548  	            // Hash final blocks
  9549  	            this._process();
  9550  
  9551  	            // Shortcuts
  9552  	            var hash = this._hash;
  9553  	            var H = hash.words;
  9554  
  9555  	            // Swap endian
  9556  	            for (var i = 0; i < 4; i++) {
  9557  	                // Shortcut
  9558  	                var H_i = H[i];
  9559  
  9560  	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
  9561  	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
  9562  	            }
  9563  
  9564  	            // Return final computed hash
  9565  	            return hash;
  9566  	        },
  9567  
  9568  	        clone: function () {
  9569  	            var clone = Hasher.clone.call(this);
  9570  	            clone._hash = this._hash.clone();
  9571  
  9572  	            return clone;
  9573  	        }
  9574  	    });
  9575  
  9576  	    function FF(a, b, c, d, x, s, t) {
  9577  	        var n = a + ((b & c) | (~b & d)) + x + t;
  9578  	        return ((n << s) | (n >>> (32 - s))) + b;
  9579  	    }
  9580  
  9581  	    function GG(a, b, c, d, x, s, t) {
  9582  	        var n = a + ((b & d) | (c & ~d)) + x + t;
  9583  	        return ((n << s) | (n >>> (32 - s))) + b;
  9584  	    }
  9585  
  9586  	    function HH(a, b, c, d, x, s, t) {
  9587  	        var n = a + (b ^ c ^ d) + x + t;
  9588  	        return ((n << s) | (n >>> (32 - s))) + b;
  9589  	    }
  9590  
  9591  	    function II(a, b, c, d, x, s, t) {
  9592  	        var n = a + (c ^ (b | ~d)) + x + t;
  9593  	        return ((n << s) | (n >>> (32 - s))) + b;
  9594  	    }
  9595  
  9596  	    /**
  9597  	     * Shortcut function to the hasher's object interface.
  9598  	     *
  9599  	     * @param {WordArray|string} message The message to hash.
  9600  	     *
  9601  	     * @return {WordArray} The hash.
  9602  	     *
  9603  	     * @static
  9604  	     *
  9605  	     * @example
  9606  	     *
  9607  	     *     var hash = CryptoJS.MD5('message');
  9608  	     *     var hash = CryptoJS.MD5(wordArray);
  9609  	     */
  9610  	    C.MD5 = Hasher._createHelper(MD5);
  9611  
  9612  	    /**
  9613  	     * Shortcut function to the HMAC's object interface.
  9614  	     *
  9615  	     * @param {WordArray|string} message The message to hash.
  9616  	     * @param {WordArray|string} key The secret key.
  9617  	     *
  9618  	     * @return {WordArray} The HMAC.
  9619  	     *
  9620  	     * @static
  9621  	     *
  9622  	     * @example
  9623  	     *
  9624  	     *     var hmac = CryptoJS.HmacMD5(message, key);
  9625  	     */
  9626  	    C.HmacMD5 = Hasher._createHmacHelper(MD5);
  9627  	}(Math));
  9628  
  9629  
  9630  	return CryptoJS.MD5;
  9631  
  9632  }));
  9633  },{"./core":53}],62:[function(require,module,exports){
  9634  ;(function (root, factory, undef) {
  9635  	if (typeof exports === "object") {
  9636  		// CommonJS
  9637  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9638  	}
  9639  	else if (typeof define === "function" && define.amd) {
  9640  		// AMD
  9641  		define(["./core", "./cipher-core"], factory);
  9642  	}
  9643  	else {
  9644  		// Global (browser)
  9645  		factory(root.CryptoJS);
  9646  	}
  9647  }(this, function (CryptoJS) {
  9648  
  9649  	/**
  9650  	 * Cipher Feedback block mode.
  9651  	 */
  9652  	CryptoJS.mode.CFB = (function () {
  9653  	    var CFB = CryptoJS.lib.BlockCipherMode.extend();
  9654  
  9655  	    CFB.Encryptor = CFB.extend({
  9656  	        processBlock: function (words, offset) {
  9657  	            // Shortcuts
  9658  	            var cipher = this._cipher;
  9659  	            var blockSize = cipher.blockSize;
  9660  
  9661  	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
  9662  
  9663  	            // Remember this block to use with next block
  9664  	            this._prevBlock = words.slice(offset, offset + blockSize);
  9665  	        }
  9666  	    });
  9667  
  9668  	    CFB.Decryptor = CFB.extend({
  9669  	        processBlock: function (words, offset) {
  9670  	            // Shortcuts
  9671  	            var cipher = this._cipher;
  9672  	            var blockSize = cipher.blockSize;
  9673  
  9674  	            // Remember this block to use with next block
  9675  	            var thisBlock = words.slice(offset, offset + blockSize);
  9676  
  9677  	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
  9678  
  9679  	            // This block becomes the previous block
  9680  	            this._prevBlock = thisBlock;
  9681  	        }
  9682  	    });
  9683  
  9684  	    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
  9685  	        // Shortcut
  9686  	        var iv = this._iv;
  9687  
  9688  	        // Generate keystream
  9689  	        if (iv) {
  9690  	            var keystream = iv.slice(0);
  9691  
  9692  	            // Remove IV for subsequent blocks
  9693  	            this._iv = undefined;
  9694  	        } else {
  9695  	            var keystream = this._prevBlock;
  9696  	        }
  9697  	        cipher.encryptBlock(keystream, 0);
  9698  
  9699  	        // Encrypt
  9700  	        for (var i = 0; i < blockSize; i++) {
  9701  	            words[offset + i] ^= keystream[i];
  9702  	        }
  9703  	    }
  9704  
  9705  	    return CFB;
  9706  	}());
  9707  
  9708  
  9709  	return CryptoJS.mode.CFB;
  9710  
  9711  }));
  9712  },{"./cipher-core":52,"./core":53}],63:[function(require,module,exports){
  9713  ;(function (root, factory, undef) {
  9714  	if (typeof exports === "object") {
  9715  		// CommonJS
  9716  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9717  	}
  9718  	else if (typeof define === "function" && define.amd) {
  9719  		// AMD
  9720  		define(["./core", "./cipher-core"], factory);
  9721  	}
  9722  	else {
  9723  		// Global (browser)
  9724  		factory(root.CryptoJS);
  9725  	}
  9726  }(this, function (CryptoJS) {
  9727  
  9728  	/** @preserve
  9729  	 * Counter block mode compatible with  Dr Brian Gladman fileenc.c
  9730  	 * derived from CryptoJS.mode.CTR
  9731  	 * Jan Hruby jhruby.web@gmail.com
  9732  	 */
  9733  	CryptoJS.mode.CTRGladman = (function () {
  9734  	    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
  9735  
  9736  		function incWord(word)
  9737  		{
  9738  			if (((word >> 24) & 0xff) === 0xff) { //overflow
  9739  			var b1 = (word >> 16)&0xff;
  9740  			var b2 = (word >> 8)&0xff;
  9741  			var b3 = word & 0xff;
  9742  
  9743  			if (b1 === 0xff) // overflow b1
  9744  			{
  9745  			b1 = 0;
  9746  			if (b2 === 0xff)
  9747  			{
  9748  				b2 = 0;
  9749  				if (b3 === 0xff)
  9750  				{
  9751  					b3 = 0;
  9752  				}
  9753  				else
  9754  				{
  9755  					++b3;
  9756  				}
  9757  			}
  9758  			else
  9759  			{
  9760  				++b2;
  9761  			}
  9762  			}
  9763  			else
  9764  			{
  9765  			++b1;
  9766  			}
  9767  
  9768  			word = 0;
  9769  			word += (b1 << 16);
  9770  			word += (b2 << 8);
  9771  			word += b3;
  9772  			}
  9773  			else
  9774  			{
  9775  			word += (0x01 << 24);
  9776  			}
  9777  			return word;
  9778  		}
  9779  
  9780  		function incCounter(counter)
  9781  		{
  9782  			if ((counter[0] = incWord(counter[0])) === 0)
  9783  			{
  9784  				// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8
  9785  				counter[1] = incWord(counter[1]);
  9786  			}
  9787  			return counter;
  9788  		}
  9789  
  9790  	    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
  9791  	        processBlock: function (words, offset) {
  9792  	            // Shortcuts
  9793  	            var cipher = this._cipher
  9794  	            var blockSize = cipher.blockSize;
  9795  	            var iv = this._iv;
  9796  	            var counter = this._counter;
  9797  
  9798  	            // Generate keystream
  9799  	            if (iv) {
  9800  	                counter = this._counter = iv.slice(0);
  9801  
  9802  	                // Remove IV for subsequent blocks
  9803  	                this._iv = undefined;
  9804  	            }
  9805  
  9806  				incCounter(counter);
  9807  
  9808  				var keystream = counter.slice(0);
  9809  	            cipher.encryptBlock(keystream, 0);
  9810  
  9811  	            // Encrypt
  9812  	            for (var i = 0; i < blockSize; i++) {
  9813  	                words[offset + i] ^= keystream[i];
  9814  	            }
  9815  	        }
  9816  	    });
  9817  
  9818  	    CTRGladman.Decryptor = Encryptor;
  9819  
  9820  	    return CTRGladman;
  9821  	}());
  9822  
  9823  
  9824  
  9825  
  9826  	return CryptoJS.mode.CTRGladman;
  9827  
  9828  }));
  9829  },{"./cipher-core":52,"./core":53}],64:[function(require,module,exports){
  9830  ;(function (root, factory, undef) {
  9831  	if (typeof exports === "object") {
  9832  		// CommonJS
  9833  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9834  	}
  9835  	else if (typeof define === "function" && define.amd) {
  9836  		// AMD
  9837  		define(["./core", "./cipher-core"], factory);
  9838  	}
  9839  	else {
  9840  		// Global (browser)
  9841  		factory(root.CryptoJS);
  9842  	}
  9843  }(this, function (CryptoJS) {
  9844  
  9845  	/**
  9846  	 * Counter block mode.
  9847  	 */
  9848  	CryptoJS.mode.CTR = (function () {
  9849  	    var CTR = CryptoJS.lib.BlockCipherMode.extend();
  9850  
  9851  	    var Encryptor = CTR.Encryptor = CTR.extend({
  9852  	        processBlock: function (words, offset) {
  9853  	            // Shortcuts
  9854  	            var cipher = this._cipher
  9855  	            var blockSize = cipher.blockSize;
  9856  	            var iv = this._iv;
  9857  	            var counter = this._counter;
  9858  
  9859  	            // Generate keystream
  9860  	            if (iv) {
  9861  	                counter = this._counter = iv.slice(0);
  9862  
  9863  	                // Remove IV for subsequent blocks
  9864  	                this._iv = undefined;
  9865  	            }
  9866  	            var keystream = counter.slice(0);
  9867  	            cipher.encryptBlock(keystream, 0);
  9868  
  9869  	            // Increment counter
  9870  	            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
  9871  
  9872  	            // Encrypt
  9873  	            for (var i = 0; i < blockSize; i++) {
  9874  	                words[offset + i] ^= keystream[i];
  9875  	            }
  9876  	        }
  9877  	    });
  9878  
  9879  	    CTR.Decryptor = Encryptor;
  9880  
  9881  	    return CTR;
  9882  	}());
  9883  
  9884  
  9885  	return CryptoJS.mode.CTR;
  9886  
  9887  }));
  9888  },{"./cipher-core":52,"./core":53}],65:[function(require,module,exports){
  9889  ;(function (root, factory, undef) {
  9890  	if (typeof exports === "object") {
  9891  		// CommonJS
  9892  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9893  	}
  9894  	else if (typeof define === "function" && define.amd) {
  9895  		// AMD
  9896  		define(["./core", "./cipher-core"], factory);
  9897  	}
  9898  	else {
  9899  		// Global (browser)
  9900  		factory(root.CryptoJS);
  9901  	}
  9902  }(this, function (CryptoJS) {
  9903  
  9904  	/**
  9905  	 * Electronic Codebook block mode.
  9906  	 */
  9907  	CryptoJS.mode.ECB = (function () {
  9908  	    var ECB = CryptoJS.lib.BlockCipherMode.extend();
  9909  
  9910  	    ECB.Encryptor = ECB.extend({
  9911  	        processBlock: function (words, offset) {
  9912  	            this._cipher.encryptBlock(words, offset);
  9913  	        }
  9914  	    });
  9915  
  9916  	    ECB.Decryptor = ECB.extend({
  9917  	        processBlock: function (words, offset) {
  9918  	            this._cipher.decryptBlock(words, offset);
  9919  	        }
  9920  	    });
  9921  
  9922  	    return ECB;
  9923  	}());
  9924  
  9925  
  9926  	return CryptoJS.mode.ECB;
  9927  
  9928  }));
  9929  },{"./cipher-core":52,"./core":53}],66:[function(require,module,exports){
  9930  ;(function (root, factory, undef) {
  9931  	if (typeof exports === "object") {
  9932  		// CommonJS
  9933  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9934  	}
  9935  	else if (typeof define === "function" && define.amd) {
  9936  		// AMD
  9937  		define(["./core", "./cipher-core"], factory);
  9938  	}
  9939  	else {
  9940  		// Global (browser)
  9941  		factory(root.CryptoJS);
  9942  	}
  9943  }(this, function (CryptoJS) {
  9944  
  9945  	/**
  9946  	 * Output Feedback block mode.
  9947  	 */
  9948  	CryptoJS.mode.OFB = (function () {
  9949  	    var OFB = CryptoJS.lib.BlockCipherMode.extend();
  9950  
  9951  	    var Encryptor = OFB.Encryptor = OFB.extend({
  9952  	        processBlock: function (words, offset) {
  9953  	            // Shortcuts
  9954  	            var cipher = this._cipher
  9955  	            var blockSize = cipher.blockSize;
  9956  	            var iv = this._iv;
  9957  	            var keystream = this._keystream;
  9958  
  9959  	            // Generate keystream
  9960  	            if (iv) {
  9961  	                keystream = this._keystream = iv.slice(0);
  9962  
  9963  	                // Remove IV for subsequent blocks
  9964  	                this._iv = undefined;
  9965  	            }
  9966  	            cipher.encryptBlock(keystream, 0);
  9967  
  9968  	            // Encrypt
  9969  	            for (var i = 0; i < blockSize; i++) {
  9970  	                words[offset + i] ^= keystream[i];
  9971  	            }
  9972  	        }
  9973  	    });
  9974  
  9975  	    OFB.Decryptor = Encryptor;
  9976  
  9977  	    return OFB;
  9978  	}());
  9979  
  9980  
  9981  	return CryptoJS.mode.OFB;
  9982  
  9983  }));
  9984  },{"./cipher-core":52,"./core":53}],67:[function(require,module,exports){
  9985  ;(function (root, factory, undef) {
  9986  	if (typeof exports === "object") {
  9987  		// CommonJS
  9988  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9989  	}
  9990  	else if (typeof define === "function" && define.amd) {
  9991  		// AMD
  9992  		define(["./core", "./cipher-core"], factory);
  9993  	}
  9994  	else {
  9995  		// Global (browser)
  9996  		factory(root.CryptoJS);
  9997  	}
  9998  }(this, function (CryptoJS) {
  9999  
 10000  	/**
 10001  	 * ANSI X.923 padding strategy.
 10002  	 */
 10003  	CryptoJS.pad.AnsiX923 = {
 10004  	    pad: function (data, blockSize) {
 10005  	        // Shortcuts
 10006  	        var dataSigBytes = data.sigBytes;
 10007  	        var blockSizeBytes = blockSize * 4;
 10008  
 10009  	        // Count padding bytes
 10010  	        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
 10011  
 10012  	        // Compute last byte position
 10013  	        var lastBytePos = dataSigBytes + nPaddingBytes - 1;
 10014  
 10015  	        // Pad
 10016  	        data.clamp();
 10017  	        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
 10018  	        data.sigBytes += nPaddingBytes;
 10019  	    },
 10020  
 10021  	    unpad: function (data) {
 10022  	        // Get number of padding bytes from last byte
 10023  	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
 10024  
 10025  	        // Remove padding
 10026  	        data.sigBytes -= nPaddingBytes;
 10027  	    }
 10028  	};
 10029  
 10030  
 10031  	return CryptoJS.pad.Ansix923;
 10032  
 10033  }));
 10034  },{"./cipher-core":52,"./core":53}],68:[function(require,module,exports){
 10035  ;(function (root, factory, undef) {
 10036  	if (typeof exports === "object") {
 10037  		// CommonJS
 10038  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10039  	}
 10040  	else if (typeof define === "function" && define.amd) {
 10041  		// AMD
 10042  		define(["./core", "./cipher-core"], factory);
 10043  	}
 10044  	else {
 10045  		// Global (browser)
 10046  		factory(root.CryptoJS);
 10047  	}
 10048  }(this, function (CryptoJS) {
 10049  
 10050  	/**
 10051  	 * ISO 10126 padding strategy.
 10052  	 */
 10053  	CryptoJS.pad.Iso10126 = {
 10054  	    pad: function (data, blockSize) {
 10055  	        // Shortcut
 10056  	        var blockSizeBytes = blockSize * 4;
 10057  
 10058  	        // Count padding bytes
 10059  	        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
 10060  
 10061  	        // Pad
 10062  	        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
 10063  	             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
 10064  	    },
 10065  
 10066  	    unpad: function (data) {
 10067  	        // Get number of padding bytes from last byte
 10068  	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
 10069  
 10070  	        // Remove padding
 10071  	        data.sigBytes -= nPaddingBytes;
 10072  	    }
 10073  	};
 10074  
 10075  
 10076  	return CryptoJS.pad.Iso10126;
 10077  
 10078  }));
 10079  },{"./cipher-core":52,"./core":53}],69:[function(require,module,exports){
 10080  ;(function (root, factory, undef) {
 10081  	if (typeof exports === "object") {
 10082  		// CommonJS
 10083  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10084  	}
 10085  	else if (typeof define === "function" && define.amd) {
 10086  		// AMD
 10087  		define(["./core", "./cipher-core"], factory);
 10088  	}
 10089  	else {
 10090  		// Global (browser)
 10091  		factory(root.CryptoJS);
 10092  	}
 10093  }(this, function (CryptoJS) {
 10094  
 10095  	/**
 10096  	 * ISO/IEC 9797-1 Padding Method 2.
 10097  	 */
 10098  	CryptoJS.pad.Iso97971 = {
 10099  	    pad: function (data, blockSize) {
 10100  	        // Add 0x80 byte
 10101  	        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
 10102  
 10103  	        // Zero pad the rest
 10104  	        CryptoJS.pad.ZeroPadding.pad(data, blockSize);
 10105  	    },
 10106  
 10107  	    unpad: function (data) {
 10108  	        // Remove zero padding
 10109  	        CryptoJS.pad.ZeroPadding.unpad(data);
 10110  
 10111  	        // Remove one more byte -- the 0x80 byte
 10112  	        data.sigBytes--;
 10113  	    }
 10114  	};
 10115  
 10116  
 10117  	return CryptoJS.pad.Iso97971;
 10118  
 10119  }));
 10120  },{"./cipher-core":52,"./core":53}],70:[function(require,module,exports){
 10121  ;(function (root, factory, undef) {
 10122  	if (typeof exports === "object") {
 10123  		// CommonJS
 10124  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10125  	}
 10126  	else if (typeof define === "function" && define.amd) {
 10127  		// AMD
 10128  		define(["./core", "./cipher-core"], factory);
 10129  	}
 10130  	else {
 10131  		// Global (browser)
 10132  		factory(root.CryptoJS);
 10133  	}
 10134  }(this, function (CryptoJS) {
 10135  
 10136  	/**
 10137  	 * A noop padding strategy.
 10138  	 */
 10139  	CryptoJS.pad.NoPadding = {
 10140  	    pad: function () {
 10141  	    },
 10142  
 10143  	    unpad: function () {
 10144  	    }
 10145  	};
 10146  
 10147  
 10148  	return CryptoJS.pad.NoPadding;
 10149  
 10150  }));
 10151  },{"./cipher-core":52,"./core":53}],71:[function(require,module,exports){
 10152  ;(function (root, factory, undef) {
 10153  	if (typeof exports === "object") {
 10154  		// CommonJS
 10155  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10156  	}
 10157  	else if (typeof define === "function" && define.amd) {
 10158  		// AMD
 10159  		define(["./core", "./cipher-core"], factory);
 10160  	}
 10161  	else {
 10162  		// Global (browser)
 10163  		factory(root.CryptoJS);
 10164  	}
 10165  }(this, function (CryptoJS) {
 10166  
 10167  	/**
 10168  	 * Zero padding strategy.
 10169  	 */
 10170  	CryptoJS.pad.ZeroPadding = {
 10171  	    pad: function (data, blockSize) {
 10172  	        // Shortcut
 10173  	        var blockSizeBytes = blockSize * 4;
 10174  
 10175  	        // Pad
 10176  	        data.clamp();
 10177  	        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
 10178  	    },
 10179  
 10180  	    unpad: function (data) {
 10181  	        // Shortcut
 10182  	        var dataWords = data.words;
 10183  
 10184  	        // Unpad
 10185  	        var i = data.sigBytes - 1;
 10186  	        while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
 10187  	            i--;
 10188  	        }
 10189  	        data.sigBytes = i + 1;
 10190  	    }
 10191  	};
 10192  
 10193  
 10194  	return CryptoJS.pad.ZeroPadding;
 10195  
 10196  }));
 10197  },{"./cipher-core":52,"./core":53}],72:[function(require,module,exports){
 10198  ;(function (root, factory, undef) {
 10199  	if (typeof exports === "object") {
 10200  		// CommonJS
 10201  		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
 10202  	}
 10203  	else if (typeof define === "function" && define.amd) {
 10204  		// AMD
 10205  		define(["./core", "./sha1", "./hmac"], factory);
 10206  	}
 10207  	else {
 10208  		// Global (browser)
 10209  		factory(root.CryptoJS);
 10210  	}
 10211  }(this, function (CryptoJS) {
 10212  
 10213  	(function () {
 10214  	    // Shortcuts
 10215  	    var C = CryptoJS;
 10216  	    var C_lib = C.lib;
 10217  	    var Base = C_lib.Base;
 10218  	    var WordArray = C_lib.WordArray;
 10219  	    var C_algo = C.algo;
 10220  	    var SHA1 = C_algo.SHA1;
 10221  	    var HMAC = C_algo.HMAC;
 10222  
 10223  	    /**
 10224  	     * Password-Based Key Derivation Function 2 algorithm.
 10225  	     */
 10226  	    var PBKDF2 = C_algo.PBKDF2 = Base.extend({
 10227  	        /**
 10228  	         * Configuration options.
 10229  	         *
 10230  	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
 10231  	         * @property {Hasher} hasher The hasher to use. Default: SHA1
 10232  	         * @property {number} iterations The number of iterations to perform. Default: 1
 10233  	         */
 10234  	        cfg: Base.extend({
 10235  	            keySize: 128/32,
 10236  	            hasher: SHA1,
 10237  	            iterations: 1
 10238  	        }),
 10239  
 10240  	        /**
 10241  	         * Initializes a newly created key derivation function.
 10242  	         *
 10243  	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
 10244  	         *
 10245  	         * @example
 10246  	         *
 10247  	         *     var kdf = CryptoJS.algo.PBKDF2.create();
 10248  	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
 10249  	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
 10250  	         */
 10251  	        init: function (cfg) {
 10252  	            this.cfg = this.cfg.extend(cfg);
 10253  	        },
 10254  
 10255  	        /**
 10256  	         * Computes the Password-Based Key Derivation Function 2.
 10257  	         *
 10258  	         * @param {WordArray|string} password The password.
 10259  	         * @param {WordArray|string} salt A salt.
 10260  	         *
 10261  	         * @return {WordArray} The derived key.
 10262  	         *
 10263  	         * @example
 10264  	         *
 10265  	         *     var key = kdf.compute(password, salt);
 10266  	         */
 10267  	        compute: function (password, salt) {
 10268  	            // Shortcut
 10269  	            var cfg = this.cfg;
 10270  
 10271  	            // Init HMAC
 10272  	            var hmac = HMAC.create(cfg.hasher, password);
 10273  
 10274  	            // Initial values
 10275  	            var derivedKey = WordArray.create();
 10276  	            var blockIndex = WordArray.create([0x00000001]);
 10277  
 10278  	            // Shortcuts
 10279  	            var derivedKeyWords = derivedKey.words;
 10280  	            var blockIndexWords = blockIndex.words;
 10281  	            var keySize = cfg.keySize;
 10282  	            var iterations = cfg.iterations;
 10283  
 10284  	            // Generate key
 10285  	            while (derivedKeyWords.length < keySize) {
 10286  	                var block = hmac.update(salt).finalize(blockIndex);
 10287  	                hmac.reset();
 10288  
 10289  	                // Shortcuts
 10290  	                var blockWords = block.words;
 10291  	                var blockWordsLength = blockWords.length;
 10292  
 10293  	                // Iterations
 10294  	                var intermediate = block;
 10295  	                for (var i = 1; i < iterations; i++) {
 10296  	                    intermediate = hmac.finalize(intermediate);
 10297  	                    hmac.reset();
 10298  
 10299  	                    // Shortcut
 10300  	                    var intermediateWords = intermediate.words;
 10301  
 10302  	                    // XOR intermediate with block
 10303  	                    for (var j = 0; j < blockWordsLength; j++) {
 10304  	                        blockWords[j] ^= intermediateWords[j];
 10305  	                    }
 10306  	                }
 10307  
 10308  	                derivedKey.concat(block);
 10309  	                blockIndexWords[0]++;
 10310  	            }
 10311  	            derivedKey.sigBytes = keySize * 4;
 10312  
 10313  	            return derivedKey;
 10314  	        }
 10315  	    });
 10316  
 10317  	    /**
 10318  	     * Computes the Password-Based Key Derivation Function 2.
 10319  	     *
 10320  	     * @param {WordArray|string} password The password.
 10321  	     * @param {WordArray|string} salt A salt.
 10322  	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
 10323  	     *
 10324  	     * @return {WordArray} The derived key.
 10325  	     *
 10326  	     * @static
 10327  	     *
 10328  	     * @example
 10329  	     *
 10330  	     *     var key = CryptoJS.PBKDF2(password, salt);
 10331  	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
 10332  	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
 10333  	     */
 10334  	    C.PBKDF2 = function (password, salt, cfg) {
 10335  	        return PBKDF2.create(cfg).compute(password, salt);
 10336  	    };
 10337  	}());
 10338  
 10339  
 10340  	return CryptoJS.PBKDF2;
 10341  
 10342  }));
 10343  },{"./core":53,"./hmac":58,"./sha1":77}],73:[function(require,module,exports){
 10344  ;(function (root, factory, undef) {
 10345  	if (typeof exports === "object") {
 10346  		// CommonJS
 10347  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10348  	}
 10349  	else if (typeof define === "function" && define.amd) {
 10350  		// AMD
 10351  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10352  	}
 10353  	else {
 10354  		// Global (browser)
 10355  		factory(root.CryptoJS);
 10356  	}
 10357  }(this, function (CryptoJS) {
 10358  
 10359  	(function () {
 10360  	    // Shortcuts
 10361  	    var C = CryptoJS;
 10362  	    var C_lib = C.lib;
 10363  	    var StreamCipher = C_lib.StreamCipher;
 10364  	    var C_algo = C.algo;
 10365  
 10366  	    // Reusable objects
 10367  	    var S  = [];
 10368  	    var C_ = [];
 10369  	    var G  = [];
 10370  
 10371  	    /**
 10372  	     * Rabbit stream cipher algorithm.
 10373  	     *
 10374  	     * This is a legacy version that neglected to convert the key to little-endian.
 10375  	     * This error doesn't affect the cipher's security,
 10376  	     * but it does affect its compatibility with other implementations.
 10377  	     */
 10378  	    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
 10379  	        _doReset: function () {
 10380  	            // Shortcuts
 10381  	            var K = this._key.words;
 10382  	            var iv = this.cfg.iv;
 10383  
 10384  	            // Generate initial state values
 10385  	            var X = this._X = [
 10386  	                K[0], (K[3] << 16) | (K[2] >>> 16),
 10387  	                K[1], (K[0] << 16) | (K[3] >>> 16),
 10388  	                K[2], (K[1] << 16) | (K[0] >>> 16),
 10389  	                K[3], (K[2] << 16) | (K[1] >>> 16)
 10390  	            ];
 10391  
 10392  	            // Generate initial counter values
 10393  	            var C = this._C = [
 10394  	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
 10395  	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
 10396  	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
 10397  	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
 10398  	            ];
 10399  
 10400  	            // Carry bit
 10401  	            this._b = 0;
 10402  
 10403  	            // Iterate the system four times
 10404  	            for (var i = 0; i < 4; i++) {
 10405  	                nextState.call(this);
 10406  	            }
 10407  
 10408  	            // Modify the counters
 10409  	            for (var i = 0; i < 8; i++) {
 10410  	                C[i] ^= X[(i + 4) & 7];
 10411  	            }
 10412  
 10413  	            // IV setup
 10414  	            if (iv) {
 10415  	                // Shortcuts
 10416  	                var IV = iv.words;
 10417  	                var IV_0 = IV[0];
 10418  	                var IV_1 = IV[1];
 10419  
 10420  	                // Generate four subvectors
 10421  	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
 10422  	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
 10423  	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
 10424  	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
 10425  
 10426  	                // Modify counter values
 10427  	                C[0] ^= i0;
 10428  	                C[1] ^= i1;
 10429  	                C[2] ^= i2;
 10430  	                C[3] ^= i3;
 10431  	                C[4] ^= i0;
 10432  	                C[5] ^= i1;
 10433  	                C[6] ^= i2;
 10434  	                C[7] ^= i3;
 10435  
 10436  	                // Iterate the system four times
 10437  	                for (var i = 0; i < 4; i++) {
 10438  	                    nextState.call(this);
 10439  	                }
 10440  	            }
 10441  	        },
 10442  
 10443  	        _doProcessBlock: function (M, offset) {
 10444  	            // Shortcut
 10445  	            var X = this._X;
 10446  
 10447  	            // Iterate the system
 10448  	            nextState.call(this);
 10449  
 10450  	            // Generate four keystream words
 10451  	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
 10452  	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
 10453  	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
 10454  	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
 10455  
 10456  	            for (var i = 0; i < 4; i++) {
 10457  	                // Swap endian
 10458  	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
 10459  	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
 10460  
 10461  	                // Encrypt
 10462  	                M[offset + i] ^= S[i];
 10463  	            }
 10464  	        },
 10465  
 10466  	        blockSize: 128/32,
 10467  
 10468  	        ivSize: 64/32
 10469  	    });
 10470  
 10471  	    function nextState() {
 10472  	        // Shortcuts
 10473  	        var X = this._X;
 10474  	        var C = this._C;
 10475  
 10476  	        // Save old counter values
 10477  	        for (var i = 0; i < 8; i++) {
 10478  	            C_[i] = C[i];
 10479  	        }
 10480  
 10481  	        // Calculate new counter values
 10482  	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
 10483  	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
 10484  	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
 10485  	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
 10486  	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
 10487  	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
 10488  	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
 10489  	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
 10490  	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
 10491  
 10492  	        // Calculate the g-values
 10493  	        for (var i = 0; i < 8; i++) {
 10494  	            var gx = X[i] + C[i];
 10495  
 10496  	            // Construct high and low argument for squaring
 10497  	            var ga = gx & 0xffff;
 10498  	            var gb = gx >>> 16;
 10499  
 10500  	            // Calculate high and low result of squaring
 10501  	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
 10502  	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
 10503  
 10504  	            // High XOR low
 10505  	            G[i] = gh ^ gl;
 10506  	        }
 10507  
 10508  	        // Calculate new state values
 10509  	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
 10510  	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
 10511  	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
 10512  	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
 10513  	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
 10514  	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
 10515  	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
 10516  	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
 10517  	    }
 10518  
 10519  	    /**
 10520  	     * Shortcut functions to the cipher's object interface.
 10521  	     *
 10522  	     * @example
 10523  	     *
 10524  	     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
 10525  	     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
 10526  	     */
 10527  	    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
 10528  	}());
 10529  
 10530  
 10531  	return CryptoJS.RabbitLegacy;
 10532  
 10533  }));
 10534  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],74:[function(require,module,exports){
 10535  ;(function (root, factory, undef) {
 10536  	if (typeof exports === "object") {
 10537  		// CommonJS
 10538  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10539  	}
 10540  	else if (typeof define === "function" && define.amd) {
 10541  		// AMD
 10542  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10543  	}
 10544  	else {
 10545  		// Global (browser)
 10546  		factory(root.CryptoJS);
 10547  	}
 10548  }(this, function (CryptoJS) {
 10549  
 10550  	(function () {
 10551  	    // Shortcuts
 10552  	    var C = CryptoJS;
 10553  	    var C_lib = C.lib;
 10554  	    var StreamCipher = C_lib.StreamCipher;
 10555  	    var C_algo = C.algo;
 10556  
 10557  	    // Reusable objects
 10558  	    var S  = [];
 10559  	    var C_ = [];
 10560  	    var G  = [];
 10561  
 10562  	    /**
 10563  	     * Rabbit stream cipher algorithm
 10564  	     */
 10565  	    var Rabbit = C_algo.Rabbit = StreamCipher.extend({
 10566  	        _doReset: function () {
 10567  	            // Shortcuts
 10568  	            var K = this._key.words;
 10569  	            var iv = this.cfg.iv;
 10570  
 10571  	            // Swap endian
 10572  	            for (var i = 0; i < 4; i++) {
 10573  	                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |
 10574  	                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);
 10575  	            }
 10576  
 10577  	            // Generate initial state values
 10578  	            var X = this._X = [
 10579  	                K[0], (K[3] << 16) | (K[2] >>> 16),
 10580  	                K[1], (K[0] << 16) | (K[3] >>> 16),
 10581  	                K[2], (K[1] << 16) | (K[0] >>> 16),
 10582  	                K[3], (K[2] << 16) | (K[1] >>> 16)
 10583  	            ];
 10584  
 10585  	            // Generate initial counter values
 10586  	            var C = this._C = [
 10587  	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
 10588  	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
 10589  	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
 10590  	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
 10591  	            ];
 10592  
 10593  	            // Carry bit
 10594  	            this._b = 0;
 10595  
 10596  	            // Iterate the system four times
 10597  	            for (var i = 0; i < 4; i++) {
 10598  	                nextState.call(this);
 10599  	            }
 10600  
 10601  	            // Modify the counters
 10602  	            for (var i = 0; i < 8; i++) {
 10603  	                C[i] ^= X[(i + 4) & 7];
 10604  	            }
 10605  
 10606  	            // IV setup
 10607  	            if (iv) {
 10608  	                // Shortcuts
 10609  	                var IV = iv.words;
 10610  	                var IV_0 = IV[0];
 10611  	                var IV_1 = IV[1];
 10612  
 10613  	                // Generate four subvectors
 10614  	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
 10615  	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
 10616  	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
 10617  	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
 10618  
 10619  	                // Modify counter values
 10620  	                C[0] ^= i0;
 10621  	                C[1] ^= i1;
 10622  	                C[2] ^= i2;
 10623  	                C[3] ^= i3;
 10624  	                C[4] ^= i0;
 10625  	                C[5] ^= i1;
 10626  	                C[6] ^= i2;
 10627  	                C[7] ^= i3;
 10628  
 10629  	                // Iterate the system four times
 10630  	                for (var i = 0; i < 4; i++) {
 10631  	                    nextState.call(this);
 10632  	                }
 10633  	            }
 10634  	        },
 10635  
 10636  	        _doProcessBlock: function (M, offset) {
 10637  	            // Shortcut
 10638  	            var X = this._X;
 10639  
 10640  	            // Iterate the system
 10641  	            nextState.call(this);
 10642  
 10643  	            // Generate four keystream words
 10644  	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
 10645  	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
 10646  	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
 10647  	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
 10648  
 10649  	            for (var i = 0; i < 4; i++) {
 10650  	                // Swap endian
 10651  	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
 10652  	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
 10653  
 10654  	                // Encrypt
 10655  	                M[offset + i] ^= S[i];
 10656  	            }
 10657  	        },
 10658  
 10659  	        blockSize: 128/32,
 10660  
 10661  	        ivSize: 64/32
 10662  	    });
 10663  
 10664  	    function nextState() {
 10665  	        // Shortcuts
 10666  	        var X = this._X;
 10667  	        var C = this._C;
 10668  
 10669  	        // Save old counter values
 10670  	        for (var i = 0; i < 8; i++) {
 10671  	            C_[i] = C[i];
 10672  	        }
 10673  
 10674  	        // Calculate new counter values
 10675  	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
 10676  	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
 10677  	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
 10678  	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
 10679  	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
 10680  	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
 10681  	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
 10682  	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
 10683  	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
 10684  
 10685  	        // Calculate the g-values
 10686  	        for (var i = 0; i < 8; i++) {
 10687  	            var gx = X[i] + C[i];
 10688  
 10689  	            // Construct high and low argument for squaring
 10690  	            var ga = gx & 0xffff;
 10691  	            var gb = gx >>> 16;
 10692  
 10693  	            // Calculate high and low result of squaring
 10694  	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
 10695  	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
 10696  
 10697  	            // High XOR low
 10698  	            G[i] = gh ^ gl;
 10699  	        }
 10700  
 10701  	        // Calculate new state values
 10702  	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
 10703  	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
 10704  	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
 10705  	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
 10706  	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
 10707  	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
 10708  	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
 10709  	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
 10710  	    }
 10711  
 10712  	    /**
 10713  	     * Shortcut functions to the cipher's object interface.
 10714  	     *
 10715  	     * @example
 10716  	     *
 10717  	     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
 10718  	     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
 10719  	     */
 10720  	    C.Rabbit = StreamCipher._createHelper(Rabbit);
 10721  	}());
 10722  
 10723  
 10724  	return CryptoJS.Rabbit;
 10725  
 10726  }));
 10727  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],75:[function(require,module,exports){
 10728  ;(function (root, factory, undef) {
 10729  	if (typeof exports === "object") {
 10730  		// CommonJS
 10731  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10732  	}
 10733  	else if (typeof define === "function" && define.amd) {
 10734  		// AMD
 10735  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10736  	}
 10737  	else {
 10738  		// Global (browser)
 10739  		factory(root.CryptoJS);
 10740  	}
 10741  }(this, function (CryptoJS) {
 10742  
 10743  	(function () {
 10744  	    // Shortcuts
 10745  	    var C = CryptoJS;
 10746  	    var C_lib = C.lib;
 10747  	    var StreamCipher = C_lib.StreamCipher;
 10748  	    var C_algo = C.algo;
 10749  
 10750  	    /**
 10751  	     * RC4 stream cipher algorithm.
 10752  	     */
 10753  	    var RC4 = C_algo.RC4 = StreamCipher.extend({
 10754  	        _doReset: function () {
 10755  	            // Shortcuts
 10756  	            var key = this._key;
 10757  	            var keyWords = key.words;
 10758  	            var keySigBytes = key.sigBytes;
 10759  
 10760  	            // Init sbox
 10761  	            var S = this._S = [];
 10762  	            for (var i = 0; i < 256; i++) {
 10763  	                S[i] = i;
 10764  	            }
 10765  
 10766  	            // Key setup
 10767  	            for (var i = 0, j = 0; i < 256; i++) {
 10768  	                var keyByteIndex = i % keySigBytes;
 10769  	                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
 10770  
 10771  	                j = (j + S[i] + keyByte) % 256;
 10772  
 10773  	                // Swap
 10774  	                var t = S[i];
 10775  	                S[i] = S[j];
 10776  	                S[j] = t;
 10777  	            }
 10778  
 10779  	            // Counters
 10780  	            this._i = this._j = 0;
 10781  	        },
 10782  
 10783  	        _doProcessBlock: function (M, offset) {
 10784  	            M[offset] ^= generateKeystreamWord.call(this);
 10785  	        },
 10786  
 10787  	        keySize: 256/32,
 10788  
 10789  	        ivSize: 0
 10790  	    });
 10791  
 10792  	    function generateKeystreamWord() {
 10793  	        // Shortcuts
 10794  	        var S = this._S;
 10795  	        var i = this._i;
 10796  	        var j = this._j;
 10797  
 10798  	        // Generate keystream word
 10799  	        var keystreamWord = 0;
 10800  	        for (var n = 0; n < 4; n++) {
 10801  	            i = (i + 1) % 256;
 10802  	            j = (j + S[i]) % 256;
 10803  
 10804  	            // Swap
 10805  	            var t = S[i];
 10806  	            S[i] = S[j];
 10807  	            S[j] = t;
 10808  
 10809  	            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
 10810  	        }
 10811  
 10812  	        // Update counters
 10813  	        this._i = i;
 10814  	        this._j = j;
 10815  
 10816  	        return keystreamWord;
 10817  	    }
 10818  
 10819  	    /**
 10820  	     * Shortcut functions to the cipher's object interface.
 10821  	     *
 10822  	     * @example
 10823  	     *
 10824  	     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
 10825  	     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
 10826  	     */
 10827  	    C.RC4 = StreamCipher._createHelper(RC4);
 10828  
 10829  	    /**
 10830  	     * Modified RC4 stream cipher algorithm.
 10831  	     */
 10832  	    var RC4Drop = C_algo.RC4Drop = RC4.extend({
 10833  	        /**
 10834  	         * Configuration options.
 10835  	         *
 10836  	         * @property {number} drop The number of keystream words to drop. Default 192
 10837  	         */
 10838  	        cfg: RC4.cfg.extend({
 10839  	            drop: 192
 10840  	        }),
 10841  
 10842  	        _doReset: function () {
 10843  	            RC4._doReset.call(this);
 10844  
 10845  	            // Drop
 10846  	            for (var i = this.cfg.drop; i > 0; i--) {
 10847  	                generateKeystreamWord.call(this);
 10848  	            }
 10849  	        }
 10850  	    });
 10851  
 10852  	    /**
 10853  	     * Shortcut functions to the cipher's object interface.
 10854  	     *
 10855  	     * @example
 10856  	     *
 10857  	     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
 10858  	     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
 10859  	     */
 10860  	    C.RC4Drop = StreamCipher._createHelper(RC4Drop);
 10861  	}());
 10862  
 10863  
 10864  	return CryptoJS.RC4;
 10865  
 10866  }));
 10867  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],76:[function(require,module,exports){
 10868  ;(function (root, factory) {
 10869  	if (typeof exports === "object") {
 10870  		// CommonJS
 10871  		module.exports = exports = factory(require("./core"));
 10872  	}
 10873  	else if (typeof define === "function" && define.amd) {
 10874  		// AMD
 10875  		define(["./core"], factory);
 10876  	}
 10877  	else {
 10878  		// Global (browser)
 10879  		factory(root.CryptoJS);
 10880  	}
 10881  }(this, function (CryptoJS) {
 10882  
 10883  	/** @preserve
 10884  	(c) 2012 by Cédric Mesnil. All rights reserved.
 10885  
 10886  	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 10887  
 10888  	    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 10889  	    - 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.
 10890  
 10891  	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.
 10892  	*/
 10893  
 10894  	(function (Math) {
 10895  	    // Shortcuts
 10896  	    var C = CryptoJS;
 10897  	    var C_lib = C.lib;
 10898  	    var WordArray = C_lib.WordArray;
 10899  	    var Hasher = C_lib.Hasher;
 10900  	    var C_algo = C.algo;
 10901  
 10902  	    // Constants table
 10903  	    var _zl = WordArray.create([
 10904  	        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
 10905  	        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,
 10906  	        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,
 10907  	        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,
 10908  	        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);
 10909  	    var _zr = WordArray.create([
 10910  	        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,
 10911  	        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,
 10912  	        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,
 10913  	        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,
 10914  	        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);
 10915  	    var _sl = WordArray.create([
 10916  	         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,
 10917  	        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,
 10918  	        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,
 10919  	          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,
 10920  	        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);
 10921  	    var _sr = WordArray.create([
 10922  	        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,
 10923  	        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,
 10924  	        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,
 10925  	        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,
 10926  	        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);
 10927  
 10928  	    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
 10929  	    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
 10930  
 10931  	    /**
 10932  	     * RIPEMD160 hash algorithm.
 10933  	     */
 10934  	    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
 10935  	        _doReset: function () {
 10936  	            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
 10937  	        },
 10938  
 10939  	        _doProcessBlock: function (M, offset) {
 10940  
 10941  	            // Swap endian
 10942  	            for (var i = 0; i < 16; i++) {
 10943  	                // Shortcuts
 10944  	                var offset_i = offset + i;
 10945  	                var M_offset_i = M[offset_i];
 10946  
 10947  	                // Swap
 10948  	                M[offset_i] = (
 10949  	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
 10950  	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
 10951  	                );
 10952  	            }
 10953  	            // Shortcut
 10954  	            var H  = this._hash.words;
 10955  	            var hl = _hl.words;
 10956  	            var hr = _hr.words;
 10957  	            var zl = _zl.words;
 10958  	            var zr = _zr.words;
 10959  	            var sl = _sl.words;
 10960  	            var sr = _sr.words;
 10961  
 10962  	            // Working variables
 10963  	            var al, bl, cl, dl, el;
 10964  	            var ar, br, cr, dr, er;
 10965  
 10966  	            ar = al = H[0];
 10967  	            br = bl = H[1];
 10968  	            cr = cl = H[2];
 10969  	            dr = dl = H[3];
 10970  	            er = el = H[4];
 10971  	            // Computation
 10972  	            var t;
 10973  	            for (var i = 0; i < 80; i += 1) {
 10974  	                t = (al +  M[offset+zl[i]])|0;
 10975  	                if (i<16){
 10976  		            t +=  f1(bl,cl,dl) + hl[0];
 10977  	                } else if (i<32) {
 10978  		            t +=  f2(bl,cl,dl) + hl[1];
 10979  	                } else if (i<48) {
 10980  		            t +=  f3(bl,cl,dl) + hl[2];
 10981  	                } else if (i<64) {
 10982  		            t +=  f4(bl,cl,dl) + hl[3];
 10983  	                } else {// if (i<80) {
 10984  		            t +=  f5(bl,cl,dl) + hl[4];
 10985  	                }
 10986  	                t = t|0;
 10987  	                t =  rotl(t,sl[i]);
 10988  	                t = (t+el)|0;
 10989  	                al = el;
 10990  	                el = dl;
 10991  	                dl = rotl(cl, 10);
 10992  	                cl = bl;
 10993  	                bl = t;
 10994  
 10995  	                t = (ar + M[offset+zr[i]])|0;
 10996  	                if (i<16){
 10997  		            t +=  f5(br,cr,dr) + hr[0];
 10998  	                } else if (i<32) {
 10999  		            t +=  f4(br,cr,dr) + hr[1];
 11000  	                } else if (i<48) {
 11001  		            t +=  f3(br,cr,dr) + hr[2];
 11002  	                } else if (i<64) {
 11003  		            t +=  f2(br,cr,dr) + hr[3];
 11004  	                } else {// if (i<80) {
 11005  		            t +=  f1(br,cr,dr) + hr[4];
 11006  	                }
 11007  	                t = t|0;
 11008  	                t =  rotl(t,sr[i]) ;
 11009  	                t = (t+er)|0;
 11010  	                ar = er;
 11011  	                er = dr;
 11012  	                dr = rotl(cr, 10);
 11013  	                cr = br;
 11014  	                br = t;
 11015  	            }
 11016  	            // Intermediate hash value
 11017  	            t    = (H[1] + cl + dr)|0;
 11018  	            H[1] = (H[2] + dl + er)|0;
 11019  	            H[2] = (H[3] + el + ar)|0;
 11020  	            H[3] = (H[4] + al + br)|0;
 11021  	            H[4] = (H[0] + bl + cr)|0;
 11022  	            H[0] =  t;
 11023  	        },
 11024  
 11025  	        _doFinalize: function () {
 11026  	            // Shortcuts
 11027  	            var data = this._data;
 11028  	            var dataWords = data.words;
 11029  
 11030  	            var nBitsTotal = this._nDataBytes * 8;
 11031  	            var nBitsLeft = data.sigBytes * 8;
 11032  
 11033  	            // Add padding
 11034  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11035  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
 11036  	                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |
 11037  	                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)
 11038  	            );
 11039  	            data.sigBytes = (dataWords.length + 1) * 4;
 11040  
 11041  	            // Hash final blocks
 11042  	            this._process();
 11043  
 11044  	            // Shortcuts
 11045  	            var hash = this._hash;
 11046  	            var H = hash.words;
 11047  
 11048  	            // Swap endian
 11049  	            for (var i = 0; i < 5; i++) {
 11050  	                // Shortcut
 11051  	                var H_i = H[i];
 11052  
 11053  	                // Swap
 11054  	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
 11055  	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
 11056  	            }
 11057  
 11058  	            // Return final computed hash
 11059  	            return hash;
 11060  	        },
 11061  
 11062  	        clone: function () {
 11063  	            var clone = Hasher.clone.call(this);
 11064  	            clone._hash = this._hash.clone();
 11065  
 11066  	            return clone;
 11067  	        }
 11068  	    });
 11069  
 11070  
 11071  	    function f1(x, y, z) {
 11072  	        return ((x) ^ (y) ^ (z));
 11073  
 11074  	    }
 11075  
 11076  	    function f2(x, y, z) {
 11077  	        return (((x)&(y)) | ((~x)&(z)));
 11078  	    }
 11079  
 11080  	    function f3(x, y, z) {
 11081  	        return (((x) | (~(y))) ^ (z));
 11082  	    }
 11083  
 11084  	    function f4(x, y, z) {
 11085  	        return (((x) & (z)) | ((y)&(~(z))));
 11086  	    }
 11087  
 11088  	    function f5(x, y, z) {
 11089  	        return ((x) ^ ((y) |(~(z))));
 11090  
 11091  	    }
 11092  
 11093  	    function rotl(x,n) {
 11094  	        return (x<<n) | (x>>>(32-n));
 11095  	    }
 11096  
 11097  
 11098  	    /**
 11099  	     * Shortcut function to the hasher's object interface.
 11100  	     *
 11101  	     * @param {WordArray|string} message The message to hash.
 11102  	     *
 11103  	     * @return {WordArray} The hash.
 11104  	     *
 11105  	     * @static
 11106  	     *
 11107  	     * @example
 11108  	     *
 11109  	     *     var hash = CryptoJS.RIPEMD160('message');
 11110  	     *     var hash = CryptoJS.RIPEMD160(wordArray);
 11111  	     */
 11112  	    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
 11113  
 11114  	    /**
 11115  	     * Shortcut function to the HMAC's object interface.
 11116  	     *
 11117  	     * @param {WordArray|string} message The message to hash.
 11118  	     * @param {WordArray|string} key The secret key.
 11119  	     *
 11120  	     * @return {WordArray} The HMAC.
 11121  	     *
 11122  	     * @static
 11123  	     *
 11124  	     * @example
 11125  	     *
 11126  	     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);
 11127  	     */
 11128  	    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
 11129  	}(Math));
 11130  
 11131  
 11132  	return CryptoJS.RIPEMD160;
 11133  
 11134  }));
 11135  },{"./core":53}],77:[function(require,module,exports){
 11136  ;(function (root, factory) {
 11137  	if (typeof exports === "object") {
 11138  		// CommonJS
 11139  		module.exports = exports = factory(require("./core"));
 11140  	}
 11141  	else if (typeof define === "function" && define.amd) {
 11142  		// AMD
 11143  		define(["./core"], factory);
 11144  	}
 11145  	else {
 11146  		// Global (browser)
 11147  		factory(root.CryptoJS);
 11148  	}
 11149  }(this, function (CryptoJS) {
 11150  
 11151  	(function () {
 11152  	    // Shortcuts
 11153  	    var C = CryptoJS;
 11154  	    var C_lib = C.lib;
 11155  	    var WordArray = C_lib.WordArray;
 11156  	    var Hasher = C_lib.Hasher;
 11157  	    var C_algo = C.algo;
 11158  
 11159  	    // Reusable object
 11160  	    var W = [];
 11161  
 11162  	    /**
 11163  	     * SHA-1 hash algorithm.
 11164  	     */
 11165  	    var SHA1 = C_algo.SHA1 = Hasher.extend({
 11166  	        _doReset: function () {
 11167  	            this._hash = new WordArray.init([
 11168  	                0x67452301, 0xefcdab89,
 11169  	                0x98badcfe, 0x10325476,
 11170  	                0xc3d2e1f0
 11171  	            ]);
 11172  	        },
 11173  
 11174  	        _doProcessBlock: function (M, offset) {
 11175  	            // Shortcut
 11176  	            var H = this._hash.words;
 11177  
 11178  	            // Working variables
 11179  	            var a = H[0];
 11180  	            var b = H[1];
 11181  	            var c = H[2];
 11182  	            var d = H[3];
 11183  	            var e = H[4];
 11184  
 11185  	            // Computation
 11186  	            for (var i = 0; i < 80; i++) {
 11187  	                if (i < 16) {
 11188  	                    W[i] = M[offset + i] | 0;
 11189  	                } else {
 11190  	                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
 11191  	                    W[i] = (n << 1) | (n >>> 31);
 11192  	                }
 11193  
 11194  	                var t = ((a << 5) | (a >>> 27)) + e + W[i];
 11195  	                if (i < 20) {
 11196  	                    t += ((b & c) | (~b & d)) + 0x5a827999;
 11197  	                } else if (i < 40) {
 11198  	                    t += (b ^ c ^ d) + 0x6ed9eba1;
 11199  	                } else if (i < 60) {
 11200  	                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
 11201  	                } else /* if (i < 80) */ {
 11202  	                    t += (b ^ c ^ d) - 0x359d3e2a;
 11203  	                }
 11204  
 11205  	                e = d;
 11206  	                d = c;
 11207  	                c = (b << 30) | (b >>> 2);
 11208  	                b = a;
 11209  	                a = t;
 11210  	            }
 11211  
 11212  	            // Intermediate hash value
 11213  	            H[0] = (H[0] + a) | 0;
 11214  	            H[1] = (H[1] + b) | 0;
 11215  	            H[2] = (H[2] + c) | 0;
 11216  	            H[3] = (H[3] + d) | 0;
 11217  	            H[4] = (H[4] + e) | 0;
 11218  	        },
 11219  
 11220  	        _doFinalize: function () {
 11221  	            // Shortcuts
 11222  	            var data = this._data;
 11223  	            var dataWords = data.words;
 11224  
 11225  	            var nBitsTotal = this._nDataBytes * 8;
 11226  	            var nBitsLeft = data.sigBytes * 8;
 11227  
 11228  	            // Add padding
 11229  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11230  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
 11231  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
 11232  	            data.sigBytes = dataWords.length * 4;
 11233  
 11234  	            // Hash final blocks
 11235  	            this._process();
 11236  
 11237  	            // Return final computed hash
 11238  	            return this._hash;
 11239  	        },
 11240  
 11241  	        clone: function () {
 11242  	            var clone = Hasher.clone.call(this);
 11243  	            clone._hash = this._hash.clone();
 11244  
 11245  	            return clone;
 11246  	        }
 11247  	    });
 11248  
 11249  	    /**
 11250  	     * Shortcut function to the hasher's object interface.
 11251  	     *
 11252  	     * @param {WordArray|string} message The message to hash.
 11253  	     *
 11254  	     * @return {WordArray} The hash.
 11255  	     *
 11256  	     * @static
 11257  	     *
 11258  	     * @example
 11259  	     *
 11260  	     *     var hash = CryptoJS.SHA1('message');
 11261  	     *     var hash = CryptoJS.SHA1(wordArray);
 11262  	     */
 11263  	    C.SHA1 = Hasher._createHelper(SHA1);
 11264  
 11265  	    /**
 11266  	     * Shortcut function to the HMAC's object interface.
 11267  	     *
 11268  	     * @param {WordArray|string} message The message to hash.
 11269  	     * @param {WordArray|string} key The secret key.
 11270  	     *
 11271  	     * @return {WordArray} The HMAC.
 11272  	     *
 11273  	     * @static
 11274  	     *
 11275  	     * @example
 11276  	     *
 11277  	     *     var hmac = CryptoJS.HmacSHA1(message, key);
 11278  	     */
 11279  	    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
 11280  	}());
 11281  
 11282  
 11283  	return CryptoJS.SHA1;
 11284  
 11285  }));
 11286  },{"./core":53}],78:[function(require,module,exports){
 11287  ;(function (root, factory, undef) {
 11288  	if (typeof exports === "object") {
 11289  		// CommonJS
 11290  		module.exports = exports = factory(require("./core"), require("./sha256"));
 11291  	}
 11292  	else if (typeof define === "function" && define.amd) {
 11293  		// AMD
 11294  		define(["./core", "./sha256"], factory);
 11295  	}
 11296  	else {
 11297  		// Global (browser)
 11298  		factory(root.CryptoJS);
 11299  	}
 11300  }(this, function (CryptoJS) {
 11301  
 11302  	(function () {
 11303  	    // Shortcuts
 11304  	    var C = CryptoJS;
 11305  	    var C_lib = C.lib;
 11306  	    var WordArray = C_lib.WordArray;
 11307  	    var C_algo = C.algo;
 11308  	    var SHA256 = C_algo.SHA256;
 11309  
 11310  	    /**
 11311  	     * SHA-224 hash algorithm.
 11312  	     */
 11313  	    var SHA224 = C_algo.SHA224 = SHA256.extend({
 11314  	        _doReset: function () {
 11315  	            this._hash = new WordArray.init([
 11316  	                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
 11317  	                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
 11318  	            ]);
 11319  	        },
 11320  
 11321  	        _doFinalize: function () {
 11322  	            var hash = SHA256._doFinalize.call(this);
 11323  
 11324  	            hash.sigBytes -= 4;
 11325  
 11326  	            return hash;
 11327  	        }
 11328  	    });
 11329  
 11330  	    /**
 11331  	     * Shortcut function to the hasher's object interface.
 11332  	     *
 11333  	     * @param {WordArray|string} message The message to hash.
 11334  	     *
 11335  	     * @return {WordArray} The hash.
 11336  	     *
 11337  	     * @static
 11338  	     *
 11339  	     * @example
 11340  	     *
 11341  	     *     var hash = CryptoJS.SHA224('message');
 11342  	     *     var hash = CryptoJS.SHA224(wordArray);
 11343  	     */
 11344  	    C.SHA224 = SHA256._createHelper(SHA224);
 11345  
 11346  	    /**
 11347  	     * Shortcut function to the HMAC's object interface.
 11348  	     *
 11349  	     * @param {WordArray|string} message The message to hash.
 11350  	     * @param {WordArray|string} key The secret key.
 11351  	     *
 11352  	     * @return {WordArray} The HMAC.
 11353  	     *
 11354  	     * @static
 11355  	     *
 11356  	     * @example
 11357  	     *
 11358  	     *     var hmac = CryptoJS.HmacSHA224(message, key);
 11359  	     */
 11360  	    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
 11361  	}());
 11362  
 11363  
 11364  	return CryptoJS.SHA224;
 11365  
 11366  }));
 11367  },{"./core":53,"./sha256":79}],79:[function(require,module,exports){
 11368  ;(function (root, factory) {
 11369  	if (typeof exports === "object") {
 11370  		// CommonJS
 11371  		module.exports = exports = factory(require("./core"));
 11372  	}
 11373  	else if (typeof define === "function" && define.amd) {
 11374  		// AMD
 11375  		define(["./core"], factory);
 11376  	}
 11377  	else {
 11378  		// Global (browser)
 11379  		factory(root.CryptoJS);
 11380  	}
 11381  }(this, function (CryptoJS) {
 11382  
 11383  	(function (Math) {
 11384  	    // Shortcuts
 11385  	    var C = CryptoJS;
 11386  	    var C_lib = C.lib;
 11387  	    var WordArray = C_lib.WordArray;
 11388  	    var Hasher = C_lib.Hasher;
 11389  	    var C_algo = C.algo;
 11390  
 11391  	    // Initialization and round constants tables
 11392  	    var H = [];
 11393  	    var K = [];
 11394  
 11395  	    // Compute constants
 11396  	    (function () {
 11397  	        function isPrime(n) {
 11398  	            var sqrtN = Math.sqrt(n);
 11399  	            for (var factor = 2; factor <= sqrtN; factor++) {
 11400  	                if (!(n % factor)) {
 11401  	                    return false;
 11402  	                }
 11403  	            }
 11404  
 11405  	            return true;
 11406  	        }
 11407  
 11408  	        function getFractionalBits(n) {
 11409  	            return ((n - (n | 0)) * 0x100000000) | 0;
 11410  	        }
 11411  
 11412  	        var n = 2;
 11413  	        var nPrime = 0;
 11414  	        while (nPrime < 64) {
 11415  	            if (isPrime(n)) {
 11416  	                if (nPrime < 8) {
 11417  	                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
 11418  	                }
 11419  	                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
 11420  
 11421  	                nPrime++;
 11422  	            }
 11423  
 11424  	            n++;
 11425  	        }
 11426  	    }());
 11427  
 11428  	    // Reusable object
 11429  	    var W = [];
 11430  
 11431  	    /**
 11432  	     * SHA-256 hash algorithm.
 11433  	     */
 11434  	    var SHA256 = C_algo.SHA256 = Hasher.extend({
 11435  	        _doReset: function () {
 11436  	            this._hash = new WordArray.init(H.slice(0));
 11437  	        },
 11438  
 11439  	        _doProcessBlock: function (M, offset) {
 11440  	            // Shortcut
 11441  	            var H = this._hash.words;
 11442  
 11443  	            // Working variables
 11444  	            var a = H[0];
 11445  	            var b = H[1];
 11446  	            var c = H[2];
 11447  	            var d = H[3];
 11448  	            var e = H[4];
 11449  	            var f = H[5];
 11450  	            var g = H[6];
 11451  	            var h = H[7];
 11452  
 11453  	            // Computation
 11454  	            for (var i = 0; i < 64; i++) {
 11455  	                if (i < 16) {
 11456  	                    W[i] = M[offset + i] | 0;
 11457  	                } else {
 11458  	                    var gamma0x = W[i - 15];
 11459  	                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^
 11460  	                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^
 11461  	                                   (gamma0x >>> 3);
 11462  
 11463  	                    var gamma1x = W[i - 2];
 11464  	                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^
 11465  	                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^
 11466  	                                   (gamma1x >>> 10);
 11467  
 11468  	                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
 11469  	                }
 11470  
 11471  	                var ch  = (e & f) ^ (~e & g);
 11472  	                var maj = (a & b) ^ (a & c) ^ (b & c);
 11473  
 11474  	                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
 11475  	                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));
 11476  
 11477  	                var t1 = h + sigma1 + ch + K[i] + W[i];
 11478  	                var t2 = sigma0 + maj;
 11479  
 11480  	                h = g;
 11481  	                g = f;
 11482  	                f = e;
 11483  	                e = (d + t1) | 0;
 11484  	                d = c;
 11485  	                c = b;
 11486  	                b = a;
 11487  	                a = (t1 + t2) | 0;
 11488  	            }
 11489  
 11490  	            // Intermediate hash value
 11491  	            H[0] = (H[0] + a) | 0;
 11492  	            H[1] = (H[1] + b) | 0;
 11493  	            H[2] = (H[2] + c) | 0;
 11494  	            H[3] = (H[3] + d) | 0;
 11495  	            H[4] = (H[4] + e) | 0;
 11496  	            H[5] = (H[5] + f) | 0;
 11497  	            H[6] = (H[6] + g) | 0;
 11498  	            H[7] = (H[7] + h) | 0;
 11499  	        },
 11500  
 11501  	        _doFinalize: function () {
 11502  	            // Shortcuts
 11503  	            var data = this._data;
 11504  	            var dataWords = data.words;
 11505  
 11506  	            var nBitsTotal = this._nDataBytes * 8;
 11507  	            var nBitsLeft = data.sigBytes * 8;
 11508  
 11509  	            // Add padding
 11510  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11511  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
 11512  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
 11513  	            data.sigBytes = dataWords.length * 4;
 11514  
 11515  	            // Hash final blocks
 11516  	            this._process();
 11517  
 11518  	            // Return final computed hash
 11519  	            return this._hash;
 11520  	        },
 11521  
 11522  	        clone: function () {
 11523  	            var clone = Hasher.clone.call(this);
 11524  	            clone._hash = this._hash.clone();
 11525  
 11526  	            return clone;
 11527  	        }
 11528  	    });
 11529  
 11530  	    /**
 11531  	     * Shortcut function to the hasher's object interface.
 11532  	     *
 11533  	     * @param {WordArray|string} message The message to hash.
 11534  	     *
 11535  	     * @return {WordArray} The hash.
 11536  	     *
 11537  	     * @static
 11538  	     *
 11539  	     * @example
 11540  	     *
 11541  	     *     var hash = CryptoJS.SHA256('message');
 11542  	     *     var hash = CryptoJS.SHA256(wordArray);
 11543  	     */
 11544  	    C.SHA256 = Hasher._createHelper(SHA256);
 11545  
 11546  	    /**
 11547  	     * Shortcut function to the HMAC's object interface.
 11548  	     *
 11549  	     * @param {WordArray|string} message The message to hash.
 11550  	     * @param {WordArray|string} key The secret key.
 11551  	     *
 11552  	     * @return {WordArray} The HMAC.
 11553  	     *
 11554  	     * @static
 11555  	     *
 11556  	     * @example
 11557  	     *
 11558  	     *     var hmac = CryptoJS.HmacSHA256(message, key);
 11559  	     */
 11560  	    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
 11561  	}(Math));
 11562  
 11563  
 11564  	return CryptoJS.SHA256;
 11565  
 11566  }));
 11567  },{"./core":53}],80:[function(require,module,exports){
 11568  ;(function (root, factory, undef) {
 11569  	if (typeof exports === "object") {
 11570  		// CommonJS
 11571  		module.exports = exports = factory(require("./core"), require("./x64-core"));
 11572  	}
 11573  	else if (typeof define === "function" && define.amd) {
 11574  		// AMD
 11575  		define(["./core", "./x64-core"], factory);
 11576  	}
 11577  	else {
 11578  		// Global (browser)
 11579  		factory(root.CryptoJS);
 11580  	}
 11581  }(this, function (CryptoJS) {
 11582  
 11583  	(function (Math) {
 11584  	    // Shortcuts
 11585  	    var C = CryptoJS;
 11586  	    var C_lib = C.lib;
 11587  	    var WordArray = C_lib.WordArray;
 11588  	    var Hasher = C_lib.Hasher;
 11589  	    var C_x64 = C.x64;
 11590  	    var X64Word = C_x64.Word;
 11591  	    var C_algo = C.algo;
 11592  
 11593  	    // Constants tables
 11594  	    var RHO_OFFSETS = [];
 11595  	    var PI_INDEXES  = [];
 11596  	    var ROUND_CONSTANTS = [];
 11597  
 11598  	    // Compute Constants
 11599  	    (function () {
 11600  	        // Compute rho offset constants
 11601  	        var x = 1, y = 0;
 11602  	        for (var t = 0; t < 24; t++) {
 11603  	            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
 11604  
 11605  	            var newX = y % 5;
 11606  	            var newY = (2 * x + 3 * y) % 5;
 11607  	            x = newX;
 11608  	            y = newY;
 11609  	        }
 11610  
 11611  	        // Compute pi index constants
 11612  	        for (var x = 0; x < 5; x++) {
 11613  	            for (var y = 0; y < 5; y++) {
 11614  	                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
 11615  	            }
 11616  	        }
 11617  
 11618  	        // Compute round constants
 11619  	        var LFSR = 0x01;
 11620  	        for (var i = 0; i < 24; i++) {
 11621  	            var roundConstantMsw = 0;
 11622  	            var roundConstantLsw = 0;
 11623  
 11624  	            for (var j = 0; j < 7; j++) {
 11625  	                if (LFSR & 0x01) {
 11626  	                    var bitPosition = (1 << j) - 1;
 11627  	                    if (bitPosition < 32) {
 11628  	                        roundConstantLsw ^= 1 << bitPosition;
 11629  	                    } else /* if (bitPosition >= 32) */ {
 11630  	                        roundConstantMsw ^= 1 << (bitPosition - 32);
 11631  	                    }
 11632  	                }
 11633  
 11634  	                // Compute next LFSR
 11635  	                if (LFSR & 0x80) {
 11636  	                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
 11637  	                    LFSR = (LFSR << 1) ^ 0x71;
 11638  	                } else {
 11639  	                    LFSR <<= 1;
 11640  	                }
 11641  	            }
 11642  
 11643  	            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
 11644  	        }
 11645  	    }());
 11646  
 11647  	    // Reusable objects for temporary values
 11648  	    var T = [];
 11649  	    (function () {
 11650  	        for (var i = 0; i < 25; i++) {
 11651  	            T[i] = X64Word.create();
 11652  	        }
 11653  	    }());
 11654  
 11655  	    /**
 11656  	     * SHA-3 hash algorithm.
 11657  	     */
 11658  	    var SHA3 = C_algo.SHA3 = Hasher.extend({
 11659  	        /**
 11660  	         * Configuration options.
 11661  	         *
 11662  	         * @property {number} outputLength
 11663  	         *   The desired number of bits in the output hash.
 11664  	         *   Only values permitted are: 224, 256, 384, 512.
 11665  	         *   Default: 512
 11666  	         */
 11667  	        cfg: Hasher.cfg.extend({
 11668  	            outputLength: 512
 11669  	        }),
 11670  
 11671  	        _doReset: function () {
 11672  	            var state = this._state = []
 11673  	            for (var i = 0; i < 25; i++) {
 11674  	                state[i] = new X64Word.init();
 11675  	            }
 11676  
 11677  	            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
 11678  	        },
 11679  
 11680  	        _doProcessBlock: function (M, offset) {
 11681  	            // Shortcuts
 11682  	            var state = this._state;
 11683  	            var nBlockSizeLanes = this.blockSize / 2;
 11684  
 11685  	            // Absorb
 11686  	            for (var i = 0; i < nBlockSizeLanes; i++) {
 11687  	                // Shortcuts
 11688  	                var M2i  = M[offset + 2 * i];
 11689  	                var M2i1 = M[offset + 2 * i + 1];
 11690  
 11691  	                // Swap endian
 11692  	                M2i = (
 11693  	                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |
 11694  	                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)
 11695  	                );
 11696  	                M2i1 = (
 11697  	                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |
 11698  	                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)
 11699  	                );
 11700  
 11701  	                // Absorb message into state
 11702  	                var lane = state[i];
 11703  	                lane.high ^= M2i1;
 11704  	                lane.low  ^= M2i;
 11705  	            }
 11706  
 11707  	            // Rounds
 11708  	            for (var round = 0; round < 24; round++) {
 11709  	                // Theta
 11710  	                for (var x = 0; x < 5; x++) {
 11711  	                    // Mix column lanes
 11712  	                    var tMsw = 0, tLsw = 0;
 11713  	                    for (var y = 0; y < 5; y++) {
 11714  	                        var lane = state[x + 5 * y];
 11715  	                        tMsw ^= lane.high;
 11716  	                        tLsw ^= lane.low;
 11717  	                    }
 11718  
 11719  	                    // Temporary values
 11720  	                    var Tx = T[x];
 11721  	                    Tx.high = tMsw;
 11722  	                    Tx.low  = tLsw;
 11723  	                }
 11724  	                for (var x = 0; x < 5; x++) {
 11725  	                    // Shortcuts
 11726  	                    var Tx4 = T[(x + 4) % 5];
 11727  	                    var Tx1 = T[(x + 1) % 5];
 11728  	                    var Tx1Msw = Tx1.high;
 11729  	                    var Tx1Lsw = Tx1.low;
 11730  
 11731  	                    // Mix surrounding columns
 11732  	                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
 11733  	                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
 11734  	                    for (var y = 0; y < 5; y++) {
 11735  	                        var lane = state[x + 5 * y];
 11736  	                        lane.high ^= tMsw;
 11737  	                        lane.low  ^= tLsw;
 11738  	                    }
 11739  	                }
 11740  
 11741  	                // Rho Pi
 11742  	                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
 11743  	                    // Shortcuts
 11744  	                    var lane = state[laneIndex];
 11745  	                    var laneMsw = lane.high;
 11746  	                    var laneLsw = lane.low;
 11747  	                    var rhoOffset = RHO_OFFSETS[laneIndex];
 11748  
 11749  	                    // Rotate lanes
 11750  	                    if (rhoOffset < 32) {
 11751  	                        var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
 11752  	                        var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
 11753  	                    } else /* if (rhoOffset >= 32) */ {
 11754  	                        var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
 11755  	                        var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
 11756  	                    }
 11757  
 11758  	                    // Transpose lanes
 11759  	                    var TPiLane = T[PI_INDEXES[laneIndex]];
 11760  	                    TPiLane.high = tMsw;
 11761  	                    TPiLane.low  = tLsw;
 11762  	                }
 11763  
 11764  	                // Rho pi at x = y = 0
 11765  	                var T0 = T[0];
 11766  	                var state0 = state[0];
 11767  	                T0.high = state0.high;
 11768  	                T0.low  = state0.low;
 11769  
 11770  	                // Chi
 11771  	                for (var x = 0; x < 5; x++) {
 11772  	                    for (var y = 0; y < 5; y++) {
 11773  	                        // Shortcuts
 11774  	                        var laneIndex = x + 5 * y;
 11775  	                        var lane = state[laneIndex];
 11776  	                        var TLane = T[laneIndex];
 11777  	                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];
 11778  	                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];
 11779  
 11780  	                        // Mix rows
 11781  	                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
 11782  	                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);
 11783  	                    }
 11784  	                }
 11785  
 11786  	                // Iota
 11787  	                var lane = state[0];
 11788  	                var roundConstant = ROUND_CONSTANTS[round];
 11789  	                lane.high ^= roundConstant.high;
 11790  	                lane.low  ^= roundConstant.low;;
 11791  	            }
 11792  	        },
 11793  
 11794  	        _doFinalize: function () {
 11795  	            // Shortcuts
 11796  	            var data = this._data;
 11797  	            var dataWords = data.words;
 11798  	            var nBitsTotal = this._nDataBytes * 8;
 11799  	            var nBitsLeft = data.sigBytes * 8;
 11800  	            var blockSizeBits = this.blockSize * 32;
 11801  
 11802  	            // Add padding
 11803  	            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
 11804  	            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
 11805  	            data.sigBytes = dataWords.length * 4;
 11806  
 11807  	            // Hash final blocks
 11808  	            this._process();
 11809  
 11810  	            // Shortcuts
 11811  	            var state = this._state;
 11812  	            var outputLengthBytes = this.cfg.outputLength / 8;
 11813  	            var outputLengthLanes = outputLengthBytes / 8;
 11814  
 11815  	            // Squeeze
 11816  	            var hashWords = [];
 11817  	            for (var i = 0; i < outputLengthLanes; i++) {
 11818  	                // Shortcuts
 11819  	                var lane = state[i];
 11820  	                var laneMsw = lane.high;
 11821  	                var laneLsw = lane.low;
 11822  
 11823  	                // Swap endian
 11824  	                laneMsw = (
 11825  	                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |
 11826  	                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)
 11827  	                );
 11828  	                laneLsw = (
 11829  	                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |
 11830  	                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)
 11831  	                );
 11832  
 11833  	                // Squeeze state to retrieve hash
 11834  	                hashWords.push(laneLsw);
 11835  	                hashWords.push(laneMsw);
 11836  	            }
 11837  
 11838  	            // Return final computed hash
 11839  	            return new WordArray.init(hashWords, outputLengthBytes);
 11840  	        },
 11841  
 11842  	        clone: function () {
 11843  	            var clone = Hasher.clone.call(this);
 11844  
 11845  	            var state = clone._state = this._state.slice(0);
 11846  	            for (var i = 0; i < 25; i++) {
 11847  	                state[i] = state[i].clone();
 11848  	            }
 11849  
 11850  	            return clone;
 11851  	        }
 11852  	    });
 11853  
 11854  	    /**
 11855  	     * Shortcut function to the hasher's object interface.
 11856  	     *
 11857  	     * @param {WordArray|string} message The message to hash.
 11858  	     *
 11859  	     * @return {WordArray} The hash.
 11860  	     *
 11861  	     * @static
 11862  	     *
 11863  	     * @example
 11864  	     *
 11865  	     *     var hash = CryptoJS.SHA3('message');
 11866  	     *     var hash = CryptoJS.SHA3(wordArray);
 11867  	     */
 11868  	    C.SHA3 = Hasher._createHelper(SHA3);
 11869  
 11870  	    /**
 11871  	     * Shortcut function to the HMAC's object interface.
 11872  	     *
 11873  	     * @param {WordArray|string} message The message to hash.
 11874  	     * @param {WordArray|string} key The secret key.
 11875  	     *
 11876  	     * @return {WordArray} The HMAC.
 11877  	     *
 11878  	     * @static
 11879  	     *
 11880  	     * @example
 11881  	     *
 11882  	     *     var hmac = CryptoJS.HmacSHA3(message, key);
 11883  	     */
 11884  	    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
 11885  	}(Math));
 11886  
 11887  
 11888  	return CryptoJS.SHA3;
 11889  
 11890  }));
 11891  },{"./core":53,"./x64-core":84}],81:[function(require,module,exports){
 11892  ;(function (root, factory, undef) {
 11893  	if (typeof exports === "object") {
 11894  		// CommonJS
 11895  		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"));
 11896  	}
 11897  	else if (typeof define === "function" && define.amd) {
 11898  		// AMD
 11899  		define(["./core", "./x64-core", "./sha512"], factory);
 11900  	}
 11901  	else {
 11902  		// Global (browser)
 11903  		factory(root.CryptoJS);
 11904  	}
 11905  }(this, function (CryptoJS) {
 11906  
 11907  	(function () {
 11908  	    // Shortcuts
 11909  	    var C = CryptoJS;
 11910  	    var C_x64 = C.x64;
 11911  	    var X64Word = C_x64.Word;
 11912  	    var X64WordArray = C_x64.WordArray;
 11913  	    var C_algo = C.algo;
 11914  	    var SHA512 = C_algo.SHA512;
 11915  
 11916  	    /**
 11917  	     * SHA-384 hash algorithm.
 11918  	     */
 11919  	    var SHA384 = C_algo.SHA384 = SHA512.extend({
 11920  	        _doReset: function () {
 11921  	            this._hash = new X64WordArray.init([
 11922  	                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
 11923  	                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
 11924  	                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
 11925  	                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
 11926  	            ]);
 11927  	        },
 11928  
 11929  	        _doFinalize: function () {
 11930  	            var hash = SHA512._doFinalize.call(this);
 11931  
 11932  	            hash.sigBytes -= 16;
 11933  
 11934  	            return hash;
 11935  	        }
 11936  	    });
 11937  
 11938  	    /**
 11939  	     * Shortcut function to the hasher's object interface.
 11940  	     *
 11941  	     * @param {WordArray|string} message The message to hash.
 11942  	     *
 11943  	     * @return {WordArray} The hash.
 11944  	     *
 11945  	     * @static
 11946  	     *
 11947  	     * @example
 11948  	     *
 11949  	     *     var hash = CryptoJS.SHA384('message');
 11950  	     *     var hash = CryptoJS.SHA384(wordArray);
 11951  	     */
 11952  	    C.SHA384 = SHA512._createHelper(SHA384);
 11953  
 11954  	    /**
 11955  	     * Shortcut function to the HMAC's object interface.
 11956  	     *
 11957  	     * @param {WordArray|string} message The message to hash.
 11958  	     * @param {WordArray|string} key The secret key.
 11959  	     *
 11960  	     * @return {WordArray} The HMAC.
 11961  	     *
 11962  	     * @static
 11963  	     *
 11964  	     * @example
 11965  	     *
 11966  	     *     var hmac = CryptoJS.HmacSHA384(message, key);
 11967  	     */
 11968  	    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
 11969  	}());
 11970  
 11971  
 11972  	return CryptoJS.SHA384;
 11973  
 11974  }));
 11975  },{"./core":53,"./sha512":82,"./x64-core":84}],82:[function(require,module,exports){
 11976  ;(function (root, factory, undef) {
 11977  	if (typeof exports === "object") {
 11978  		// CommonJS
 11979  		module.exports = exports = factory(require("./core"), require("./x64-core"));
 11980  	}
 11981  	else if (typeof define === "function" && define.amd) {
 11982  		// AMD
 11983  		define(["./core", "./x64-core"], factory);
 11984  	}
 11985  	else {
 11986  		// Global (browser)
 11987  		factory(root.CryptoJS);
 11988  	}
 11989  }(this, function (CryptoJS) {
 11990  
 11991  	(function () {
 11992  	    // Shortcuts
 11993  	    var C = CryptoJS;
 11994  	    var C_lib = C.lib;
 11995  	    var Hasher = C_lib.Hasher;
 11996  	    var C_x64 = C.x64;
 11997  	    var X64Word = C_x64.Word;
 11998  	    var X64WordArray = C_x64.WordArray;
 11999  	    var C_algo = C.algo;
 12000  
 12001  	    function X64Word_create() {
 12002  	        return X64Word.create.apply(X64Word, arguments);
 12003  	    }
 12004  
 12005  	    // Constants
 12006  	    var K = [
 12007  	        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
 12008  	        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
 12009  	        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
 12010  	        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
 12011  	        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
 12012  	        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
 12013  	        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
 12014  	        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
 12015  	        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
 12016  	        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
 12017  	        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
 12018  	        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
 12019  	        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
 12020  	        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
 12021  	        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
 12022  	        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
 12023  	        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
 12024  	        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
 12025  	        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
 12026  	        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
 12027  	        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
 12028  	        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
 12029  	        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
 12030  	        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
 12031  	        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
 12032  	        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
 12033  	        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
 12034  	        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
 12035  	        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
 12036  	        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
 12037  	        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
 12038  	        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
 12039  	        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
 12040  	        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
 12041  	        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
 12042  	        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
 12043  	        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
 12044  	        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
 12045  	        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
 12046  	        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
 12047  	    ];
 12048  
 12049  	    // Reusable objects
 12050  	    var W = [];
 12051  	    (function () {
 12052  	        for (var i = 0; i < 80; i++) {
 12053  	            W[i] = X64Word_create();
 12054  	        }
 12055  	    }());
 12056  
 12057  	    /**
 12058  	     * SHA-512 hash algorithm.
 12059  	     */
 12060  	    var SHA512 = C_algo.SHA512 = Hasher.extend({
 12061  	        _doReset: function () {
 12062  	            this._hash = new X64WordArray.init([
 12063  	                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
 12064  	                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
 12065  	                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
 12066  	                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
 12067  	            ]);
 12068  	        },
 12069  
 12070  	        _doProcessBlock: function (M, offset) {
 12071  	            // Shortcuts
 12072  	            var H = this._hash.words;
 12073  
 12074  	            var H0 = H[0];
 12075  	            var H1 = H[1];
 12076  	            var H2 = H[2];
 12077  	            var H3 = H[3];
 12078  	            var H4 = H[4];
 12079  	            var H5 = H[5];
 12080  	            var H6 = H[6];
 12081  	            var H7 = H[7];
 12082  
 12083  	            var H0h = H0.high;
 12084  	            var H0l = H0.low;
 12085  	            var H1h = H1.high;
 12086  	            var H1l = H1.low;
 12087  	            var H2h = H2.high;
 12088  	            var H2l = H2.low;
 12089  	            var H3h = H3.high;
 12090  	            var H3l = H3.low;
 12091  	            var H4h = H4.high;
 12092  	            var H4l = H4.low;
 12093  	            var H5h = H5.high;
 12094  	            var H5l = H5.low;
 12095  	            var H6h = H6.high;
 12096  	            var H6l = H6.low;
 12097  	            var H7h = H7.high;
 12098  	            var H7l = H7.low;
 12099  
 12100  	            // Working variables
 12101  	            var ah = H0h;
 12102  	            var al = H0l;
 12103  	            var bh = H1h;
 12104  	            var bl = H1l;
 12105  	            var ch = H2h;
 12106  	            var cl = H2l;
 12107  	            var dh = H3h;
 12108  	            var dl = H3l;
 12109  	            var eh = H4h;
 12110  	            var el = H4l;
 12111  	            var fh = H5h;
 12112  	            var fl = H5l;
 12113  	            var gh = H6h;
 12114  	            var gl = H6l;
 12115  	            var hh = H7h;
 12116  	            var hl = H7l;
 12117  
 12118  	            // Rounds
 12119  	            for (var i = 0; i < 80; i++) {
 12120  	                // Shortcut
 12121  	                var Wi = W[i];
 12122  
 12123  	                // Extend message
 12124  	                if (i < 16) {
 12125  	                    var Wih = Wi.high = M[offset + i * 2]     | 0;
 12126  	                    var Wil = Wi.low  = M[offset + i * 2 + 1] | 0;
 12127  	                } else {
 12128  	                    // Gamma0
 12129  	                    var gamma0x  = W[i - 15];
 12130  	                    var gamma0xh = gamma0x.high;
 12131  	                    var gamma0xl = gamma0x.low;
 12132  	                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
 12133  	                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
 12134  
 12135  	                    // Gamma1
 12136  	                    var gamma1x  = W[i - 2];
 12137  	                    var gamma1xh = gamma1x.high;
 12138  	                    var gamma1xl = gamma1x.low;
 12139  	                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
 12140  	                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
 12141  
 12142  	                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
 12143  	                    var Wi7  = W[i - 7];
 12144  	                    var Wi7h = Wi7.high;
 12145  	                    var Wi7l = Wi7.low;
 12146  
 12147  	                    var Wi16  = W[i - 16];
 12148  	                    var Wi16h = Wi16.high;
 12149  	                    var Wi16l = Wi16.low;
 12150  
 12151  	                    var Wil = gamma0l + Wi7l;
 12152  	                    var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
 12153  	                    var Wil = Wil + gamma1l;
 12154  	                    var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
 12155  	                    var Wil = Wil + Wi16l;
 12156  	                    var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
 12157  
 12158  	                    Wi.high = Wih;
 12159  	                    Wi.low  = Wil;
 12160  	                }
 12161  
 12162  	                var chh  = (eh & fh) ^ (~eh & gh);
 12163  	                var chl  = (el & fl) ^ (~el & gl);
 12164  	                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
 12165  	                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
 12166  
 12167  	                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
 12168  	                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
 12169  	                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
 12170  	                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
 12171  
 12172  	                // t1 = h + sigma1 + ch + K[i] + W[i]
 12173  	                var Ki  = K[i];
 12174  	                var Kih = Ki.high;
 12175  	                var Kil = Ki.low;
 12176  
 12177  	                var t1l = hl + sigma1l;
 12178  	                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
 12179  	                var t1l = t1l + chl;
 12180  	                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
 12181  	                var t1l = t1l + Kil;
 12182  	                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
 12183  	                var t1l = t1l + Wil;
 12184  	                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
 12185  
 12186  	                // t2 = sigma0 + maj
 12187  	                var t2l = sigma0l + majl;
 12188  	                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
 12189  
 12190  	                // Update working variables
 12191  	                hh = gh;
 12192  	                hl = gl;
 12193  	                gh = fh;
 12194  	                gl = fl;
 12195  	                fh = eh;
 12196  	                fl = el;
 12197  	                el = (dl + t1l) | 0;
 12198  	                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
 12199  	                dh = ch;
 12200  	                dl = cl;
 12201  	                ch = bh;
 12202  	                cl = bl;
 12203  	                bh = ah;
 12204  	                bl = al;
 12205  	                al = (t1l + t2l) | 0;
 12206  	                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
 12207  	            }
 12208  
 12209  	            // Intermediate hash value
 12210  	            H0l = H0.low  = (H0l + al);
 12211  	            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
 12212  	            H1l = H1.low  = (H1l + bl);
 12213  	            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
 12214  	            H2l = H2.low  = (H2l + cl);
 12215  	            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
 12216  	            H3l = H3.low  = (H3l + dl);
 12217  	            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
 12218  	            H4l = H4.low  = (H4l + el);
 12219  	            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
 12220  	            H5l = H5.low  = (H5l + fl);
 12221  	            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
 12222  	            H6l = H6.low  = (H6l + gl);
 12223  	            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
 12224  	            H7l = H7.low  = (H7l + hl);
 12225  	            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
 12226  	        },
 12227  
 12228  	        _doFinalize: function () {
 12229  	            // Shortcuts
 12230  	            var data = this._data;
 12231  	            var dataWords = data.words;
 12232  
 12233  	            var nBitsTotal = this._nDataBytes * 8;
 12234  	            var nBitsLeft = data.sigBytes * 8;
 12235  
 12236  	            // Add padding
 12237  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 12238  	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
 12239  	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
 12240  	            data.sigBytes = dataWords.length * 4;
 12241  
 12242  	            // Hash final blocks
 12243  	            this._process();
 12244  
 12245  	            // Convert hash to 32-bit word array before returning
 12246  	            var hash = this._hash.toX32();
 12247  
 12248  	            // Return final computed hash
 12249  	            return hash;
 12250  	        },
 12251  
 12252  	        clone: function () {
 12253  	            var clone = Hasher.clone.call(this);
 12254  	            clone._hash = this._hash.clone();
 12255  
 12256  	            return clone;
 12257  	        },
 12258  
 12259  	        blockSize: 1024/32
 12260  	    });
 12261  
 12262  	    /**
 12263  	     * Shortcut function to the hasher's object interface.
 12264  	     *
 12265  	     * @param {WordArray|string} message The message to hash.
 12266  	     *
 12267  	     * @return {WordArray} The hash.
 12268  	     *
 12269  	     * @static
 12270  	     *
 12271  	     * @example
 12272  	     *
 12273  	     *     var hash = CryptoJS.SHA512('message');
 12274  	     *     var hash = CryptoJS.SHA512(wordArray);
 12275  	     */
 12276  	    C.SHA512 = Hasher._createHelper(SHA512);
 12277  
 12278  	    /**
 12279  	     * Shortcut function to the HMAC's object interface.
 12280  	     *
 12281  	     * @param {WordArray|string} message The message to hash.
 12282  	     * @param {WordArray|string} key The secret key.
 12283  	     *
 12284  	     * @return {WordArray} The HMAC.
 12285  	     *
 12286  	     * @static
 12287  	     *
 12288  	     * @example
 12289  	     *
 12290  	     *     var hmac = CryptoJS.HmacSHA512(message, key);
 12291  	     */
 12292  	    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
 12293  	}());
 12294  
 12295  
 12296  	return CryptoJS.SHA512;
 12297  
 12298  }));
 12299  },{"./core":53,"./x64-core":84}],83:[function(require,module,exports){
 12300  ;(function (root, factory, undef) {
 12301  	if (typeof exports === "object") {
 12302  		// CommonJS
 12303  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 12304  	}
 12305  	else if (typeof define === "function" && define.amd) {
 12306  		// AMD
 12307  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 12308  	}
 12309  	else {
 12310  		// Global (browser)
 12311  		factory(root.CryptoJS);
 12312  	}
 12313  }(this, function (CryptoJS) {
 12314  
 12315  	(function () {
 12316  	    // Shortcuts
 12317  	    var C = CryptoJS;
 12318  	    var C_lib = C.lib;
 12319  	    var WordArray = C_lib.WordArray;
 12320  	    var BlockCipher = C_lib.BlockCipher;
 12321  	    var C_algo = C.algo;
 12322  
 12323  	    // Permuted Choice 1 constants
 12324  	    var PC1 = [
 12325  	        57, 49, 41, 33, 25, 17, 9,  1,
 12326  	        58, 50, 42, 34, 26, 18, 10, 2,
 12327  	        59, 51, 43, 35, 27, 19, 11, 3,
 12328  	        60, 52, 44, 36, 63, 55, 47, 39,
 12329  	        31, 23, 15, 7,  62, 54, 46, 38,
 12330  	        30, 22, 14, 6,  61, 53, 45, 37,
 12331  	        29, 21, 13, 5,  28, 20, 12, 4
 12332  	    ];
 12333  
 12334  	    // Permuted Choice 2 constants
 12335  	    var PC2 = [
 12336  	        14, 17, 11, 24, 1,  5,
 12337  	        3,  28, 15, 6,  21, 10,
 12338  	        23, 19, 12, 4,  26, 8,
 12339  	        16, 7,  27, 20, 13, 2,
 12340  	        41, 52, 31, 37, 47, 55,
 12341  	        30, 40, 51, 45, 33, 48,
 12342  	        44, 49, 39, 56, 34, 53,
 12343  	        46, 42, 50, 36, 29, 32
 12344  	    ];
 12345  
 12346  	    // Cumulative bit shift constants
 12347  	    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
 12348  
 12349  	    // SBOXes and round permutation constants
 12350  	    var SBOX_P = [
 12351  	        {
 12352  	            0x0: 0x808200,
 12353  	            0x10000000: 0x8000,
 12354  	            0x20000000: 0x808002,
 12355  	            0x30000000: 0x2,
 12356  	            0x40000000: 0x200,
 12357  	            0x50000000: 0x808202,
 12358  	            0x60000000: 0x800202,
 12359  	            0x70000000: 0x800000,
 12360  	            0x80000000: 0x202,
 12361  	            0x90000000: 0x800200,
 12362  	            0xa0000000: 0x8200,
 12363  	            0xb0000000: 0x808000,
 12364  	            0xc0000000: 0x8002,
 12365  	            0xd0000000: 0x800002,
 12366  	            0xe0000000: 0x0,
 12367  	            0xf0000000: 0x8202,
 12368  	            0x8000000: 0x0,
 12369  	            0x18000000: 0x808202,
 12370  	            0x28000000: 0x8202,
 12371  	            0x38000000: 0x8000,
 12372  	            0x48000000: 0x808200,
 12373  	            0x58000000: 0x200,
 12374  	            0x68000000: 0x808002,
 12375  	            0x78000000: 0x2,
 12376  	            0x88000000: 0x800200,
 12377  	            0x98000000: 0x8200,
 12378  	            0xa8000000: 0x808000,
 12379  	            0xb8000000: 0x800202,
 12380  	            0xc8000000: 0x800002,
 12381  	            0xd8000000: 0x8002,
 12382  	            0xe8000000: 0x202,
 12383  	            0xf8000000: 0x800000,
 12384  	            0x1: 0x8000,
 12385  	            0x10000001: 0x2,
 12386  	            0x20000001: 0x808200,
 12387  	            0x30000001: 0x800000,
 12388  	            0x40000001: 0x808002,
 12389  	            0x50000001: 0x8200,
 12390  	            0x60000001: 0x200,
 12391  	            0x70000001: 0x800202,
 12392  	            0x80000001: 0x808202,
 12393  	            0x90000001: 0x808000,
 12394  	            0xa0000001: 0x800002,
 12395  	            0xb0000001: 0x8202,
 12396  	            0xc0000001: 0x202,
 12397  	            0xd0000001: 0x800200,
 12398  	            0xe0000001: 0x8002,
 12399  	            0xf0000001: 0x0,
 12400  	            0x8000001: 0x808202,
 12401  	            0x18000001: 0x808000,
 12402  	            0x28000001: 0x800000,
 12403  	            0x38000001: 0x200,
 12404  	            0x48000001: 0x8000,
 12405  	            0x58000001: 0x800002,
 12406  	            0x68000001: 0x2,
 12407  	            0x78000001: 0x8202,
 12408  	            0x88000001: 0x8002,
 12409  	            0x98000001: 0x800202,
 12410  	            0xa8000001: 0x202,
 12411  	            0xb8000001: 0x808200,
 12412  	            0xc8000001: 0x800200,
 12413  	            0xd8000001: 0x0,
 12414  	            0xe8000001: 0x8200,
 12415  	            0xf8000001: 0x808002
 12416  	        },
 12417  	        {
 12418  	            0x0: 0x40084010,
 12419  	            0x1000000: 0x4000,
 12420  	            0x2000000: 0x80000,
 12421  	            0x3000000: 0x40080010,
 12422  	            0x4000000: 0x40000010,
 12423  	            0x5000000: 0x40084000,
 12424  	            0x6000000: 0x40004000,
 12425  	            0x7000000: 0x10,
 12426  	            0x8000000: 0x84000,
 12427  	            0x9000000: 0x40004010,
 12428  	            0xa000000: 0x40000000,
 12429  	            0xb000000: 0x84010,
 12430  	            0xc000000: 0x80010,
 12431  	            0xd000000: 0x0,
 12432  	            0xe000000: 0x4010,
 12433  	            0xf000000: 0x40080000,
 12434  	            0x800000: 0x40004000,
 12435  	            0x1800000: 0x84010,
 12436  	            0x2800000: 0x10,
 12437  	            0x3800000: 0x40004010,
 12438  	            0x4800000: 0x40084010,
 12439  	            0x5800000: 0x40000000,
 12440  	            0x6800000: 0x80000,
 12441  	            0x7800000: 0x40080010,
 12442  	            0x8800000: 0x80010,
 12443  	            0x9800000: 0x0,
 12444  	            0xa800000: 0x4000,
 12445  	            0xb800000: 0x40080000,
 12446  	            0xc800000: 0x40000010,
 12447  	            0xd800000: 0x84000,
 12448  	            0xe800000: 0x40084000,
 12449  	            0xf800000: 0x4010,
 12450  	            0x10000000: 0x0,
 12451  	            0x11000000: 0x40080010,
 12452  	            0x12000000: 0x40004010,
 12453  	            0x13000000: 0x40084000,
 12454  	            0x14000000: 0x40080000,
 12455  	            0x15000000: 0x10,
 12456  	            0x16000000: 0x84010,
 12457  	            0x17000000: 0x4000,
 12458  	            0x18000000: 0x4010,
 12459  	            0x19000000: 0x80000,
 12460  	            0x1a000000: 0x80010,
 12461  	            0x1b000000: 0x40000010,
 12462  	            0x1c000000: 0x84000,
 12463  	            0x1d000000: 0x40004000,
 12464  	            0x1e000000: 0x40000000,
 12465  	            0x1f000000: 0x40084010,
 12466  	            0x10800000: 0x84010,
 12467  	            0x11800000: 0x80000,
 12468  	            0x12800000: 0x40080000,
 12469  	            0x13800000: 0x4000,
 12470  	            0x14800000: 0x40004000,
 12471  	            0x15800000: 0x40084010,
 12472  	            0x16800000: 0x10,
 12473  	            0x17800000: 0x40000000,
 12474  	            0x18800000: 0x40084000,
 12475  	            0x19800000: 0x40000010,
 12476  	            0x1a800000: 0x40004010,
 12477  	            0x1b800000: 0x80010,
 12478  	            0x1c800000: 0x0,
 12479  	            0x1d800000: 0x4010,
 12480  	            0x1e800000: 0x40080010,
 12481  	            0x1f800000: 0x84000
 12482  	        },
 12483  	        {
 12484  	            0x0: 0x104,
 12485  	            0x100000: 0x0,
 12486  	            0x200000: 0x4000100,
 12487  	            0x300000: 0x10104,
 12488  	            0x400000: 0x10004,
 12489  	            0x500000: 0x4000004,
 12490  	            0x600000: 0x4010104,
 12491  	            0x700000: 0x4010000,
 12492  	            0x800000: 0x4000000,
 12493  	            0x900000: 0x4010100,
 12494  	            0xa00000: 0x10100,
 12495  	            0xb00000: 0x4010004,
 12496  	            0xc00000: 0x4000104,
 12497  	            0xd00000: 0x10000,
 12498  	            0xe00000: 0x4,
 12499  	            0xf00000: 0x100,
 12500  	            0x80000: 0x4010100,
 12501  	            0x180000: 0x4010004,
 12502  	            0x280000: 0x0,
 12503  	            0x380000: 0x4000100,
 12504  	            0x480000: 0x4000004,
 12505  	            0x580000: 0x10000,
 12506  	            0x680000: 0x10004,
 12507  	            0x780000: 0x104,
 12508  	            0x880000: 0x4,
 12509  	            0x980000: 0x100,
 12510  	            0xa80000: 0x4010000,
 12511  	            0xb80000: 0x10104,
 12512  	            0xc80000: 0x10100,
 12513  	            0xd80000: 0x4000104,
 12514  	            0xe80000: 0x4010104,
 12515  	            0xf80000: 0x4000000,
 12516  	            0x1000000: 0x4010100,
 12517  	            0x1100000: 0x10004,
 12518  	            0x1200000: 0x10000,
 12519  	            0x1300000: 0x4000100,
 12520  	            0x1400000: 0x100,
 12521  	            0x1500000: 0x4010104,
 12522  	            0x1600000: 0x4000004,
 12523  	            0x1700000: 0x0,
 12524  	            0x1800000: 0x4000104,
 12525  	            0x1900000: 0x4000000,
 12526  	            0x1a00000: 0x4,
 12527  	            0x1b00000: 0x10100,
 12528  	            0x1c00000: 0x4010000,
 12529  	            0x1d00000: 0x104,
 12530  	            0x1e00000: 0x10104,
 12531  	            0x1f00000: 0x4010004,
 12532  	            0x1080000: 0x4000000,
 12533  	            0x1180000: 0x104,
 12534  	            0x1280000: 0x4010100,
 12535  	            0x1380000: 0x0,
 12536  	            0x1480000: 0x10004,
 12537  	            0x1580000: 0x4000100,
 12538  	            0x1680000: 0x100,
 12539  	            0x1780000: 0x4010004,
 12540  	            0x1880000: 0x10000,
 12541  	            0x1980000: 0x4010104,
 12542  	            0x1a80000: 0x10104,
 12543  	            0x1b80000: 0x4000004,
 12544  	            0x1c80000: 0x4000104,
 12545  	            0x1d80000: 0x4010000,
 12546  	            0x1e80000: 0x4,
 12547  	            0x1f80000: 0x10100
 12548  	        },
 12549  	        {
 12550  	            0x0: 0x80401000,
 12551  	            0x10000: 0x80001040,
 12552  	            0x20000: 0x401040,
 12553  	            0x30000: 0x80400000,
 12554  	            0x40000: 0x0,
 12555  	            0x50000: 0x401000,
 12556  	            0x60000: 0x80000040,
 12557  	            0x70000: 0x400040,
 12558  	            0x80000: 0x80000000,
 12559  	            0x90000: 0x400000,
 12560  	            0xa0000: 0x40,
 12561  	            0xb0000: 0x80001000,
 12562  	            0xc0000: 0x80400040,
 12563  	            0xd0000: 0x1040,
 12564  	            0xe0000: 0x1000,
 12565  	            0xf0000: 0x80401040,
 12566  	            0x8000: 0x80001040,
 12567  	            0x18000: 0x40,
 12568  	            0x28000: 0x80400040,
 12569  	            0x38000: 0x80001000,
 12570  	            0x48000: 0x401000,
 12571  	            0x58000: 0x80401040,
 12572  	            0x68000: 0x0,
 12573  	            0x78000: 0x80400000,
 12574  	            0x88000: 0x1000,
 12575  	            0x98000: 0x80401000,
 12576  	            0xa8000: 0x400000,
 12577  	            0xb8000: 0x1040,
 12578  	            0xc8000: 0x80000000,
 12579  	            0xd8000: 0x400040,
 12580  	            0xe8000: 0x401040,
 12581  	            0xf8000: 0x80000040,
 12582  	            0x100000: 0x400040,
 12583  	            0x110000: 0x401000,
 12584  	            0x120000: 0x80000040,
 12585  	            0x130000: 0x0,
 12586  	            0x140000: 0x1040,
 12587  	            0x150000: 0x80400040,
 12588  	            0x160000: 0x80401000,
 12589  	            0x170000: 0x80001040,
 12590  	            0x180000: 0x80401040,
 12591  	            0x190000: 0x80000000,
 12592  	            0x1a0000: 0x80400000,
 12593  	            0x1b0000: 0x401040,
 12594  	            0x1c0000: 0x80001000,
 12595  	            0x1d0000: 0x400000,
 12596  	            0x1e0000: 0x40,
 12597  	            0x1f0000: 0x1000,
 12598  	            0x108000: 0x80400000,
 12599  	            0x118000: 0x80401040,
 12600  	            0x128000: 0x0,
 12601  	            0x138000: 0x401000,
 12602  	            0x148000: 0x400040,
 12603  	            0x158000: 0x80000000,
 12604  	            0x168000: 0x80001040,
 12605  	            0x178000: 0x40,
 12606  	            0x188000: 0x80000040,
 12607  	            0x198000: 0x1000,
 12608  	            0x1a8000: 0x80001000,
 12609  	            0x1b8000: 0x80400040,
 12610  	            0x1c8000: 0x1040,
 12611  	            0x1d8000: 0x80401000,
 12612  	            0x1e8000: 0x400000,
 12613  	            0x1f8000: 0x401040
 12614  	        },
 12615  	        {
 12616  	            0x0: 0x80,
 12617  	            0x1000: 0x1040000,
 12618  	            0x2000: 0x40000,
 12619  	            0x3000: 0x20000000,
 12620  	            0x4000: 0x20040080,
 12621  	            0x5000: 0x1000080,
 12622  	            0x6000: 0x21000080,
 12623  	            0x7000: 0x40080,
 12624  	            0x8000: 0x1000000,
 12625  	            0x9000: 0x20040000,
 12626  	            0xa000: 0x20000080,
 12627  	            0xb000: 0x21040080,
 12628  	            0xc000: 0x21040000,
 12629  	            0xd000: 0x0,
 12630  	            0xe000: 0x1040080,
 12631  	            0xf000: 0x21000000,
 12632  	            0x800: 0x1040080,
 12633  	            0x1800: 0x21000080,
 12634  	            0x2800: 0x80,
 12635  	            0x3800: 0x1040000,
 12636  	            0x4800: 0x40000,
 12637  	            0x5800: 0x20040080,
 12638  	            0x6800: 0x21040000,
 12639  	            0x7800: 0x20000000,
 12640  	            0x8800: 0x20040000,
 12641  	            0x9800: 0x0,
 12642  	            0xa800: 0x21040080,
 12643  	            0xb800: 0x1000080,
 12644  	            0xc800: 0x20000080,
 12645  	            0xd800: 0x21000000,
 12646  	            0xe800: 0x1000000,
 12647  	            0xf800: 0x40080,
 12648  	            0x10000: 0x40000,
 12649  	            0x11000: 0x80,
 12650  	            0x12000: 0x20000000,
 12651  	            0x13000: 0x21000080,
 12652  	            0x14000: 0x1000080,
 12653  	            0x15000: 0x21040000,
 12654  	            0x16000: 0x20040080,
 12655  	            0x17000: 0x1000000,
 12656  	            0x18000: 0x21040080,
 12657  	            0x19000: 0x21000000,
 12658  	            0x1a000: 0x1040000,
 12659  	            0x1b000: 0x20040000,
 12660  	            0x1c000: 0x40080,
 12661  	            0x1d000: 0x20000080,
 12662  	            0x1e000: 0x0,
 12663  	            0x1f000: 0x1040080,
 12664  	            0x10800: 0x21000080,
 12665  	            0x11800: 0x1000000,
 12666  	            0x12800: 0x1040000,
 12667  	            0x13800: 0x20040080,
 12668  	            0x14800: 0x20000000,
 12669  	            0x15800: 0x1040080,
 12670  	            0x16800: 0x80,
 12671  	            0x17800: 0x21040000,
 12672  	            0x18800: 0x40080,
 12673  	            0x19800: 0x21040080,
 12674  	            0x1a800: 0x0,
 12675  	            0x1b800: 0x21000000,
 12676  	            0x1c800: 0x1000080,
 12677  	            0x1d800: 0x40000,
 12678  	            0x1e800: 0x20040000,
 12679  	            0x1f800: 0x20000080
 12680  	        },
 12681  	        {
 12682  	            0x0: 0x10000008,
 12683  	            0x100: 0x2000,
 12684  	            0x200: 0x10200000,
 12685  	            0x300: 0x10202008,
 12686  	            0x400: 0x10002000,
 12687  	            0x500: 0x200000,
 12688  	            0x600: 0x200008,
 12689  	            0x700: 0x10000000,
 12690  	            0x800: 0x0,
 12691  	            0x900: 0x10002008,
 12692  	            0xa00: 0x202000,
 12693  	            0xb00: 0x8,
 12694  	            0xc00: 0x10200008,
 12695  	            0xd00: 0x202008,
 12696  	            0xe00: 0x2008,
 12697  	            0xf00: 0x10202000,
 12698  	            0x80: 0x10200000,
 12699  	            0x180: 0x10202008,
 12700  	            0x280: 0x8,
 12701  	            0x380: 0x200000,
 12702  	            0x480: 0x202008,
 12703  	            0x580: 0x10000008,
 12704  	            0x680: 0x10002000,
 12705  	            0x780: 0x2008,
 12706  	            0x880: 0x200008,
 12707  	            0x980: 0x2000,
 12708  	            0xa80: 0x10002008,
 12709  	            0xb80: 0x10200008,
 12710  	            0xc80: 0x0,
 12711  	            0xd80: 0x10202000,
 12712  	            0xe80: 0x202000,
 12713  	            0xf80: 0x10000000,
 12714  	            0x1000: 0x10002000,
 12715  	            0x1100: 0x10200008,
 12716  	            0x1200: 0x10202008,
 12717  	            0x1300: 0x2008,
 12718  	            0x1400: 0x200000,
 12719  	            0x1500: 0x10000000,
 12720  	            0x1600: 0x10000008,
 12721  	            0x1700: 0x202000,
 12722  	            0x1800: 0x202008,
 12723  	            0x1900: 0x0,
 12724  	            0x1a00: 0x8,
 12725  	            0x1b00: 0x10200000,
 12726  	            0x1c00: 0x2000,
 12727  	            0x1d00: 0x10002008,
 12728  	            0x1e00: 0x10202000,
 12729  	            0x1f00: 0x200008,
 12730  	            0x1080: 0x8,
 12731  	            0x1180: 0x202000,
 12732  	            0x1280: 0x200000,
 12733  	            0x1380: 0x10000008,
 12734  	            0x1480: 0x10002000,
 12735  	            0x1580: 0x2008,
 12736  	            0x1680: 0x10202008,
 12737  	            0x1780: 0x10200000,
 12738  	            0x1880: 0x10202000,
 12739  	            0x1980: 0x10200008,
 12740  	            0x1a80: 0x2000,
 12741  	            0x1b80: 0x202008,
 12742  	            0x1c80: 0x200008,
 12743  	            0x1d80: 0x0,
 12744  	            0x1e80: 0x10000000,
 12745  	            0x1f80: 0x10002008
 12746  	        },
 12747  	        {
 12748  	            0x0: 0x100000,
 12749  	            0x10: 0x2000401,
 12750  	            0x20: 0x400,
 12751  	            0x30: 0x100401,
 12752  	            0x40: 0x2100401,
 12753  	            0x50: 0x0,
 12754  	            0x60: 0x1,
 12755  	            0x70: 0x2100001,
 12756  	            0x80: 0x2000400,
 12757  	            0x90: 0x100001,
 12758  	            0xa0: 0x2000001,
 12759  	            0xb0: 0x2100400,
 12760  	            0xc0: 0x2100000,
 12761  	            0xd0: 0x401,
 12762  	            0xe0: 0x100400,
 12763  	            0xf0: 0x2000000,
 12764  	            0x8: 0x2100001,
 12765  	            0x18: 0x0,
 12766  	            0x28: 0x2000401,
 12767  	            0x38: 0x2100400,
 12768  	            0x48: 0x100000,
 12769  	            0x58: 0x2000001,
 12770  	            0x68: 0x2000000,
 12771  	            0x78: 0x401,
 12772  	            0x88: 0x100401,
 12773  	            0x98: 0x2000400,
 12774  	            0xa8: 0x2100000,
 12775  	            0xb8: 0x100001,
 12776  	            0xc8: 0x400,
 12777  	            0xd8: 0x2100401,
 12778  	            0xe8: 0x1,
 12779  	            0xf8: 0x100400,
 12780  	            0x100: 0x2000000,
 12781  	            0x110: 0x100000,
 12782  	            0x120: 0x2000401,
 12783  	            0x130: 0x2100001,
 12784  	            0x140: 0x100001,
 12785  	            0x150: 0x2000400,
 12786  	            0x160: 0x2100400,
 12787  	            0x170: 0x100401,
 12788  	            0x180: 0x401,
 12789  	            0x190: 0x2100401,
 12790  	            0x1a0: 0x100400,
 12791  	            0x1b0: 0x1,
 12792  	            0x1c0: 0x0,
 12793  	            0x1d0: 0x2100000,
 12794  	            0x1e0: 0x2000001,
 12795  	            0x1f0: 0x400,
 12796  	            0x108: 0x100400,
 12797  	            0x118: 0x2000401,
 12798  	            0x128: 0x2100001,
 12799  	            0x138: 0x1,
 12800  	            0x148: 0x2000000,
 12801  	            0x158: 0x100000,
 12802  	            0x168: 0x401,
 12803  	            0x178: 0x2100400,
 12804  	            0x188: 0x2000001,
 12805  	            0x198: 0x2100000,
 12806  	            0x1a8: 0x0,
 12807  	            0x1b8: 0x2100401,
 12808  	            0x1c8: 0x100401,
 12809  	            0x1d8: 0x400,
 12810  	            0x1e8: 0x2000400,
 12811  	            0x1f8: 0x100001
 12812  	        },
 12813  	        {
 12814  	            0x0: 0x8000820,
 12815  	            0x1: 0x20000,
 12816  	            0x2: 0x8000000,
 12817  	            0x3: 0x20,
 12818  	            0x4: 0x20020,
 12819  	            0x5: 0x8020820,
 12820  	            0x6: 0x8020800,
 12821  	            0x7: 0x800,
 12822  	            0x8: 0x8020000,
 12823  	            0x9: 0x8000800,
 12824  	            0xa: 0x20800,
 12825  	            0xb: 0x8020020,
 12826  	            0xc: 0x820,
 12827  	            0xd: 0x0,
 12828  	            0xe: 0x8000020,
 12829  	            0xf: 0x20820,
 12830  	            0x80000000: 0x800,
 12831  	            0x80000001: 0x8020820,
 12832  	            0x80000002: 0x8000820,
 12833  	            0x80000003: 0x8000000,
 12834  	            0x80000004: 0x8020000,
 12835  	            0x80000005: 0x20800,
 12836  	            0x80000006: 0x20820,
 12837  	            0x80000007: 0x20,
 12838  	            0x80000008: 0x8000020,
 12839  	            0x80000009: 0x820,
 12840  	            0x8000000a: 0x20020,
 12841  	            0x8000000b: 0x8020800,
 12842  	            0x8000000c: 0x0,
 12843  	            0x8000000d: 0x8020020,
 12844  	            0x8000000e: 0x8000800,
 12845  	            0x8000000f: 0x20000,
 12846  	            0x10: 0x20820,
 12847  	            0x11: 0x8020800,
 12848  	            0x12: 0x20,
 12849  	            0x13: 0x800,
 12850  	            0x14: 0x8000800,
 12851  	            0x15: 0x8000020,
 12852  	            0x16: 0x8020020,
 12853  	            0x17: 0x20000,
 12854  	            0x18: 0x0,
 12855  	            0x19: 0x20020,
 12856  	            0x1a: 0x8020000,
 12857  	            0x1b: 0x8000820,
 12858  	            0x1c: 0x8020820,
 12859  	            0x1d: 0x20800,
 12860  	            0x1e: 0x820,
 12861  	            0x1f: 0x8000000,
 12862  	            0x80000010: 0x20000,
 12863  	            0x80000011: 0x800,
 12864  	            0x80000012: 0x8020020,
 12865  	            0x80000013: 0x20820,
 12866  	            0x80000014: 0x20,
 12867  	            0x80000015: 0x8020000,
 12868  	            0x80000016: 0x8000000,
 12869  	            0x80000017: 0x8000820,
 12870  	            0x80000018: 0x8020820,
 12871  	            0x80000019: 0x8000020,
 12872  	            0x8000001a: 0x8000800,
 12873  	            0x8000001b: 0x0,
 12874  	            0x8000001c: 0x20800,
 12875  	            0x8000001d: 0x820,
 12876  	            0x8000001e: 0x20020,
 12877  	            0x8000001f: 0x8020800
 12878  	        }
 12879  	    ];
 12880  
 12881  	    // Masks that select the SBOX input
 12882  	    var SBOX_MASK = [
 12883  	        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
 12884  	        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
 12885  	    ];
 12886  
 12887  	    /**
 12888  	     * DES block cipher algorithm.
 12889  	     */
 12890  	    var DES = C_algo.DES = BlockCipher.extend({
 12891  	        _doReset: function () {
 12892  	            // Shortcuts
 12893  	            var key = this._key;
 12894  	            var keyWords = key.words;
 12895  
 12896  	            // Select 56 bits according to PC1
 12897  	            var keyBits = [];
 12898  	            for (var i = 0; i < 56; i++) {
 12899  	                var keyBitPos = PC1[i] - 1;
 12900  	                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
 12901  	            }
 12902  
 12903  	            // Assemble 16 subkeys
 12904  	            var subKeys = this._subKeys = [];
 12905  	            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
 12906  	                // Create subkey
 12907  	                var subKey = subKeys[nSubKey] = [];
 12908  
 12909  	                // Shortcut
 12910  	                var bitShift = BIT_SHIFTS[nSubKey];
 12911  
 12912  	                // Select 48 bits according to PC2
 12913  	                for (var i = 0; i < 24; i++) {
 12914  	                    // Select from the left 28 key bits
 12915  	                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
 12916  
 12917  	                    // Select from the right 28 key bits
 12918  	                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
 12919  	                }
 12920  
 12921  	                // Since each subkey is applied to an expanded 32-bit input,
 12922  	                // the subkey can be broken into 8 values scaled to 32-bits,
 12923  	                // which allows the key to be used without expansion
 12924  	                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
 12925  	                for (var i = 1; i < 7; i++) {
 12926  	                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
 12927  	                }
 12928  	                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
 12929  	            }
 12930  
 12931  	            // Compute inverse subkeys
 12932  	            var invSubKeys = this._invSubKeys = [];
 12933  	            for (var i = 0; i < 16; i++) {
 12934  	                invSubKeys[i] = subKeys[15 - i];
 12935  	            }
 12936  	        },
 12937  
 12938  	        encryptBlock: function (M, offset) {
 12939  	            this._doCryptBlock(M, offset, this._subKeys);
 12940  	        },
 12941  
 12942  	        decryptBlock: function (M, offset) {
 12943  	            this._doCryptBlock(M, offset, this._invSubKeys);
 12944  	        },
 12945  
 12946  	        _doCryptBlock: function (M, offset, subKeys) {
 12947  	            // Get input
 12948  	            this._lBlock = M[offset];
 12949  	            this._rBlock = M[offset + 1];
 12950  
 12951  	            // Initial permutation
 12952  	            exchangeLR.call(this, 4,  0x0f0f0f0f);
 12953  	            exchangeLR.call(this, 16, 0x0000ffff);
 12954  	            exchangeRL.call(this, 2,  0x33333333);
 12955  	            exchangeRL.call(this, 8,  0x00ff00ff);
 12956  	            exchangeLR.call(this, 1,  0x55555555);
 12957  
 12958  	            // Rounds
 12959  	            for (var round = 0; round < 16; round++) {
 12960  	                // Shortcuts
 12961  	                var subKey = subKeys[round];
 12962  	                var lBlock = this._lBlock;
 12963  	                var rBlock = this._rBlock;
 12964  
 12965  	                // Feistel function
 12966  	                var f = 0;
 12967  	                for (var i = 0; i < 8; i++) {
 12968  	                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
 12969  	                }
 12970  	                this._lBlock = rBlock;
 12971  	                this._rBlock = lBlock ^ f;
 12972  	            }
 12973  
 12974  	            // Undo swap from last round
 12975  	            var t = this._lBlock;
 12976  	            this._lBlock = this._rBlock;
 12977  	            this._rBlock = t;
 12978  
 12979  	            // Final permutation
 12980  	            exchangeLR.call(this, 1,  0x55555555);
 12981  	            exchangeRL.call(this, 8,  0x00ff00ff);
 12982  	            exchangeRL.call(this, 2,  0x33333333);
 12983  	            exchangeLR.call(this, 16, 0x0000ffff);
 12984  	            exchangeLR.call(this, 4,  0x0f0f0f0f);
 12985  
 12986  	            // Set output
 12987  	            M[offset] = this._lBlock;
 12988  	            M[offset + 1] = this._rBlock;
 12989  	        },
 12990  
 12991  	        keySize: 64/32,
 12992  
 12993  	        ivSize: 64/32,
 12994  
 12995  	        blockSize: 64/32
 12996  	    });
 12997  
 12998  	    // Swap bits across the left and right words
 12999  	    function exchangeLR(offset, mask) {
 13000  	        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
 13001  	        this._rBlock ^= t;
 13002  	        this._lBlock ^= t << offset;
 13003  	    }
 13004  
 13005  	    function exchangeRL(offset, mask) {
 13006  	        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
 13007  	        this._lBlock ^= t;
 13008  	        this._rBlock ^= t << offset;
 13009  	    }
 13010  
 13011  	    /**
 13012  	     * Shortcut functions to the cipher's object interface.
 13013  	     *
 13014  	     * @example
 13015  	     *
 13016  	     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
 13017  	     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);
 13018  	     */
 13019  	    C.DES = BlockCipher._createHelper(DES);
 13020  
 13021  	    /**
 13022  	     * Triple-DES block cipher algorithm.
 13023  	     */
 13024  	    var TripleDES = C_algo.TripleDES = BlockCipher.extend({
 13025  	        _doReset: function () {
 13026  	            // Shortcuts
 13027  	            var key = this._key;
 13028  	            var keyWords = key.words;
 13029  
 13030  	            // Create DES instances
 13031  	            this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
 13032  	            this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
 13033  	            this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
 13034  	        },
 13035  
 13036  	        encryptBlock: function (M, offset) {
 13037  	            this._des1.encryptBlock(M, offset);
 13038  	            this._des2.decryptBlock(M, offset);
 13039  	            this._des3.encryptBlock(M, offset);
 13040  	        },
 13041  
 13042  	        decryptBlock: function (M, offset) {
 13043  	            this._des3.decryptBlock(M, offset);
 13044  	            this._des2.encryptBlock(M, offset);
 13045  	            this._des1.decryptBlock(M, offset);
 13046  	        },
 13047  
 13048  	        keySize: 192/32,
 13049  
 13050  	        ivSize: 64/32,
 13051  
 13052  	        blockSize: 64/32
 13053  	    });
 13054  
 13055  	    /**
 13056  	     * Shortcut functions to the cipher's object interface.
 13057  	     *
 13058  	     * @example
 13059  	     *
 13060  	     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
 13061  	     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
 13062  	     */
 13063  	    C.TripleDES = BlockCipher._createHelper(TripleDES);
 13064  	}());
 13065  
 13066  
 13067  	return CryptoJS.TripleDES;
 13068  
 13069  }));
 13070  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],84:[function(require,module,exports){
 13071  ;(function (root, factory) {
 13072  	if (typeof exports === "object") {
 13073  		// CommonJS
 13074  		module.exports = exports = factory(require("./core"));
 13075  	}
 13076  	else if (typeof define === "function" && define.amd) {
 13077  		// AMD
 13078  		define(["./core"], factory);
 13079  	}
 13080  	else {
 13081  		// Global (browser)
 13082  		factory(root.CryptoJS);
 13083  	}
 13084  }(this, function (CryptoJS) {
 13085  
 13086  	(function (undefined) {
 13087  	    // Shortcuts
 13088  	    var C = CryptoJS;
 13089  	    var C_lib = C.lib;
 13090  	    var Base = C_lib.Base;
 13091  	    var X32WordArray = C_lib.WordArray;
 13092  
 13093  	    /**
 13094  	     * x64 namespace.
 13095  	     */
 13096  	    var C_x64 = C.x64 = {};
 13097  
 13098  	    /**
 13099  	     * A 64-bit word.
 13100  	     */
 13101  	    var X64Word = C_x64.Word = Base.extend({
 13102  	        /**
 13103  	         * Initializes a newly created 64-bit word.
 13104  	         *
 13105  	         * @param {number} high The high 32 bits.
 13106  	         * @param {number} low The low 32 bits.
 13107  	         *
 13108  	         * @example
 13109  	         *
 13110  	         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
 13111  	         */
 13112  	        init: function (high, low) {
 13113  	            this.high = high;
 13114  	            this.low = low;
 13115  	        }
 13116  
 13117  	        /**
 13118  	         * Bitwise NOTs this word.
 13119  	         *
 13120  	         * @return {X64Word} A new x64-Word object after negating.
 13121  	         *
 13122  	         * @example
 13123  	         *
 13124  	         *     var negated = x64Word.not();
 13125  	         */
 13126  	        // not: function () {
 13127  	            // var high = ~this.high;
 13128  	            // var low = ~this.low;
 13129  
 13130  	            // return X64Word.create(high, low);
 13131  	        // },
 13132  
 13133  	        /**
 13134  	         * Bitwise ANDs this word with the passed word.
 13135  	         *
 13136  	         * @param {X64Word} word The x64-Word to AND with this word.
 13137  	         *
 13138  	         * @return {X64Word} A new x64-Word object after ANDing.
 13139  	         *
 13140  	         * @example
 13141  	         *
 13142  	         *     var anded = x64Word.and(anotherX64Word);
 13143  	         */
 13144  	        // and: function (word) {
 13145  	            // var high = this.high & word.high;
 13146  	            // var low = this.low & word.low;
 13147  
 13148  	            // return X64Word.create(high, low);
 13149  	        // },
 13150  
 13151  	        /**
 13152  	         * Bitwise ORs this word with the passed word.
 13153  	         *
 13154  	         * @param {X64Word} word The x64-Word to OR with this word.
 13155  	         *
 13156  	         * @return {X64Word} A new x64-Word object after ORing.
 13157  	         *
 13158  	         * @example
 13159  	         *
 13160  	         *     var ored = x64Word.or(anotherX64Word);
 13161  	         */
 13162  	        // or: function (word) {
 13163  	            // var high = this.high | word.high;
 13164  	            // var low = this.low | word.low;
 13165  
 13166  	            // return X64Word.create(high, low);
 13167  	        // },
 13168  
 13169  	        /**
 13170  	         * Bitwise XORs this word with the passed word.
 13171  	         *
 13172  	         * @param {X64Word} word The x64-Word to XOR with this word.
 13173  	         *
 13174  	         * @return {X64Word} A new x64-Word object after XORing.
 13175  	         *
 13176  	         * @example
 13177  	         *
 13178  	         *     var xored = x64Word.xor(anotherX64Word);
 13179  	         */
 13180  	        // xor: function (word) {
 13181  	            // var high = this.high ^ word.high;
 13182  	            // var low = this.low ^ word.low;
 13183  
 13184  	            // return X64Word.create(high, low);
 13185  	        // },
 13186  
 13187  	        /**
 13188  	         * Shifts this word n bits to the left.
 13189  	         *
 13190  	         * @param {number} n The number of bits to shift.
 13191  	         *
 13192  	         * @return {X64Word} A new x64-Word object after shifting.
 13193  	         *
 13194  	         * @example
 13195  	         *
 13196  	         *     var shifted = x64Word.shiftL(25);
 13197  	         */
 13198  	        // shiftL: function (n) {
 13199  	            // if (n < 32) {
 13200  	                // var high = (this.high << n) | (this.low >>> (32 - n));
 13201  	                // var low = this.low << n;
 13202  	            // } else {
 13203  	                // var high = this.low << (n - 32);
 13204  	                // var low = 0;
 13205  	            // }
 13206  
 13207  	            // return X64Word.create(high, low);
 13208  	        // },
 13209  
 13210  	        /**
 13211  	         * Shifts this word n bits to the right.
 13212  	         *
 13213  	         * @param {number} n The number of bits to shift.
 13214  	         *
 13215  	         * @return {X64Word} A new x64-Word object after shifting.
 13216  	         *
 13217  	         * @example
 13218  	         *
 13219  	         *     var shifted = x64Word.shiftR(7);
 13220  	         */
 13221  	        // shiftR: function (n) {
 13222  	            // if (n < 32) {
 13223  	                // var low = (this.low >>> n) | (this.high << (32 - n));
 13224  	                // var high = this.high >>> n;
 13225  	            // } else {
 13226  	                // var low = this.high >>> (n - 32);
 13227  	                // var high = 0;
 13228  	            // }
 13229  
 13230  	            // return X64Word.create(high, low);
 13231  	        // },
 13232  
 13233  	        /**
 13234  	         * Rotates this word n bits to the left.
 13235  	         *
 13236  	         * @param {number} n The number of bits to rotate.
 13237  	         *
 13238  	         * @return {X64Word} A new x64-Word object after rotating.
 13239  	         *
 13240  	         * @example
 13241  	         *
 13242  	         *     var rotated = x64Word.rotL(25);
 13243  	         */
 13244  	        // rotL: function (n) {
 13245  	            // return this.shiftL(n).or(this.shiftR(64 - n));
 13246  	        // },
 13247  
 13248  	        /**
 13249  	         * Rotates this word n bits to the right.
 13250  	         *
 13251  	         * @param {number} n The number of bits to rotate.
 13252  	         *
 13253  	         * @return {X64Word} A new x64-Word object after rotating.
 13254  	         *
 13255  	         * @example
 13256  	         *
 13257  	         *     var rotated = x64Word.rotR(7);
 13258  	         */
 13259  	        // rotR: function (n) {
 13260  	            // return this.shiftR(n).or(this.shiftL(64 - n));
 13261  	        // },
 13262  
 13263  	        /**
 13264  	         * Adds this word with the passed word.
 13265  	         *
 13266  	         * @param {X64Word} word The x64-Word to add with this word.
 13267  	         *
 13268  	         * @return {X64Word} A new x64-Word object after adding.
 13269  	         *
 13270  	         * @example
 13271  	         *
 13272  	         *     var added = x64Word.add(anotherX64Word);
 13273  	         */
 13274  	        // add: function (word) {
 13275  	            // var low = (this.low + word.low) | 0;
 13276  	            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
 13277  	            // var high = (this.high + word.high + carry) | 0;
 13278  
 13279  	            // return X64Word.create(high, low);
 13280  	        // }
 13281  	    });
 13282  
 13283  	    /**
 13284  	     * An array of 64-bit words.
 13285  	     *
 13286  	     * @property {Array} words The array of CryptoJS.x64.Word objects.
 13287  	     * @property {number} sigBytes The number of significant bytes in this word array.
 13288  	     */
 13289  	    var X64WordArray = C_x64.WordArray = Base.extend({
 13290  	        /**
 13291  	         * Initializes a newly created word array.
 13292  	         *
 13293  	         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
 13294  	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
 13295  	         *
 13296  	         * @example
 13297  	         *
 13298  	         *     var wordArray = CryptoJS.x64.WordArray.create();
 13299  	         *
 13300  	         *     var wordArray = CryptoJS.x64.WordArray.create([
 13301  	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
 13302  	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
 13303  	         *     ]);
 13304  	         *
 13305  	         *     var wordArray = CryptoJS.x64.WordArray.create([
 13306  	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
 13307  	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
 13308  	         *     ], 10);
 13309  	         */
 13310  	        init: function (words, sigBytes) {
 13311  	            words = this.words = words || [];
 13312  
 13313  	            if (sigBytes != undefined) {
 13314  	                this.sigBytes = sigBytes;
 13315  	            } else {
 13316  	                this.sigBytes = words.length * 8;
 13317  	            }
 13318  	        },
 13319  
 13320  	        /**
 13321  	         * Converts this 64-bit word array to a 32-bit word array.
 13322  	         *
 13323  	         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
 13324  	         *
 13325  	         * @example
 13326  	         *
 13327  	         *     var x32WordArray = x64WordArray.toX32();
 13328  	         */
 13329  	        toX32: function () {
 13330  	            // Shortcuts
 13331  	            var x64Words = this.words;
 13332  	            var x64WordsLength = x64Words.length;
 13333  
 13334  	            // Convert
 13335  	            var x32Words = [];
 13336  	            for (var i = 0; i < x64WordsLength; i++) {
 13337  	                var x64Word = x64Words[i];
 13338  	                x32Words.push(x64Word.high);
 13339  	                x32Words.push(x64Word.low);
 13340  	            }
 13341  
 13342  	            return X32WordArray.create(x32Words, this.sigBytes);
 13343  	        },
 13344  
 13345  	        /**
 13346  	         * Creates a copy of this word array.
 13347  	         *
 13348  	         * @return {X64WordArray} The clone.
 13349  	         *
 13350  	         * @example
 13351  	         *
 13352  	         *     var clone = x64WordArray.clone();
 13353  	         */
 13354  	        clone: function () {
 13355  	            var clone = Base.clone.call(this);
 13356  
 13357  	            // Clone "words" array
 13358  	            var words = clone.words = this.words.slice(0);
 13359  
 13360  	            // Clone each X64Word object
 13361  	            var wordsLength = words.length;
 13362  	            for (var i = 0; i < wordsLength; i++) {
 13363  	                words[i] = words[i].clone();
 13364  	            }
 13365  
 13366  	            return clone;
 13367  	        }
 13368  	    });
 13369  	}());
 13370  
 13371  
 13372  	return CryptoJS;
 13373  
 13374  }));
 13375  },{"./core":53}],85:[function(require,module,exports){
 13376  /*! https://mths.be/utf8js v2.1.2 by @mathias */
 13377  ;(function(root) {
 13378  
 13379  	// Detect free variables `exports`
 13380  	var freeExports = typeof exports == 'object' && exports;
 13381  
 13382  	// Detect free variable `module`
 13383  	var freeModule = typeof module == 'object' && module &&
 13384  		module.exports == freeExports && module;
 13385  
 13386  	// Detect free variable `global`, from Node.js or Browserified code,
 13387  	// and use it as `root`
 13388  	var freeGlobal = typeof global == 'object' && global;
 13389  	if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
 13390  		root = freeGlobal;
 13391  	}
 13392  
 13393  	/*--------------------------------------------------------------------------*/
 13394  
 13395  	var stringFromCharCode = String.fromCharCode;
 13396  
 13397  	// Taken from https://mths.be/punycode
 13398  	function ucs2decode(string) {
 13399  		var output = [];
 13400  		var counter = 0;
 13401  		var length = string.length;
 13402  		var value;
 13403  		var extra;
 13404  		while (counter < length) {
 13405  			value = string.charCodeAt(counter++);
 13406  			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
 13407  				// high surrogate, and there is a next character
 13408  				extra = string.charCodeAt(counter++);
 13409  				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
 13410  					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
 13411  				} else {
 13412  					// unmatched surrogate; only append this code unit, in case the next
 13413  					// code unit is the high surrogate of a surrogate pair
 13414  					output.push(value);
 13415  					counter--;
 13416  				}
 13417  			} else {
 13418  				output.push(value);
 13419  			}
 13420  		}
 13421  		return output;
 13422  	}
 13423  
 13424  	// Taken from https://mths.be/punycode
 13425  	function ucs2encode(array) {
 13426  		var length = array.length;
 13427  		var index = -1;
 13428  		var value;
 13429  		var output = '';
 13430  		while (++index < length) {
 13431  			value = array[index];
 13432  			if (value > 0xFFFF) {
 13433  				value -= 0x10000;
 13434  				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
 13435  				value = 0xDC00 | value & 0x3FF;
 13436  			}
 13437  			output += stringFromCharCode(value);
 13438  		}
 13439  		return output;
 13440  	}
 13441  
 13442  	function checkScalarValue(codePoint) {
 13443  		if (codePoint >= 0xD800 && codePoint <= 0xDFFF) {
 13444  			throw Error(
 13445  				'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +
 13446  				' is not a scalar value'
 13447  			);
 13448  		}
 13449  	}
 13450  	/*--------------------------------------------------------------------------*/
 13451  
 13452  	function createByte(codePoint, shift) {
 13453  		return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);
 13454  	}
 13455  
 13456  	function encodeCodePoint(codePoint) {
 13457  		if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence
 13458  			return stringFromCharCode(codePoint);
 13459  		}
 13460  		var symbol = '';
 13461  		if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence
 13462  			symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);
 13463  		}
 13464  		else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence
 13465  			checkScalarValue(codePoint);
 13466  			symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);
 13467  			symbol += createByte(codePoint, 6);
 13468  		}
 13469  		else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence
 13470  			symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);
 13471  			symbol += createByte(codePoint, 12);
 13472  			symbol += createByte(codePoint, 6);
 13473  		}
 13474  		symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);
 13475  		return symbol;
 13476  	}
 13477  
 13478  	function utf8encode(string) {
 13479  		var codePoints = ucs2decode(string);
 13480  		var length = codePoints.length;
 13481  		var index = -1;
 13482  		var codePoint;
 13483  		var byteString = '';
 13484  		while (++index < length) {
 13485  			codePoint = codePoints[index];
 13486  			byteString += encodeCodePoint(codePoint);
 13487  		}
 13488  		return byteString;
 13489  	}
 13490  
 13491  	/*--------------------------------------------------------------------------*/
 13492  
 13493  	function readContinuationByte() {
 13494  		if (byteIndex >= byteCount) {
 13495  			throw Error('Invalid byte index');
 13496  		}
 13497  
 13498  		var continuationByte = byteArray[byteIndex] & 0xFF;
 13499  		byteIndex++;
 13500  
 13501  		if ((continuationByte & 0xC0) == 0x80) {
 13502  			return continuationByte & 0x3F;
 13503  		}
 13504  
 13505  		// If we end up here, it’s not a continuation byte
 13506  		throw Error('Invalid continuation byte');
 13507  	}
 13508  
 13509  	function decodeSymbol() {
 13510  		var byte1;
 13511  		var byte2;
 13512  		var byte3;
 13513  		var byte4;
 13514  		var codePoint;
 13515  
 13516  		if (byteIndex > byteCount) {
 13517  			throw Error('Invalid byte index');
 13518  		}
 13519  
 13520  		if (byteIndex == byteCount) {
 13521  			return false;
 13522  		}
 13523  
 13524  		// Read first byte
 13525  		byte1 = byteArray[byteIndex] & 0xFF;
 13526  		byteIndex++;
 13527  
 13528  		// 1-byte sequence (no continuation bytes)
 13529  		if ((byte1 & 0x80) == 0) {
 13530  			return byte1;
 13531  		}
 13532  
 13533  		// 2-byte sequence
 13534  		if ((byte1 & 0xE0) == 0xC0) {
 13535  			byte2 = readContinuationByte();
 13536  			codePoint = ((byte1 & 0x1F) << 6) | byte2;
 13537  			if (codePoint >= 0x80) {
 13538  				return codePoint;
 13539  			} else {
 13540  				throw Error('Invalid continuation byte');
 13541  			}
 13542  		}
 13543  
 13544  		// 3-byte sequence (may include unpaired surrogates)
 13545  		if ((byte1 & 0xF0) == 0xE0) {
 13546  			byte2 = readContinuationByte();
 13547  			byte3 = readContinuationByte();
 13548  			codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;
 13549  			if (codePoint >= 0x0800) {
 13550  				checkScalarValue(codePoint);
 13551  				return codePoint;
 13552  			} else {
 13553  				throw Error('Invalid continuation byte');
 13554  			}
 13555  		}
 13556  
 13557  		// 4-byte sequence
 13558  		if ((byte1 & 0xF8) == 0xF0) {
 13559  			byte2 = readContinuationByte();
 13560  			byte3 = readContinuationByte();
 13561  			byte4 = readContinuationByte();
 13562  			codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |
 13563  				(byte3 << 0x06) | byte4;
 13564  			if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {
 13565  				return codePoint;
 13566  			}
 13567  		}
 13568  
 13569  		throw Error('Invalid UTF-8 detected');
 13570  	}
 13571  
 13572  	var byteArray;
 13573  	var byteCount;
 13574  	var byteIndex;
 13575  	function utf8decode(byteString) {
 13576  		byteArray = ucs2decode(byteString);
 13577  		byteCount = byteArray.length;
 13578  		byteIndex = 0;
 13579  		var codePoints = [];
 13580  		var tmp;
 13581  		while ((tmp = decodeSymbol()) !== false) {
 13582  			codePoints.push(tmp);
 13583  		}
 13584  		return ucs2encode(codePoints);
 13585  	}
 13586  
 13587  	/*--------------------------------------------------------------------------*/
 13588  
 13589  	var utf8 = {
 13590  		'version': '2.1.2',
 13591  		'encode': utf8encode,
 13592  		'decode': utf8decode
 13593  	};
 13594  
 13595  	// Some AMD build optimizers, like r.js, check for specific condition patterns
 13596  	// like the following:
 13597  	if (
 13598  		typeof define == 'function' &&
 13599  		typeof define.amd == 'object' &&
 13600  		define.amd
 13601  	) {
 13602  		define(function() {
 13603  			return utf8;
 13604  		});
 13605  	}	else if (freeExports && !freeExports.nodeType) {
 13606  		if (freeModule) { // in Node.js or RingoJS v0.8.0+
 13607  			freeModule.exports = utf8;
 13608  		} else { // in Narwhal or RingoJS v0.7.0-
 13609  			var object = {};
 13610  			var hasOwnProperty = object.hasOwnProperty;
 13611  			for (var key in utf8) {
 13612  				hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);
 13613  			}
 13614  		}
 13615  	} else { // in Rhino or a web browser
 13616  		root.utf8 = utf8;
 13617  	}
 13618  
 13619  }(this));
 13620  
 13621  },{}],86:[function(require,module,exports){
 13622  module.exports = XMLHttpRequest;
 13623  
 13624  },{}],"bignumber.js":[function(require,module,exports){
 13625  'use strict';
 13626  
 13627  module.exports = BigNumber; // jshint ignore:line
 13628  
 13629  
 13630  },{}],"web3":[function(require,module,exports){
 13631  var Web3 = require('./lib/web3');
 13632  
 13633  // don't override global variable
 13634  if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') {
 13635      window.Web3 = Web3;
 13636  }
 13637  
 13638  module.exports = Web3;
 13639  
 13640  },{"./lib/web3":22}]},{},["web3"])
 13641