From 397f1863d3f0646aec14dac695d126041870faba Mon Sep 17 00:00:00 2001 From: David Walsh Date: Mon, 30 Aug 2021 13:47:50 -0500 Subject: [PATCH] Update gh-pages to receive chainId, update Ledger library to 6.5.0 (#95) * Update gh-pages to receive chainId, update Ledger library to 6.4.1 * Add safety so that old and new lookup work properly * Address feedback: check for chainId * Pin to specific version to avoid semver issues * v6.5.0 bycontractaddress removal * Removed unused import * Specificy npm v7.6.1 in engines property of package.json * Update lockfile * Remove unused parameter from signTransaction in ledger-bridge Co-authored-by: Dan Miller Co-authored-by: Mark Stacey --- bundle.js | 38846 +++++++++++++++++++++++++++++++++++++------- ledger-bridge.js | 9 +- package-lock.json | 11673 ++++++++++++- package.json | 9 +- 4 files changed, 44530 insertions(+), 6007 deletions(-) diff --git a/bundle.js b/bundle.js index 61700f07..bef991b0 100644 --- a/bundle.js +++ b/bundle.js @@ -15,8 +15,6 @@ var _hwAppEth = require('@ledgerhq/hw-app-eth'); var _hwAppEth2 = _interopRequireDefault(_hwAppEth); -var _erc = require('@ledgerhq/hw-app-eth/erc20'); - var _WebSocketTransport = require('@ledgerhq/hw-transport-http/lib/WebSocketTransport'); var _WebSocketTransport2 = _interopRequireDefault(_WebSocketTransport); @@ -60,7 +58,7 @@ var LedgerBridge = function () { _this.unlock(replyAction, params.hdPath); break; case 'ledger-sign-transaction': - _this.signTransaction(replyAction, params.hdPath, params.tx, params.to); + _this.signTransaction(replyAction, params.hdPath, params.tx); break; case 'ledger-sign-personal-message': _this.signPersonalMessage(replyAction, params.hdPath, params.message); @@ -181,13 +179,9 @@ var LedgerBridge = function () { } }, { key: 'signTransaction', - value: async function signTransaction(replyAction, hdPath, tx, to) { + value: async function signTransaction(replyAction, hdPath, tx) { try { await this.makeApp(); - if (to) { - var isKnownERC20Token = (0, _erc.byContractAddress)(to); - if (isKnownERC20Token) await this.app.provideERC20TokenInformation(isKnownERC20Token); - } var res = await this.app.signTransaction(hdPath, tx); this.sendMessageToExtension({ action: replyAction, @@ -307,7 +301,7 @@ var LedgerBridge = function () { exports.default = LedgerBridge; -},{"@ledgerhq/hw-app-eth":6,"@ledgerhq/hw-app-eth/erc20":5,"@ledgerhq/hw-transport-http/lib/WebSocketTransport":9,"@ledgerhq/hw-transport-u2f":13,"buffer":20}],2:[function(require,module,exports){ +},{"@ledgerhq/hw-app-eth":124,"@ledgerhq/hw-transport-http/lib/WebSocketTransport":158,"@ledgerhq/hw-transport-u2f":162,"buffer":172}],2:[function(require,module,exports){ 'use strict'; var _ledgerBridge = require('./ledger-bridge'); @@ -322,2250 +316,22702 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de console.log('MetaMask < = > Ledger Bridge initialized from ' + window.location + '!'); },{"./ledger-bridge":1}],3:[function(require,module,exports){ -module.exports = "AAAAZgNaQ06573cLal4S5FmDxdgFRSWKo487eAAAAAoAAAABMEQCIFl3BvBR/N8N5OrjZULRDq0P6r/gQuOBd9XTGfg5dFdLAiAraImuYXl9inTiqNH6oD1yDjTNaKeNotkI4LC6ImxhRAAAAGYDWlJY5B0kiVcdMiGJJG2vpeveH0aZ9JgAAAASAAAAATBEAiAK6GNMInYqi6QdKsseBo3M6UczfG3ZhPE7gg05YXaVIwIgMwaknYpsNbEaYQiOFXCzkoyjoNtr029Xe174dihWH/cAAABpBTB4QlRDtu12RMaUFtZ7Ui4gvClKmptAWzEAAAAIAAAAATBFAiEA2UkiC1HMK5i877Abmr1Om/aEvUXiIsqXuGX0jcrPP1MCIFsphKwcLDXOxifN6kqIujazD3wJLDxZc4wEwuv3ZTi8AAAAZgNaWEOD4r6NEU+WYSIThLOlDSS5alZT9QAAABIAAAABMEQCIBHDMvdW35oBmEhJgeC/oxIKIyrjeH2/P1rLsym0fuW0AiBMQNqeERmBGiLny0WuCXdTJaV/1qUG/xUujycGRyDgUAAAAGcEVFNIUFJXlEc/erVxXIHQbRD1LRHMBSgEAAAAEgAAAAEwRAIgYhU+Mw/gREeOJYUeNBzwJNy+0qnYhBIc7JSLHPnK7DYCIDhlEsNh3HPLkcz6BOSNw7cLFxSPpKjP/raYkN4nmmRXAAAAaAVXUkhMMU+8HtogzY0fOfykH2RsMXvODhOvAAAAEgAAAAEwRAIgcm/59B1LLCBRHLkRCTMPzbT1xjDAPVL+w+9oxkKog3sCICl3iJmuVy7evwCV1RsQAFH2rPzkPtYRnxspwayxYM8RAAAAZgJXVK3Cun1p278to/qZgyHb0+3Btgz1AAAAAAAAAAEwRQIhAPn9EHHg73gACMUMI4XQRqFnqRUKE9OcHbCN2/eTYiATAiARRdSzUGMjOA0dBYaUE6NbtVVh0F9Yd4L0uHHZZ4y8KwAAAGgFMUlOQ0gRERERERfcCqeLdw+mpzgDQSDDAgAAABIAAAABMEQCIEYj5fE3XFSkRhV66Kc5IEKEzwU2NLer0IPcX10mdcTnAiBv+UtMhLqek/RAZcONfJJQZiH6aboE92eqWCId6K+/FwAAAGYDRlNUMQyT38HF40zfUWeBA/Y8QXYgic0AAAAGAAAAATBEAiAuLBeIcpGCpoDZ8cpfzACn3RdhVXAemsQFX4C3Hkv6WgIgbLzRY0eWJ3+FLNo2JxJZ0ticE/YOFUArH05opsvY44EAAABnAzFTRw9ycUs1o2YoXfhYhqLuF0YBKSoXAAAAEgAAAAEwRQIhAMXvrAIvzBe47PQeizokOJH6M/aVRfOrr/S88yojr2kGAiBZmz9qxTe6UPNXrTmNz2Hz6MiFXO0hvflT/lF7nr6zlgAAAGYDMVdP/bwa3Cbw+Phgal1jt9OjzSHCKyMAAAAIAAAAATBEAiAbyt40SQDF/RtPyyJzHmojvwGTOjEyerrMGmyf44DBPwIgBL8PODgPxEjIAUkMdqwmaos1bFnvf9lydonvOV4rj7YAAABmAzIyeABz5eUuK0/iGNddmU7is8gvnIfqAAAACAAAAAEwRAIgZq2GKbzkO1qtMsYKWm/5T83wOqe+aHXfZlbmVVIT2Z4CIGnKX/iIuqGbSIOzY+JJ/SLzWpp8E87VHGoL9tn00u91AAAAZgMzMDCuyYpwiBBBSHjDvN9GqtMd7UpFVwAAABIAAAABMEQCICM+v7LsalHCu+eYCNUz2Oc+2NJtrGoBnGfiFTM+5PGvAiBKportZqyZebEJ7Qb4EKx7eKdCB+9mDrMGEtRFCKwsbwAAAGkFS1dBVFQkG6ZyV0p4o6YEzdCpRCmnOoSjJAAAABIAAAABMEUCIQC+HjcIsxowgGTRcMgodVEfMQRzbxfX+7bmqbE2l86+ywIgc9ekNNVUXxdi/SKxpWhlpqRaELbP6nxDXy55pjSP05gAAABnA0VYRUEtOX3coH11Pj4MYeNn+xtHSz59AAAAEgAAAAEwRQIhAIMjaFP8VeuS2SWvyjiZB3KSbDQeV+47DT33zG6nBXtsAiAPAqi4czmWndkJhRpzQaB/ZihqPnWpn8uvzuHYRCfozAAAAGYDSU5KhL///XAtkkxtmyX4cVG/D7GokT4AAAASAAAAATBEAiB4eaM+kueCSyb7J+s5NH76ZtzhHNBnMF43OSb9JsLXngIgaf+85uA/txoo7a5Zp0TL1nvZLnBhQGiD14WNPoesPqQAAABnBEFBVkV/xmUAyEp2rX6ck0N7/FrDPi3a6QAAABIAAAABMEQCIEJF+2P3SFZvlKjtqznjPtJ9JHzivsr3f1uZSyUoDUabAiAu2ydRpHQC3xnT4/N8wtoQBFaYl392+K7OSZVyM/9X9AAAAGgETEVORID7eEt+1mcw6LHb2YIK/SmTGqsDAAAAEgAAAAEwRQIhAIkjce9jGdm9KcMl7ZA7cuDRGSExSCO3y+UX5jumEM0oAiAGS+cnCXtQzy6hTdNtQtPv8eCoNO0uJ2nqqo/CW7zocAAAAGkFYUFBVkW6PZaHz1D+JTzS4c/u3h1nhzRO1QAAABIAAAABMEUCIQDiyCa9koVdnDMp5SW8p7xKSZ/Cf1n+0O8lNFjYb6AJfgIgThbgKhr/ArJmHOIIB0qskLRjVfg3WWJUR4bpS6k9OvIAAABoBGFCQVThug+0TMsNEbgPkvT47ZTKP/UdAAAAABIAAAABMEUCIQDsbaCzII8gJQEszwNtc2rhYl5no2qZuKNvUyvDDGqhXAIgZYWlUNySIbX1ZdQpo7C9wYHhysyV/GDJlM7lEpAo/gUAAABoBWFCVVNEbuD3u1ClSrUlPaBmew3C7lJsMKgAAAASAAAAATBEAiAu8uocW+xWPGMMnOPFAANj4arjf5SO8Phb2qyoBpL7fQIgBGwfVz1z5c4cWX1qQxK6xiZvBWMFf4UJq6Bq2AqBd3cAAABnBGFEQUn8HmkPYe/ZYSlLPhzjMT+9iqT4XQAAABIAAAABMEQCIA+zQ8Ytl48CpxMWpNSEWnLlxsh0/X/lUK2nm6CIJenRAiAY4vFDM9BKpX0NTuxEq5bGHi//xzk3w9U4QGpDep3PNwAAAGgEYUVUSDo6Zaqw3SoX4/GUe6FhOM030IwEAAAAEgAAAAEwRQIhAPxEf6jxT7lOoRrupSx0iZlkmuK51xRpTIuRfYSlIZ7+AiADqF6Z3g4mQhA5Bx3Z1X+euKqavk+jOlmVaqDg6lPm/QAAAGgFYUxFTkR9LTaI30XOfFUuGcJ+AHZz2pIEuAAAABIAAAABMEQCIDspbzpfcW/ghXtejXG8UDDUqCZDySfGh80VJkZx5KBVAiAAsK5AopsQqCHBYxfEWxnsagOA3aEHDHbHpNiVfCBbqAAAAGgFYVNVU0RiWuYwAPRiAEmRILkGcWQgvQWSQAAAABIAAAABMEQCIEsqN+54Uj0dywBDpELrXydHTPx1VL3Sb05AFfFLTw/JAiA5LpkMulAAOwktZZzNFmck0zyqd9qC0mUZkhERrUeeJAAAAGgFYVRVU0RNqbgTBX0Euu9OWADjYINxe0oDQQAAABIAAAABMEQCIAtgoVyFsL+KVl7vWtD+5BcZhghhKcCnkh/sSec+a24uAiADA1Wf7ErmlGFRd1Dz+g2JdxnG3QsU4Yxrf/pi096GbwAAAGgFYVVTREOboA1oVqTt9GZbyiwjCZNlckc7fgAAAAYAAAABMEQCIF8Do2CE9CgKjClZZ0enf/pCY75e20QhFMOzEUAHM9YPAiAP16AMX8SAgu0dQEZCjGqcklS5V0bIoaf9CIfRnNpIDAAAAGgFYVVTRFRx/IYPfTpZKkqYdA452zHSXbZa6AAAAAYAAAABMEQCIFp+bapbDhIjB84BEgjh4M0ZOJDAj9719EuY3NW1r0tQAiBL7sf03o56RocxrD9YjaNVrrI5++vIovQteGKeA32x2AAAAGcER0hTVD84Lb2WDjqbvOriJlHogVjSeRVQAAAAEgAAAAEwRAIgBJZeB2CfZi7aL3axHmTMGdJPPt46UWjw4Yy3/DV7jX4CIEbLn+nn9cvuqEcFI0zNWZTEDw53LOF7lak+3mDYpRo+AAAAZgNSVELsSRwQiOrpkreiFO+womatCSenKgAAABIAAAABMEQCIGgHg27eIRLrHrBtQZWOEmqRDFPeDC4Dh50To+oAqiNsAiADrubG5USV1XWLEmxriTmbFfMh+j7Zs20dDTm5v4exHgAAAGcEQUJDSMx9JtjqYoG7NjyESFFfLGH3vBnwAAAAEgAAAAEwRAIgQTjdUk/0LQc8l0hY2MszdxV33XXR1QtXrLM1z6zwFiUCIAJc+6IA6MGdXmybmEamCM7SdOunC8BuBcIWApDvRYPSAAAAaQVBQllTUw6Na0ceMy8UDn2du5nl44Ivco2mAAAAEgAAAAEwRQIhAMI8Va+589yI2fYNFsSoLUKg2/5Y5xx+9jr+TJ5LdNwqAiBIVRh7EGiqy12j5dsfLdYsF8Cazvnewg5ep6hiSVKmygAAAGYDQUNDE/G3/fvh/GZnbVZIPiGx7LQLWOIAAAASAAAAATBEAiByngRNEpt/c/Y56v5ALdbODJrAcoHimfaciQ7DXxaIVAIgblbMIau6G2N8cwlvu9UyGNpuD+yt7pvH9NAEJM9LTF0AAABnA0FSRHWqew0CUy84M7ZsfwrTU3bTc934AAAAEgAAAAEwRQIhAP4cnIeOfzK94eKUZ+ZC9hpiD9zlqdG38BStkuimNL0BAiAs8ds3yQE4ommbQPBMqeHmnhXgwD7AbrlopftHJ0a0IAAAAGYDQUNFBhRxEAIrdouo+ZqPOF3xGhUanMgAAAAAAAAAATBEAiAllvjQDdTaJlG4hX3iIDj1MjCPTJqZXadCFGiECFU9QQIgUGvPTJSSPGtoCCFaAE8YTeeQPYKFZCLzlXQfjMyJsFYAAABqB0FEQUJFQVKzKZ1Lq5O/BNWxG8Sc1t+tH3fSPwAAABIAAAABMEQCIA4P7OUgwU4u+/opgcNamjlmqJ/XJKOG2DC/dA2vZ+D5AiA9RmRI9PMec+TcyfKHyyrNYn2J4/9vQ2sPD0v260mS+QAAAGsHQURBQlVMTEPeEUXNIvCpzJnlHCBeboEWHfa5AAAAEgAAAAEwRQIhAMAU1PnrDrkIwkDprgW11R+L0iW0n8kKH/XD0EYGFxSpAiAQJJKWNxiaj5nqVTeiun9Rv9E4LekajE7brN4VMUrqLQAAAGYDQURCK6rJMwz5rEedgZGVeU15rQx2FuMAAAASAAAAATBEAiA8cD+BTzW2Kz8/saoXRrZvF52sh4J9U8L4sUnaJEhbVQIgEFlzCRD9ewcPaLKlJd2o9oCrWiUt7BsgawURqZnlvyYAAABnA0FETGYOcUg3hfZhM1SLEPaSbcMysG5hAAAAEgAAAAEwRQIhAMMWSWKP4/fuYbgkGv7OrssMyu1++OJ0/DFThRshn3hqAiAp8+ElEItR3ZkirsqfwfHAK2iynXzZx3khFaLuN2dI/QAAAGcDQURYreAMKCRNXOF9cuQDMLHDGM0St8MAAAASAAAAATBFAiEApbRsHdWus5gZjDkOeQjRxkM7OnQLFkbZ+7vG8xIFmp8CIB6mGgjVI7O4+RjPkN+RluWFk+2wkVmH7lCGyfJrgPJVAAAAZgNBRFhEcLuH13uWOgE9uTm+My+SfyuZLgAAAAQAAAABMEQCIBTUxgc+74XZcD0YcecPsgE+bHQCTZSmf8+ywG7K/tz7AiBIIkrjUTArkiGAtxhqjyNWOhXGj0Tj1Hq4OO6Pecf19gAAAGcDQURI5po1OzFS3Xtwb/fdQP4dGLeALTEAAAASAAAAATBFAiEAu/BQOfyESmumh39lT7ut2CmR9uPSXZsrgZI+4lZ1ZtUCIHiKf3S2lbOMdCUJx9fgdBiicldbLkClwaVQVVGE6aijAAAAZwNBREmIEMY0cNOGOZVMa0GqxUWEjEZISgAAABIAAAABMEUCIQDHxMZgTH9a6dUOuG1vcOq6qxfMmeQZFv3cIsPQJfJ+sAIgSUw2UAzMJ1drXy2U77bCegGdh1GBLu73ckBgBR1kYkkAAABnBEFEU1RCKGao8LAyxc8d+97zGiD0UJVisAAAAAAAAAABMEQCIFToCcTj0ok052+xlw03eBOzrgk0JkUpyCoxvNnlr30lAiBFsfQSgzoTWnJddn1+MhgPTfNHX3AolX5fFO5N9ZszxwAAAGYDQURU0NbWxf5KZ300PMQzU2u3F7rhZ90AAAAJAAAAATBEAiB3DBHAbpzEwsCUL5aWlZ2vCnDWUpZV8rXlzQcwarmAGQIgDGb5QjCZR/wu4WO+qyRlc+l0VJvAFgO7oLOnKrBON50AAABpBUFFUkdPka8Puyirp+MUA8tFcQbOeTl/1OYAAAASAAAAATBFAiEAyCAECXwm9qlzfbGgJgVgpil40jcEaI+kbUPf2Oc56hMCIHV29bVEEgKtND1lNtTp3RN0DFTfgfK0/JGel0DdprfSAAAAaQVBRVJHT64xuFv+YnR9CDa4Jgi0gwNho9N6AAAAEgAAAAEwRQIhANwUvzpqUtjJZtgU81ZKRy05Jkf3iYIEALnKZSENawjLAiA9LArgp2hYk2aro720jGki3bUD7SlrgPZne/5+HGvr+wAAAGYDQVJOul8RsWsVV5LPOy5ogOhwaFmorrYAAAAIAAAAATBEAiA7XtszObCizfRQSPPwl4yRRg5udC23ftZHx7QJqpzQ5QIgcG10bkCMXmWK1571cY2gEQuVQoibtzR6lCqq27ViRXgAAABmAkFFXKmnGx0BhJwKlUkMwAVZcX/PDR0AAAASAAAAATBFAiEAl21WNEd7eVcezcrgsaOw70Wl1bZJyRnjAW2yb7wmgQECIHz8OJV27YTTieGWUDOootgoXGuDWYYhaIsrFS2Rld8SAAAAZgNETFQH48cGU1SLBPCnWXDB+BtMu/tgbwAAABIAAAABMEQCIDZv+vbnXfS3NWMnwPY3H3HkV/VBZDHFmcGuhOoakzluAiAg/Zq4Yu8iWJautjYRP1w9u99AyuqxTgrBqMvR5rq7XAAAAGYDWEFJJot5dulOhKSL+LK1e6NLWe2DanQAAAAIAAAAATBEAiAy7I6Cl7hdlCvObfM/S6WTSFGAfbncsGDBMkMailO6hAIgPJ3zlMm8wqecUqBA8TYQsZlb0CNySef1jOT9cFOZfFcAAABnA0FJRDfoeJu5mWyskVbNX1/TJZnmuRKJAAAAEgAAAAEwRQIhAOaLWbiTXgxt0e0ma3XL9z+6attxCWeOHh6Av+BEc9swAiBwNNeXPyx/mDiwhWDkDkqBkp2AsuAhRNEyl/Ujma91lAAAAGcDQUlE0XiyDGAHVyvR/QHSBcwg0ytKYBUAAAAIAAAAATBFAiEAsqJ8vmnHjG54LA0+BlNvnRJSjCMkAaO7MX72N5Lcws4CIBRpEPsN0EO27BbvjP/JewC8cHXlOCYWY1TUpvZhelhgAAAAZwNBSVgQY85SQmXVo6Yk9JFKzVc92JzpiAAAABIAAAABMEUCIQCbXzXGlXSYR633ZT8gOVs/oJBgKlVy78EFO+Pp8Z1IeAIgfFd0Bs2XrvPmy8vKuHvZPTTdRBUQc+uEa2SFRMyE+/sAAABnA0FQVCOuPFs5sS8Gk+BUNe6qHlHYxhUwAAAAEgAAAAEwRQIhAIQNaLxdbh9jbmo8XUpeh65NpHsEqSLeCn3vbf0PzRs+AiBQ6d/eaX/dBHHtett0oOuwUy9B5Lsmu+mZpgJvnW8smQAAAGcDQVRIFUPQ+DSJ6CoTRN9oJ7I9VB8jWlAAAAASAAAAATBFAiEAtWcrg98Lvr2w59NubF07N4sHgGe1hzjthJNFjtBwrG4CIAsadJUKTvT6rh/FHumQzRghiMNj205Z9POhlw2Dndt1AAAAZgNBTElCicBDoSOS8QJzB/tYJy2OvYU5EgAAABIAAAABMEQCIEvduqbrD6X4AIK7Gl0i5iBqpvChP7rxZQuwPGv9o3nEAiAvQEEMyHVSyK1IFg4ctux/bLJOBu3xOAO8x3xrMAQaqgAAAGcEQUlPTkztp5BqXtIXl4XNOkCmnui8mcRmAAAACAAAAAEwRAIgfoRvaEqYDd56qSss6GGSPgcMMsN0W3+Q7W/QzLGNl+4CICBgMrynwO+NxdjWiAZG7cmNHv3mJYcInlo7w2kYu50QAAAAZwNBU1QnBUsTsbeYs0W1kaTSLmVi1H6nWgAAAAQAAAABMEUCIQDdr6XN6a9KTzhBCBvt8ueY74bDPUTp2S3odzZ4Y8z/dQIgRjWJJha+Y3xxnsLK4tYeRj5bvXOoqo75bJ2kdv6tp2YAAABnA0FJUifc4exNP3LD5FfMUDVPH5dd3vSIAAAACAAAAAEwRQIhAPSzz/KHptBaeDtIf25D1c9I6TmS0wFjTyTGiBazw5msAiAq0eixCnqP4nWfCwsxhS5Xp0/lSW+XQLCvwcifaRseTAAAAGgEQUtST4q3QEBj7E28/UWYIVmS3D+OyFPXAAAAEgAAAAEwRQIhAKDJWarS+JEtpDmYZDyR/V9pPyNDaUOxPXWeRbBJMYCVAiBt7Ifelb2J6TdLyvQCuymqAYh+OOntT51GQHPilIs7NwAAAGcEQURFTJTYYxc+53Q55CkihP8T+tVLO6GCAAAAEgAAAAEwRAIgVD5Jysn17ir7nAx23UNMCkwEJUkPjomctsutfU3apP0CIC+TyTs5cd+pORDqYgpoDtIyWaGkzmuLtSMjJbzcJhuRAAAAaARBTENPGBpjdG063PNWy8c6ziKDL/ux7loAAAAIAAAAATBFAiEArnFn4DQqGitk7rc0mGJtRNPq2iQf+Oc8Vx3grZN0IvQCIBRKLya4gjD96hmsvAFK5cE5wzCEJwpfksbiUlofsOJqAAAAaAVBTEVQSCdwKiYSbgs3Aq9j7gmsTRoITvYoAAAAEgAAAAEwRAIgdIz1cvMWcAHd9x3V5u5xAt4DG4eujmaqmx/aIIKAKnoCIFWApvilmlnVZpBoTDOBwwWi4+dXRRE+sUXqoO47c6PZAAAAawhBTEdPQkVBUgV/sQ4/7AAaQOa3XTowuZ4j5UEHAAAAEgAAAAEwRAIgTvVRt3W4tVdNFn3KayfndP+qb/XMFu6DhB1aF952emsCIBV27jQ/1/+FIYNCr7numfUpUd1IIso870OKrg7yjARHAAAAbAhBTEdPQlVMTFhJNjV9aPUUPxLi5k8AiduTgU2tAAAAEgAAAAEwRQIhAIm4wZ+tC1/8sgb7uRhSrqyOhMHepuA2rDate5lar51UAiB2SymUdTsnkA8PAijqaCE4kgKOMQQZ1nonQ/aQTJAH/QAAAGwJQUxHT0hFREdF/cPVfreDnKaKL616k3mcjor6YbcAAAASAAAAATBEAiASoGGuUCaPAsxqpXH8yc/IzMYSQXsJK2ekauaovJkjNgIgeaKttOH2KWC/WSqYvZW99v8tk1sMqSr1t4nRkzcZP2YAAABoBEFMSVPqYQsRU0d3IHSNwT7TeAA5QdhPqwAAABIAAAABMEUCIQD0tGOntUPqeFZ9zUBjGUFj9ms44HoxMJZh4h+eZh5sJQIgWh9KOdisA108Let3q69cZ2PU2BmDw97+9PAM/Ur0cLAAAABmA1NPQy0Olb1Hldes4No8D/e3BqWXDrnTAAAAEgAAAAEwRAIgG1ceqEMM/iijIUvtmFkWvDVVcNjJzFXCfNS6sDS3tuYCIFgo8hD+nxNSouJZvJjAu44UJXRfBhfCjxDdA8FcYpawAAAAZwRBTEJUAKi3OORT/9hYp+3wO8z+IEEvDrAAAAASAAAAATBEAiAcG42XuQY+qxmwYS7+O3t0Q7UbOo2fvx11d89pE7Uy1gIgA/BZCHK1WRiLNT305N8veo5j7i6L6tKmXfMmHB1oHdcAAABmA0FMVnRMnDbRzDJopLmy4oxgsXUshel9AAAAEgAAAAEwRAIgaAwtw5gJ1eNx08+2VcmQIpYlMQQpOAYGf/alScxakLgCIGK3QJ1/kfoQeyIsLLQAne5CuUQrJgChyEP0X4mr9ivTAAAAZwNBTFBFS58km8FJLumVeTu8Ple4MPGl6QAAABIAAAABMEUCIQCSeSg/wXWLkGtpPCdkjHnM3Gh/IKwGK4x+YZGaFlIYngIgKaYvRwzhMrZDAUZCzqpeBczDodffWX3GeHa4zOBqta8AAABpBUFMUEhBofqhE8vlNDbfKP8K7lQnXBO0CXUAAAASAAAAATBFAiEAzb3cv68PtC9QWjgvLq57ellBydrpLoQQPmJlhGEnZ/4CICXjSdUGDykp+iTwVvyrF0RE1rD1XJGPYjD2SibMfHqNAAAAawdBTFRCRUFSkLQXq0YkQM9ZdnvPctDZHKQvIe0AAAASAAAAATBFAiEA03yAGFNFcatdGJwZzrQgwdGo7HCuTbCALqIsS3zeOK4CIHPk3Xo223dwgXoHErzdXrx5gk7iHk2wJhrIEjytfAADAAAAagdBTFRCVUxM2ClmTNvzGVss52BHpl3inn7QqagAAAASAAAAATBEAiALyy7dBdIviZm0sNIJdJz1vsYRCDsC5ak66RkMbI6vuwIgWusMf/ZlSE00Eq+5Gn9DCCIKBziV6F1qUjXSdXNpNpAAAABnA0FMVEGbjtFVGAqMnGQUXnba1JwKTvuXAAAAEgAAAAEwRQIhANIFev9Rge3PIQkTvT2nimxJnPtbpN/Aj1zwLbp2lQ82AiB7pu8SqRSC5He5Vvy7QBTPOlNL6ASSSB1fnvpFgkbh2wAAAGwIQUxUSEVER0Ulj+yQt3iOYNo7xvgdWDncWzahEAAAABIAAAABMEUCIQCnM9OQiIDDOnIzblVOA1/uyN9r7Y+s/lpenvxsPVN/MgIgFU/ivSkY52a9vZffVo6GoiSV6ZWiGNJXhye2Zqv0514AAABnBEFMVFNjisFJ6o75oShsQbl3AXqnNZ5s+gAAABIAAAABMEQCID5x9g1JbpGhmO1f/hGQY+m8a3pX7FXFL9hK68vlaZIfAiAalmEtouvLFSEeJLq6ub1GPqE+QFvdOWXzkMlWN71QuAAAAGcDQUxW/BeYbuwHtJNI0kI4dV/zun9/0oIAAAAIAAAAATBFAiEA7b0TpVjTAQfPaXhdoAF3PldvynvpPXWC0Gv+8xmKpQ4CIGO+kWawbNyZGIRiQZ/UB3PZWqMNqQhhwIlXN5OxumfvAAAAZgNBTFhJsSe8M85+FYbsKM7GplsRJZbIIgAAABIAAAABMEQCIGpLNoiyOjK419E3AB0dVjRM8CZSERAtIX0WGmCWqLj4AiAmtFKR+hjv7ff7xpy5vWWRQAA0nTXyt0snBuVg1r1fPQAAAGcDQU1CTcNkPbxkK3LBWOfz0v8jLfYcts4AAAASAAAAATBFAiEAgmimO4fvf9upErEbV6wSOD03Pl+FxUdrsV5DXHsTxGECIGCRnXqQEmJxsEDgxwRVvDPyzXw9gNBDLo1ev86SWgduAAAAZwRBTVRDhJNs92MKo+J92a/5aLFA1a7kn1oAAAAIAAAAATBEAiB9Prqg5PQ2MRUAS66ysUpYHw+wLyAt7lUCi67VUrogVgIgDLKf9BIxVw/c5KNuZXOAf90SLj0X6izjMCLOu57DuRwAAABnBEFNSVOUm+2IbHOfGjJzYpszINsMUCTHGQAAAAkAAAABMEQCIBAa4hsijsLeLixww6wHHovKGqmlYJoWNYrcU79FUrt6AiALj/GtmaHVrbRwfPioD3Rx4qDGGie1tsSHxXVWKhwU6AAAAGcEQU1MVMoOcmlgDTU/cLFK0RiklXVFXA8vAAAAEgAAAAEwRAIgNKphg1dMIxERuqJcRzE0It4FnvYoPBksMYZdw2I3GQECIBBiwaV0/V8RVB7jq/kMKaBe23ArlwW2rhDvv8hEY1AOAAAAZwNBTU84yHqomyuM2blbc24fp7YS6pchaQAAABIAAAABMEUCIQD/eM8mwgUWppsy7DXeMUkkQD7P7vbmjhAxSev1yeCwCAIgVMnuQmfr72eg7zEzMAfzeVMUoGTa85lwkmw/h70QQg4AAABnA0FNTnN/mKyMpZ8saK1ljjw9jIlj5ApMAAAAEgAAAAEwRQIhAJ3M0DMYBJ4Djtu3GxJViDUhW7LCsG4qyY40H1801pntAiBEw9xrbWRlj6ZvV2CrOziw76MiPqimK2HdMBqH5LtTYAAAAGcDQU1Q/yCBd2XLf3PUveLmbgZ+WNEQlcIAAAASAAAAATBFAiEA39ZDsWn/dht5CLLCVEQzfg08nWY/3OIv5ayP40s5IcgCIGIUch8AaEs6IGYIB/lPcV8ClUPylddErLTfiR1NT6z8AAAAZwRBTVBM1Gum2UIFDUidvZOKLJCaXVA5oWEAAAAJAAAAATBEAiBoK+Ih5VRv7Ez4EjvDzXxpCqG2IHIWtYrX9+ah+ixPkQIgN5IGvMy7gDcFx6HRjOEMnyphBi2pSuCDTRfQx31+GCQAAABnBEFOS1KCkDM8755tUo3VYY+5enbyaPPt1AAAABIAAAABMEQCIBFIJdPlWghlUcjZYKsyLBOj0Yzn/1gD5RHlA8iqUR0IAiBP4dgzBGFemFIWeVxaxkuUCAr8w9Bl1cOC7M61634YIwAAAGgFJEFOUljK5yp6D9kEbPaxZcpUyeOjhyEJ4AAAABIAAAABMEQCIQDpt++IfUnAM4KaXa1ig8iwpR7S3nPG17x+EPOtTP6rNwIfBD2RJI2tNUwtFFV1zaQFcxSUtgoHoqW1HqvnaQfqLAAAAGgEWEFNUPkRp+xGosb6SRkyEv5KKpuVhRwnAAAACQAAAAEwRQIhAIuw+K4n0dWLvtCyyoKHF5Sa+1zUAdMUnUG4Yf/6FHJQAiA9A6EpkQzn20Rv6hYmoPG4CSyke4KbZs/nc+6cqc/K+AAAAGcEQVBJMws4IQ6hFBFVfBNFfU2n3G6nMbiKAAAAEgAAAAEwRAIgNV18IVEazyLNr0yorAPIhT9YvQ+LuL9dgV0YR7CgB7ICIH+Hh66BACheViM4WUJpg2sCFjJ8+zMCwIzkAYK0Txa7AAAAZwRBUElTTA++G7RmEpFeeWfSwyE81NhyV60AAAASAAAAATBEAiB6lrk0uRN8xIDeBybIK0mwupBYN8+dfi2XNUjZNO6oXgIgcee4FRSitEMhnBUtKJ0WesCxupxk9SGDtkuhrjTe6kgAAABnBEFQSVj1Hr+aJtvAKxP4s6kRDaxHpNYteAAAABIAAAABMEQCIAfI3nnRUUldk9obdXYDwEirxdhT32lO9dLkuQ2tjWeNAiApr8KsRNDHMNvqFB7DOLxYMrfFS4yuzmcfNZwXN0NBgwAAAGYDQVBPrrBHK8OxWNwWkMeXnuRbdiQ7TaUAAAASAAAAATBEAiA0ct4IXjwY+i5/ckA41ri/py++NLoufcGVDdgJI9UrwQIgfL9ct1sH+LiJPPpZ+VjaCgLJQHZVh8GDIY2tgNeMVlYAAABnA0ExOLp9y6Kt4xm8dy2033Wna6AN+zGwAAAAEgAAAAEwRQIhALKh8Kz5CKeZNNJqKGa89JQmbZCCFis8YDfds67a7SOHAiAILrd24cJqwkp5VyZtVIAWw/ZUZFk46OLNFkVBEjEC2AAAAGcEQVBPVBbB5bryG5+kvJ8sN05NwZ+rWsXcAAAAEgAAAAEwRAIgclLd4qBeN/dCK4Ev/ejHyHD0SHITTudiptWvUl7Oo/8CIEYoT8wfieJJDCnYr1tUIigE1b2E2QD/O6TJPzWwP+9EAAAAaARBUFBDGnqL2RBvK42XfghYLcfSTHI6sNsAAAASAAAAATBFAiEA2d+qWS9YPBhW2Mqf04ybSqP6QvOnKIWHbmVJ4YDUtGYCIBPczKAAA4YDbylh2qVmyZOKlA/Cid1hxWni4IMnuklaAAAAZwNBUFmVpEkvAoqh/UMupxFGtDPntERmEQAAABIAAAABMEUCIQDpTYMZhBJbcY2xioJSzTSsFnOFcqb9IRuvrrBnyALVNgIgURqOOeUfHqc3BIlwTclDj3mgDHXPA3+DRYbBuiKy4e8AAABmA0FOVJYLI2oHzxImY8QwM1BgmmansojAAAAAEgAAAAEwRAIgIcAYbhDswyXetJQebtvl02Y4z5bNpLCEad6le1CKEm8CIA8DXT0En/h/vDsJ3MuJdnW29JwX6Fa60JJBj3hIS/1bAAAAZwNBTlShFwAAAPJ52BodPMdUMPqgF/paLgAAABIAAAABMEUCIQD8+faed0hdFVHmzzdnTfq/8am+UrlH6xRCakRoR3PPJQIgGjmKOO+N+TpzrQW/d/MCqjNRF417o2eFDl8+KSKMpXIAAABnBEFSQklb/8RddAwhPhm2i0Dp7YlwX0leRAAAABIAAAABMEQCIECBSzFt7Y1sdTMB9IhCTvSWOTbs8HF0l3e46PT973vfAiAUHcCssM3M3ERpd2jtGqkatokr6M26KZB7L7uL/llMYwAAAGYDQVJCr77E1lvHsRbYUQf9BdkSSRApv0YAAAASAAAAATBEAiBx9uzY9UJYGIHFZCQ2yjCbNvLeJ40Bxw5m+NUrnMTHzgIgGCAeXEOH+3o2KsRPBnBBCYKoTP1XwM3ZTOZDvyf7UMIAAABnBEFSQ1QSRe+A9NngLtlCU3Xo9km5Ihsx2AAAAAgAAAABMEQCIAEg0ZWHAMm/JiVxLxlgRm9gTcKi4R0zMK/LE6rHMGfdAiAVEJwkCDQNPkbTGJW1BWQWCoz7j8xNFZLbJv8p1u1rsAAAAGcDQVJDrHCfy0SkPDXw2k4xY7EXoX83cPUAAAASAAAAATBFAiEAzVIIAWx18CujDem0hunPpuRKHUlJCf8WElFoCCKC+NMCIA4cKD8RVTwICpix1i3z0q5Aktr7p5tiLvTNr/+sJ4lmAAAAZwRBUkNBYqZzjYh/R+KXZ2+rBbkCcJsQbGQAAAASAAAAATBEAiAtDD9MXyeW6XEw7zrWDHC8Yc6Uh+jvYN/wz4rNZhwO6AIgFhyaJ+BkuJqP01JL+oGIAVGPmPYOFs1MD2h44F9RQtEAAABnA0FCVLmNTJdCXZkI5m5Tpv32c6zKC+mGAAAAEgAAAAEwRQIhALBpMSiv9gWeJxEExT2QVpfiFwl4MAmEHChBePvQl1NlAiBzSRV71oj6E1HRT1TkdUiH8hhJDpxY/ecDvn/qTkSFvgAAAGgEQVJDSB8/nTBoVo+AQHdb4ujAPBA8YfOvAAAAEgAAAAEwRQIhAL4Ykwhzjbaq5XkvQw9iiSTw5yn1DH9YQuRstj6y4s9cAiB6B7YcU6lhleZrwrgnmjCdR79WIoYao7PZb6jvUO0jngAAAGkGQVJJQTIw7fZWhhigDG8JCL93WKFvdrbgSvkAAAASAAAAATBEAiAUBoC2gBZNx1tGJVMskeyAuqlUYAz9M4nfg5eoNTXtxAIgLu75bSUJaIng0mpriWrbmJhFLwy6t44JS8b+S1K+HtQAAABmBEFSUEG6UJM8Jo9We9yG4awTG+ByxrC3GgAAABIAAAABMEMCID6wH0YKvCMlzJzuwXp0hCIvS9In8HnscmLxNVjOJmB6Ah8bEkZwQWaN8zOitjXwqHEioxNHy8s0r7dqegHaxiErAAAAZgNBUlT+wM9/4HilAKvxXxKElY8iBJwsfgAAABIAAAABMEQCIECdTulZU0Z/SLrAxc1MlJyoU0pe+b7nLJyT+cqsekwvAiAwfDPvdT4w9g3jBOlw9r9CnL8Y2WA6kmF6HVFdivo1dQAAAGgEQVJUU/AT4OomyzhrMCF4OjIBvyZSd4+TAAAAEgAAAAEwRQIhAOn+6Qqbibg8Hl0pkssugtEmH3MDE2uom1C2Voe3Li9NAiAjHv284fbrS5bVrVktGt6H6K5NbyWhIcLtyRobLtETzAAAAGcDQUtDHKQ6FwutYZMi5vVNRrV+UE22Y6oAAAASAAAAATBFAiEA7pYBZRvLkidDcnDqRJHIrZu/s2y5ckPD2slJHyoOH8oCIHgzp6brrA7aZQXkyhLThZ4rZjxoXiYRM/4m1BY4aP2fAAAAZwNBUlh3BfqjSxbrbXffx4Er4jZ7prAkjgAAAAgAAAABMEUCIQCEaTVFk7CRX1QS20MFOu5nttWw8LpTrtCukCJybLd5bgIgLXX8GBgq/QFMfKiA9lULYPzcrmllVJyf1nYNX4/LX6gAAABnA0FSWLDZJsG8PXgGTz4QddW9miTzWubFAAAAEgAAAAEwRQIhAOHa0Cj1bn4vCH6/MxPx3TSu6/YKSHkViF0DuMLI1+pCAiB2Dm1TTw7w2+ghTDEhrtnbcRS/U48UvVvL6X+N5bFOCQAAAGYDQVRYGg8qtG7GMPn9Y4ApAntVKvpkuUwAAAASAAAAATBEAiBsl+E5fkamlvT1ZIHsZfv1rtu6n/lnbr4tc+k7UUfDTAIgSyPAV5BCJInba5gk4+b+YZIEY7TurT8Dv+3xADowsfkAAABoBUFTVFJPeyKTjKhBqjksk9u39MQheOPWXogAAAAEAAAAATBEAiAb05UVhT2KkmcDnBFnhwSlowWDH6AJraEsj287nvrUagIgdJDg4SAL9pBKQTpQCUophLeikAnE5gOOiGN1J+WHP0oAAABoBEFUUknazWk0feQrq/rs0J3IiVg3h4D7YgAAAAAAAAABMEUCIQDX/Kj3q2bxKmdKpMy2n4kaT7oNEseDk09Pr3AfYl415wIgQukDMeGbIYkkxjeI3j0MacQ4KiSLUMPP/jKcTznLTLkAAABmA0FUSBcFLVHpVFksEEYyDCNxq6tsc+8QAAAAEgAAAAEwRAIgeRsDipYZ7CDaVvn73Ay95jvi0J6T13sgQ8c2Tg8QjS4CICO2PWtyj+tz+L7CF1U5CYFpaSmm6v9eUOYolzmBcPiOAAAAZgNBVEx4t/raVaZN2JXYyMNXed2LZ/qKBQAAABIAAAABMEQCIF1Jx2Dg15KWLzubGUjybtrWKMwIqZbBLYMTLGcANYEmAiBBdXRO169xez/bpN8M87T+pd/oHPiDx1bNvkeghcpNXQAAAGcDQVRUiHg007jUULa6sQnCUt89oobXPOQAAAASAAAAATBFAiEA5/k38j+SKWdd4E0oXhw8LQpA/fDZyhEMI8xThy5CV98CIH7DbW3zjwzQU50p+rw897RR+iuKo5ar92tsBpp3BlzTAAAAZgNBVE2bEe/KqhiQ9u5Sxrt8+BU6xddBOQAAAAgAAAABMEQCIAJRrYxnj8eBHnfSPVpitdOh2gdxs4AHXno1VnZjY4UtAiAhEYl9m34x8usalZV42F7I6CrZGRW/MSbybdCBpvfkjQAAAGwIQVRPTUJFQVI7g0piB1GoEfZdj1mbO3JhekQY0AAAABIAAAABMEUCIQDeIZkhY3zz9AauHvfvBjdtyCxSDColamuk5guxpFv4gAIge+CmI3CNxiIZkqpJQnAD29C309vhd1k2QO0YucVtDJwAAABrCEFUT01CVUxMdfADi4+/zK/iq5pRQxZYhxulGCwAAAASAAAAATBEAiAymeisWPKpGupy052MeCEMwth6iQqKRuN0Q5ahcXpMswIgM5ILgtt13BOTMKfh+C+I3cYs9VCgGtBHtOf1lGV5Q2QAAABoBEFUTUmXrrUGbhpZDoaLURRXvrb+mdMp9QAAABIAAAABMEUCIQDDNKBOs6JmWvXY2LdQSyk9M1W/BQfhd7FmS2Vbg5o+PAIgIxFg0nB6NtX967Vj7dq68eUAlup7u/SUclOKVvilS9AAAABoBEFUVE5jOXhNlHjaQxBqQpGWdyoCnC8XfQAAABIAAAABMEUCIQDpbuqrOD32q5Z5Qn4daYCNTa1KuQxl5MmgumlSEmwVlgIgVASCRhtjVUVHle/ObkpxahbGw+21rl3ynLOmEPkzpU4AAABnA0FVQ8EtCZvjFWet1OTk0NRWkcP1j1ZjAAAAEgAAAAEwRQIhAO/SSLTPdHXvAUIWbC98+Cbng7snVXavWq311Tklqw+XAiAJt2GTVxOAxoWl9slZO/BiBqHsCCq/PiLNakyJJL/vNwAAAGcDUkVQGYU2Xp94NZqbatdg4yQS9KRF6GIAAAASAAAAATBFAiEAro/i8OnysrpVEneAGuqcpS0GSjfghuT3ECD2lO+Xsz8CIDGl1spVRSUqNK8B6D24PBupWRjmHaDKctdGSq1Mj9nxAAAAZwRBVVJBzc/A9mxSL9CGobcl6jwO65+eiBQAAAASAAAAATBEAiAX/bg10BKER6uGS/piNQy9nQE2MHq2Uykbg+Z90x83VgIgS2u8VcYjn7Uy1AracRWeC40C+rPn115vx1HXmL+UrpkAAABmA0FSRZKvukE7+eXaORmlIuNxiEvqx2MJAAAACAAAAAEwRAIgKzRP50sPEZAGMJHPeX2EJEvJvaL1IfSkMzi9bKRvOZkCID1qJephamS8IEd9XtTPDHQUyzrsgjDjyCvRw9Z8cunvAAAAZgNBT0GasWXXlQGbbYs+lx3akQcUITBeWgAAABIAAAABMEQCIH1cchUShSLKvZuMW5c9tIWEQa+jELYcvwZA2wJm/DXhAiBijq84I/nBCbvO5tnwkP5SSDls38wAKiXdYGHiahC3PQAAAGcDQVdYVORsyJWIMY45ZMosG+lNudXKPfsAAAASAAAAATBFAiEAsJax03cP2e7HWXiv7ae2NLxGKFeG3y1eeOhrthSullUCIHicTIhWGjl+euFoMxXXoIR+tp+Tnc1PsiGBJik5FaFlAAAAZgNBV0dpaswt5WS0hoLXHQhHs2Mvh8mkAgAAABIAAAABMEQCIBe/6tOcLksw6Q1bDCDpE9mQI0VGfpMsD7z9VXXxO8XeAiBbOOk7rsRDjuo1QQAJpGRg50uNAbeR7cWagzoTAjM17gAAAGcDQVdTuJkD3eOJnwKAuZkTFo7oM6eJa5MAAAASAAAAATBFAiEAo29kDXGKaj660DJGaG8oFKNyXR/azaJWqm4P3IVNEwUCICVxD5InM34h4Y4WRkVefUUQIDGprEQYgPxDi4UcJsFOAAAAZgNBVFMtruGqYdYKJS3IBWRJmmmAKFNYOgAAAAQAAAABMEQCIB35TV4FaXI4qiXpj/u23K7m3jTVvpMmKUShzdlzB3NNAiB5U9cqssigX+b4eE7NX/0v9sY/aM/Tafbfg1vV598F1gAAAGYDTklPVVTgTnZTPh0UxS8Fvu9snTKeHjAAAAAAAAAAATBEAiEAx59v7FVy3Y/8ZfYFO5Z5EOfrJT+NO6emIU/i5LhdOYMCH2aqiiYMKWGlCTzuk7mkPP19gjgZzQIaUdMOpRRDvigAAABnA0FWQe0keYA5axAWm7HTb24njtFnAKYPAAAABAAAAAEwRQIhAIRpyoLHJH6dgvRNcenttU4WfexNNCkVaxmrp3ZjD0sKAiAGsxujZR+H7Kg7ztD1ZJdrpt9BvC1QFUDuEiOHs6eGAQAAAGcEQVZFWDAhH33pvzUzTH9hVF6O0Jv52cwVAAAAEgAAAAEwRAIgM8awFcKn4j1qiDEY8zkkkYtSFaia6ON+fwshN+w+cNECICZf1H6aVNSo2Wh+GRR5ScpMv3CXL6tiQRWALdE82BUXAAAAZgNBVlQNiO1udLv9lrgxIxY4tmwFVx6CTwAAABIAAAABMEQCIC5pk8deJ0nFgjrFnkj3QC3tMVfrEsXE3c4WcMw/vJ6aAiAgh/PZbSULQuYYcvCSW64t+6LbpEJKbYjeRTyEJyUWhAAAAGgEV09SS6aGUU+vfVQokmb0g9HkhSyZ4T7HAAAACAAAAAEwRQIhAPP3cEjEXmjYmz3XJdtRYFuh1CBDzB62cbZ4EMcFRaWWAiBma12KlqGBgSwjGFxQJmNmOjD1GZlV+scE5jEmqq7gHwAAAGYDQVgxzUtLDzKEozrEnGeWHsbhEXCDGM8AAAAFAAAAATBEAiAOTXT4s6JGqwiv7Ti0QVq+l0FKNRLel2G/0Co4enzakwIgL/NJ5p3e2nLw24xPg+yes2yUEr0Aj2PXWiOYQhm2D1AAAABnBEFYUFLDnmJqBMWXHXcOMZdg15JlApdeRwAAABIAAAABMEQCIDkSqUNjRLZbzBS+xLjZMZALwp8VqgSpMOdReAmxhfn9AiAtKWAwq8FnqIsFoBlLjc9M7uBvpgyumjMCXj8o/FwXXwAAAGcDQkJD59PkQT4prjWwiTFA9FAJZcdDZeUAAAASAAAAATBFAiEAmAeX1L7+A45ros02ewywKldH8hgBXUtjV4vT1AOx6Q4CICYops1UQrG7bWizoiviKDE42BTZlIrn03i6URzbqyWtAAAAaARCMkJYXVH8ztMRSou16QzdD51oK8vMU5MAAAASAAAAATBFAiEA/SUlh4GFYZWO2F+7jIFGBf7BZnNFcBPd6YxaTCp64MgCIDyOMEgTOY/l3i9BrwWJjhpYtFdL5B94WK9jnhht+j+EAAAAZwNCQUy6EAAAYlo3VEI5eKYMkxfFikJOPQAAABIAAAABMEUCIQCB8ewA+zqyRya3Q6ttJXao06JQ+wt/DVYA5X74PKeZRwIgEi8F9FeojIV0lSDlWcY6Rrb1ypWed+IfvMLNlnNNG24AAABoBUJBTkNBmYs7gryduhc5kL56+3cniLWsuL0AAAASAAAAATBEAiB3IZv45vFrOHuqOtivtx3eO5EXpd5pvSYBNciUjVa+FAIgJZeCKxG7/LDPGLs4lYlrQQNi8gb7YkpVsQFmVhIhFqcAAABmA0JOVB9XPW+z8T1on/hEtM43eU15p/8cAAAAEgAAAAEwRAIgUC76VD2+oa2iCJhFvF4CjJxrXPm9emTc+tkiX93B68sCID3qOdlyxbqSMjawmMbzcc3kj2smDdmBCmy+No/YFTaEAAAAaARCQU5EuhHQDF90JV9WpeNm9Pd/Whhtf1UAAAASAAAAATBFAiEAwFOOTo8ZxrcbCHWDDce1doziiwuUZv3f5JwCoPy3A8QCIGRQISL4l5r2I1UOqnweVkBbNI4ADKPS0d2FRrYaVcMWAAAAaQVCQ0FTSLW7SFZ7/Qv+nksI74t/kVVswqESAAAAEgAAAAEwRQIhAPnVQPkuFc13oaPaISk/CZuo+IrvZavUN1wVGG1Vyy8KAiBnPuXH3iz7TZU0W1envAHEhhuFUY36xddEdXbhxWNAdgAAAGYDQktDyIvgTICYVrdePf4Z603PCjsVMXoAAAAIAAAAATBEAiBq/PMGhKv+HDrnBw5uB6ky306YefssWQlOw8Ecl+m23gIgLjQzdl0wzyWiWdk4fUZ0jubu36vVvxqFMTg7dPc9C/4AAABmA0JOS8gMXkAiAXKzat7iyVHybypXeBDFAAAACAAAAAEwRAIgGn5FYtS03sJy3WJeiWdjOp9YO8lLZLOxZXRErPd+2ysCIGHRUgUk1k36yS6QZro1L2w2KxY2+D+gYlFMMCrY0XS1AAAAZgNCS1hFJFvFkhnuqvbNPzguB4pGH/neewAAABIAAAABMEQCIFY357ZnuO+HrimGm1rqqlaAzNC3E8qVzYu4f3a2sMZaAiBA3UCZQ7mbnH57VxCMBmZodUYjons8JaKjcGnvJF6yaQAAAGcEQkFOWPh/DZFT/qVJxyitYcuAFZWmi3PeAAAAEgAAAAEwRAIgdWIPoIvo0WI2gfETFyBQuSMJD09tbgefZEQMNUXJQToCIAPCZinbhs8wLgY0PWh93AD7SVFZSTq2KxVG8XpKqMqXAAAAZwRCT05EA5HSAh+J3DOfYP/4RUbqI+M3dQ8AAAASAAAAATBEAiBMFA5TVYQxdFc051rEuOPt59t6LAjxIjjuvGIKvgVVRgIgfnxqABMw1WLenPZxAPu5j2/gZfvWNGjJUjO45rO5rhkAAABpBUJBU0lD8lyRyH4LH9m0Bkrw9CcVeqsBk6cAAAASAAAAATBFAiEA1HVFhA9Rd/cdKDU80IuIOJ+LxE/RSIqMgtZnfhda810CIHPiH/tavvfHsOH1/a/+c547/SGKbxj3Tkak2kMdVElrAAAAZgNCQVQNh3X2SEMGeacJ6Y0rDLYlDSiH7wAAABIAAAABMEQCIDnog9ScuxDoaAUnbDMtTE0hJV8dzoFstU/v5UhBJjFhAiAAlVludGYmYck7fzHA6SguM6VxUTTA59OpjPWkY37V8QAAAGcDQkFYmgJCt6M9rL5A7bkng0+W6zn4+8sAAAASAAAAATBFAiEAl8e/r3qTmeLCOzIS8ZJFe/gZXz4D0bsjF3XKOBzQkuUCIB8a8/+QMdy5KWx0FIkD9F063oHVwFUptsee9XVXjZLlAAAAZwNCQk41ppZChXCDui8wv6tzXazH8LrJaQAAABIAAAABMEUCIQCg856qdVQnCL9orM5tCPAYdoaA5/ktQsVOwyGF7KaO9AIgbRn996QvMfwaX8l8IPZl0UfN5TSJz6PCmia+RtfxQU0AAABoBEJDQVAfQeQtCp48DdO6FbUnNCeDtDIAqQAAAAAAAAABMEUCIQCRnxdvnoHRjfO1Rir4+13auMv8Ae3/z44r5TiEly5SsQIgOcOl25wNK7oYIiwkXkIOjy0bbA+oaJv97S0tk5R5ApMAAABoBEJDRE4eeXzphsPP9EcvfTjVxKulXf7+QAAAAA8AAAABMEUCIQCCrB2InQRy+BAabv2lls7OosSPaWCYWx8DdNkDicdwRwIgIPSk5sl4qbEoFhQaa9LbPSMBXALL6PGscaOCM9KDlsQAAABrB0JDSEJFQVKp/GXaNgZM5UXodpDgb13hDFLGkAAAABIAAAABMEUCIQDVVcr/CU13GCt5sBhQ1PfjX8j9w/WNkPFbjV8HlUUAkQIgf7BqJqDSUVeX4ffnTTO+Iw98/33fC9AAy1DKi6qV5d0AAABqB0JDSEJVTExMEz4IHftYWOOcynTmm/YD1AnlegAAABIAAAABMEQCIGYOFtcnVfu8nezwlJHECUX7l32Or/o5WeN0mW0LeglGAiBoGr3DGU/QNvhpa6VhwEE/pq0ZVnOwe9AWUWUL4/F4ywAAAGwIQkNISEVER0UC6Ipon9+5IOeqYXT7ercq3TxWlAAAABIAAAABMEUCIQDcNNOR6ICf8tfXNRkUQ3bGUeOrL7aWenprEPbhX2JCmAIgQJtUAbCW+pLbok42+rQl7PWfKYpOLrSVA8W8EJJJHMMAAABmA0JDTLwSNFUuvqMrUSEZA1a7ptO7Ilu1AAAAEgAAAAEwRAIgFNoT7RfO4huF93LXhI4rguYA0EmecO3a9legkZK9TzMCICsUcSfDid0dFQTCSO8rFay+QMg58cw8WKDrSxRq+0FyAAAAaARCQ1BUHESBdQ2qX/UhoqdJDZmB7UZGXb0AAAASAAAAATBFAiEA/h3FIvnJPs+TLCBmymbHCoCRPB8onFcIHfMLux0VPisCIDR2lCPbN0i2cHAzCTwVY8c0K9h1prtGkdYoJSvjBGFlAAAAaARCRUFSAW7nNzJIqAveH9a6oAExHSM7PPoAAAASAAAAATBFAiEAp0QaQBMEuLzn/g2w4BK3EcT9BNZHJISJVonfieY8J5MCIBL1u0D9qlpiWGi9OH3KgYH/zIdLYitE9I6WU5qf5JP3AAAAbAhCRUFSU0hJVEje4ZyBuJqatHM2G656GSEPLeqkAAAAEgAAAAEwRQIhAJGBa4sY2584FpOIOO9FA+CH7Imh2yN49EzG0GzDiM0BAiAF2Uec3qX+QJyy9/wbQGKJy7acl/8LWo6znxx2q6jQ1wAAAGgEQkVBVC+xK8z29d0zi3a+eEqTreByQlaQAAAAEgAAAAEwRQIhALm93h8ckS9BRs/3NDWh0FeqkZa3oYYoq8iMyaEo4AHkAiAP/BzfoR9Swbld6g3ZY4myKcLZB3shrEvNRoGr9fMDngAAAGYDQkVFTY/BRToPNZ6ZyWdZVOZW2A2Zb78AAAASAAAAATBEAiBh5eL/ZM4pFqB1eE4cvyL7tJZreepGJtVU6i6eONwnjAIgcJCr5OhbuOToP9dIvt1ll26XGI5tozQMhuaagz6u590AAABnBEJDQkNzZ6aAOdRwTzC/v22UgCDDsH38WQAAABIAAAABMEQCIGv9j+SlYV4tgryZzRYdsBR3TbcvInyziJIQU/2+64/VAiBF3h+ohFlAzaQKlHcZ9vxeE/amm7SHistluL5jW3rQEQAAAGsIQmVlckNvaW50weS4yuWSaewdhdPU8yQ5YEj0rAAAAAAAAAABMEQCIHvWrxvshVhBPLwwKtA/ZN9QtH8WF5HytHy5VZqUnFmOAiAMas5+IsI7eDk+mD18bxVhZ1/BQSwhHutJMH1/4AhWqgAAAGcDQlVDyjwYpluALsJn+PSAJUXn9T0kx14AAAASAAAAATBFAiEA7CdCqfvPENhsNCVq1VWQ4OzJHsSWLyxIV4TrkjD7hxYCICeGx43pJn1UchHzEjy47MUiwYzcjz6EO/61BHNUUxp5AAAAZwNCQkk31AUQovW8mKp6D3v0s0U7z7kKwQAAABIAAAABMEUCIQDxJ78RBbny2flsbfgPiMqFOUUSzw3gFOzWiVr+2Ik4YQIgai8zwUhyNsX8CmWP9WGFMt7kBQt3yTDczfihx5T/8V8AAABoBEJORlTaLEJPyYx0HC1O8vQol87+2JfKdQAAAAkAAAABMEUCIQDkRmuQvAam6kN2YLLCvPJxth5p8fRrDID2tzpMhfgSTAIgR7/sst/MCX0L7R5uG+VSUXEeDQPkoAHvTeztePwNZmcAAABoBUJFUlJZauuV8GzahMo0XC3g87f5aSOkT0wAAAAOAAAAATBEAiBxu35HR/LTkKw4WwE/cxdPEom/yj3KnGAZMb//CI4vQAIgR/ex63c1+1odoVYhBtqaw78OEvcMFI2Sgua4sSX76fUAAABnA0JQQ+hloE+w1WUQfq+QSe8iwn3QxLvvAAAAEgAAAAEwRQIhAMGVwdacA3W5I90zPu5ejC9gSYt6XTymUfYnEQPfOq9CAiB/uQIxpu3FO28H8cCaSibsho1ZrDXFqpo4RThsMZfRXAAAAGcDQkVUiqM6eJn8yOpfvmpgihCcOJOhuLIAAAASAAAAATBFAiEA2g21Yw8996q+iVO+PVRpC4L35CyaXCHABH/sPXnejW0CIGgQGfdNcHRCKoDTXiVIp8iaFg0KvGsjhZuhhzCZE0uaAAAAZgNCSFL+XZCMmthfZRGF2qakdwcm4rJ9CQAAABIAAAABMEQCIDVuEeMdDdR4hDjOE5SrhRWShB/fljTfmkW0CweL09SVAiAnFWP7SDtEvbIeqayhMmEMB6GiLoQsleCdR6Vj7MN5AwAAAGoGQkVUSEVSFMkm8ikARLZH4b8gcuZ7SV7/GQUAAAASAAAAATBFAiEAj85dBUszpAWRdAkICSVUt3Ldqp3tiR9ITTRcYbnXk+kCICYeFpcPZrHEOCOjqaAC5siJkv9NHzoQMrGlmTSb36udAAAAZwNCS0Kyv+twuQPxuqx/K6LGKTTH5bl0xAAAAAgAAAABMEUCIQCenuYpDAyw3zOlgZj5HjxAL909mRtwbZEWTk0EUn7mQQIgBWapVtH7gEhA8gSQN7Ai6JvKgCi7wNqdeBqLz+3+UBMAAABnBEJFVFJ2MYbrjUhW1TbtRHgwKXEhT+vGqQAAABIAAAABMEQCIA8mrjttkGU+tgxxTHboZDlE6yVXkFiIxYPWehCOB7ByAiBVLSChE4ThLo589CgQUcMn9CJm2qtmF2cUeqm1v5vJWwAAAGgEQlpOVOGu6YSVNl/BeWmcG7PnYfpxa+5iAAAAEgAAAAEwRQIhAN/6YyWhPHRy/fCl+0cnp6T/3gcMwtaTr/g5VTguDQHFAiAorDDZBV4iun/J5DJqISUqzwwNWnZpKCGj3n2p5elQxwAAAGcDQmV6ODnYujEnUaoCSP7WqLrLhDCOIO0AAAASAAAAATBFAiEAvjqh3t3CeOuyWcs453rWgsIgYx4q2ttqJOEXFz1CJdYCIErpiONagCEEbuGYwh0Z9QXMPqnNUb7wrqpVNToIRI4sAAAAZgNCR0fqVMgf4Pct6OhrbceKknGqOSXjtQAAABIAAAABMEQCIERr8qRoSS61zEg/dW1bsWkIvAifDytT97NQxYFeQT4BAiAYrlAeC1UAmKVIA3QpQ93LoPehn2Yi0geWvvDBkg6lWQAAAGgEQkhQQ+50EQ+1oQB7BiguDeXXOmG/QdnNAAAAEgAAAAEwRQIhALohueFc8uVy2YfB227mnQXa2hGN9umHy0vU2oLzQYR2AiADLCj1u1eI53gbIx1ClXMtINOt4GE1PFAtYTgiVsdxEQAAAGYDQklEJeFHQXDEwKpk+pgSO9yNtJ14AvoAAAASAAAAATBEAiBbuB8EypraXPCFb8jTRQb/qPH0E9BpnevP7NM4qiw2KQIgNRR6JUJCfeEKwEZ6FnQyDEywFSeXDYYZH0MJ2cEtbKYAAABnA0JCT4T3xEtv7RCA9kfjVNVSWVvizGAvAAAAEgAAAAEwRQIhAK2iF2ll0+RHHiWUaCXqrSzUetKsMXlFpCq0pk+adVv4AiB/DFCv2HOW5912bvi6YRuftHp9sEO4Wj8y+xm11usVrAAAAGYDS0VZTNmIr7rTcom6r1PBPpjivUaq6owAAAASAAAAATBEAiAG380J4cgpUw7t8GrdY7Lgz5tJBo5dEjNbp1nLBp06GwIgVSdNgRjGySayvuvGFyzlyUHRHFtYEFQLfuZDwRUYs18AAABnBFRSWWIsU35WJOSviKeuQGDAImCTdsjQ6wAAAAYAAAABMEQCIEJmHqMvic1zhGpc/OZ/x5TmLb4KvEOwlF+nPWgsqcU5AiANxw09f1hzlmyLToDe3UM14ePo6qm9QfAfATE7B71wAAAAAGcDQkFSxz8kdAAa0dau1hWvU2MRSM+Y3msAAAASAAAAATBFAiEAyW9BehQGVYPcLLnjgg9TODcElGRZLUDYaVsxp6eOydwCIGYfiNjv5z5QfXdcTnLus7lLSHoIe9InhZ44dKYmYXN1AAAAZwNYQkxJrsB1LmjQKC21RMZ39rpAe6F+1wAAABIAAAABMEUCIQCdnmtTWjezM5OqXyOBhOqfQbFf6bRKF9qBeY8O4E5kAwIgNH9JT7OQSOdCtg8mzd9Er1rd4zLAlS46X3KH0lOmBhoAAABnBEJVU0RPq7FF1kZSqUjXJTMCP256Yjx8UwAAABIAAAABMEQCIGXsvI7+TGUpjKpMKPE4uH0riQD8+1DRjHxzVOg932ZSAiBFIQYZKqA6uV36f2hkLbfo7d4IE4byTHHpwjHmTejlIQAAAGgEQkRPVHiE9R3BQQOHNxzmF0fLYmTh2u4LAAAACgAAAAEwRQIhAL7UvV/ylqXlAjYFdMWXSYqjTNXiegAjG+qwtYY2XGNnAiBczlZ4wgG4ddk3uqM/QzE63k0lyxBQtsjRR+CtGanUAQAAAGgEQkZJTI4Wv0cGX+hDqC9Dmbr1q6xOCCK3AAAAEgAAAAEwRQIhAMCRc6z1tmLk7gOAw58gfr2KxytyJ33ujwR6kydDk8tvAiBcUIImXSEDTBZAX5YkRI8BpL60cX4LgcRtA7qy7F8FEAAAAGYDQk5D71HJN3/rKYVuYWJcr5OQvQtn6hgAAAAIAAAAATBEAiAtm8BfF+CwnK47vugFs5zhqULaKafXhbhnmg9lXINDGQIgDgl0oLSFhriysasxWZdBHLqQpw0z3LttZh0UE1fHaFYAAABnBEJJT1TAehUOyt8sw1L1WGOW40SmsXYl6wAAAAkAAAABMEQCIHe2TI6sq9bba55qXYD1UTjsFb1V8rx9/RiuAB96H+pkAiBy85Kjxg4QX5esctqTZ9gsf7wuyZ68YxNbUsTfpFdjKgAAAGgEQklSRHBAHf0UKhbccDHFboYvyIy5U3zgAAAAEgAAAAEwRQIhAOuglJfxkcWdJjgOcyaVc0QaxWaLqofviMyvlk/Ygr/0AiABWXIZEc+JBc/uyG9twbysl7WKYbaMkFZWS+ghEUjCyQAAAGcEQlRDQQJyWDbr8+zbHN8cewL8u/qic2r4AAAACAAAAAEwRAIgcrMwjW/FWKRu7iK3TZPPvGqT9QDpyAzeLDxMQcqF8TsCIDWy0t2BwkdABFwLeCEROsVme4hoC/W/f0wUz1+XJGndAAAAZwNCQVMqBdItsHm8QML3eh0f9wOlbmMcwQAAAAgAAAABMEUCIQDOQzSi8WDpDpmdwDOQ57mfc03JjOtqAqCdgffG0016TQIgbfyhjGudL0XDBE11qctNR4ZImxJvKGNWAh5o76zTBksAAABnA0JUWqdpQtBM+7t6PyBoesHRHRUBhfONAAAAEgAAAAEwRQIhAMxK1PoYJXcUzlxHTldeIGx7PaLTnKIc3tI8RjiXQD69AiBwIC0RbIn/sDabq+3bGMEcRf/Yn4+zlxF5T0DSyjXEvwAAAGYDQkNWEBRhPis8vE1XUFTUmC5YDZuZ17EAAAAIAAAAATBEAiAWFR/FCvLIkWcp0TNq8zZOQd4otYossKTHAZ2EU9kDgAIgKUD7Qnxh7x+ZKEKfOJ1v8Q65dw3QTSXDhmrCAVuLrPAAAABqBkJJVENBUgi0yGaunRvlagbgwwIFS0/+BntDAAAACAAAAAEwRQIhAOlpLOdSpGKBa5OYZWRY03FdKw8LoKP5R4oujA9VlHssAiBykGxQXIVlzS3qKDR6qPgwM5q/WNmGi2YgxKVXG7u7XQAAAGYDQlRRFrDmKsE6L67TbRi84jVtJas8+tMAAAASAAAAATBEAiBAaNoXNUXlVyUHd5w3C9PzKCBC1AKFVXuIlM7kUMna/gIgFcmyng9gbVvswcHJFvBNQ/vOPX1bEXhlt0HrUxFqXwYAAABlAlZEmpu5tLEb+OzP+EtYpszM1AWKfw0AAAAIAAAAATBEAiAYbXoafYkxilAvTJTP0gUjEo+a10AgYEVAnbfxUjnbbQIgNjcWWqA2Kl32fzyyk7AumCwR64HCM9J0h6utbtqW008AAABnBEJUQ0YiWSf4+nHRbuB5aLh0Y2TR2fg5vQAAAAgAAAABMEQCIB5JgrDAtPO3XGZU8ZvPXADco1jdfEgYVWUjx1/LgLMOAiAhrEEHjIN6Oe70JZX+KCU5sI3Inp0+xC/GotuXaY81fgAAAGkGQlRDT05Fh/Xow0JSGIN/PLZ9uUGvDAEyPlYAAAASAAAAATBEAiAklBDpxtiZMfwNkoaILWaWnn1dTl2lARL29JwriLnXUAIgS3VbkSZspccSz2a+xgPry2lEQ4lsmPOM0XKPz2Jr/zAAAABoBEJUQ1JqrIy5hh5Cv4JZ9avcauOuiZCeEQAAAAgAAAABMEUCIQC3iBv8Q85DV1EgMtEc6qlVMDrWsgv2Hr0hQZGkAknsSAIgJ2x3rQN7lQd+v8RRT5t7ubEKAJzWednSrHH/tWSWM6YAAABnA0JUS9uGRvW0h7Xdl5+sYYNQ6FAY9VfUAAAAEgAAAAEwRQIhAIrq5hsI1OBEBUjceXqk5yAKudsraKBSVV8lq+zrTtMcAiBACUWMsOTHGjt+cOPF4iGkrZBKMdiermbwq8yJMhtkTAAAAGgEQlRDMMTzPxXtLyxfjVtULdMFGKUNn4Q/AAAAEgAAAAEwRQIhALtxqCgBdse39cNbQAJf1vtxYnL5I9YWSVr/aCbsRoPGAiAaxo60Lcn7zkEPP5pjOchETzILOAySzpHbTU1AXYPfUwAAAGcEQlNPViaUatpey1fzofkWBQUM5FxILJ6xAAAACAAAAAEwRAIgEn1PgFE638pvkHFe6gzMSgS61HLY3IrWJdOyeIIi4iACIHCd73kqKqmoot5ndPvMoUlOQkTT/bu0FFNRDsmTH+u2AAAAZwRCQ0NYqCqBqcSMnsLK0HdLcofaqvdxr+wAAAASAAAAATBEAiAuSpKI+i4PjC8q74bcYhH0fD6z8YUvdO0nbNFoziA+ZQIgNHThrflqklGXnzoLEiLF45Zp61PGgBKFTRnIvrFHLn8AAABnA0JERxlhszMZae1SdwdR/HGO9TCDi23uAAAAEgAAAAEwRQIhALXalCghleAvJG3UWEL/dgx32K13L025dKgAeZxrz77XAiACKFlx3eSM+2vLmn4bwds3BkeaOe7h5ZXBz+L9NRyndgAAAGcEQ1NOTynXUnesfwM1shZdCJXocly/ZY1zAAAACAAAAAEwRAIgORMrI3W4NkfVZ9tDkpaaUe4ma/7/3AsPQSatwwd3NDACIAIsE5Z/B4l+juiBTUPbeZ1EGI6ifWKqSq994WlM5XbDAAAAbQlFVEhCVEM3NTKmwEAEXZYuS476AJVMfSPM0KK4rQAAABIAAAABMEUCIQC7qVGxgWtYHGYKgShuBBszKGN7Ut+aMDrYZ1+aTjkMeQIgHSeDdgetDv+g8YvYrccNiFbbL4C3eaQpGO4piVwlDmcAAABsCUJUQ0VUSDc1MqNfxQGcTcUJOUvU10WRoL+IUsGVAAAAEgAAAAEwRAIgO0+RvPiz6fEXkuDQaPLflyWpXYsPuWGiI2Om5tzYD5gCIAs/RYEIWnOunhxXsjzRvdA6ZSvpRbm7ojAduMeNk3m8AAAAZwNCVFQICqB+LHGFFQ1+TamIOKjS/qw9/AAAAAAAAAABMEUCIQCyHhXdRnwR4f7QAnJ/3uDHA628Mr6gLzwz42djlX1kqgIgI6wwv3XAoIXxWURVq4pRQisM7ovUoKsyRN3X1rm30mkAAABnA0JUUkmaa3e8JcJrz4Jl4hArGz3RYXAkAAAAEgAAAAEwRQIhAOm429tNk/NKLhEeMPk5J2LjUDjL8bzEOhQJ2KotWKG2AiBaA6xcM3pKIVEz8DPXjwcmywZHVsyvHUWnfeO5I0JOGwAAAGcDRkxYcLFH4B6ShefOaLm6Q3/jqRkOdWoAAAASAAAAATBFAiEAueqhh0K1GQ6By4yUqbsWAnJTN08/Tv76io6UmfQrSk8CIEHtiAYHINELPjlbiJTiBOM8jDc8PA6QC+OgAa7cmWIsAAAAZgNCVFLL8V+4JG9nn53wE1iByymjdG9zSwAAABIAAAABMEQCICTsVkTg+ere0nwGPRn0HdbAJwrEAoRdC9Ugh55j+NmHAiB+dq8s45ei2j6DkjdsvOZvxH9+Y3mPZcU5gq15KjvhEQAAAGUDQktCXDm8aOWKJCpiTk/Ja+d6ODxSAC0AAAASAAAAATBDAiBLLFROD57VdWL8WAzJLlxvoZPOh4go3YGvywMmOfAyjgIfSGEZSYV/3Rtjzya9DNUqFqOtSdvSyaUIYBY0pe+E5gAAAGYDQlRL+DyRG+l8hMeNcyjE24nDB5BvkNwAAAAGAAAAATBEAiB7R3FKmWkN2mEO/GCBXtc2w5KqxWOUAMooN5apAhWgywIgaxD7blC2801KnLsC/uIS51zm4qGIr+oRYzFpp+suuzAAAABnBE9SR04elaDTnD2YqSandWUQitCE8enfXAAAABIAAAABMEQCIHcwGFyLUZckobsecsi+cHyqS51XoR7LCOzDdXYsoQfYAiB3Exee4NIxnHxQe4e9PD5BITvGT3tPkDMdKWFFbNzh4AAAAGcDQlRMkmhek5VlN8Jbt11dR/ykJm3WKLgAAAAEAAAAATBFAiEA3YaJ2GgToCq2TpQVDF+rTKvsJr+AOFmV6EVL0rYzsM8CICpdxSyRZ9qYXRdzQY1vvXmnMdudzHfftrtMVxvt2SqbAAAAZgNCTViYbuK5RMQtAX9SryHExpuE2+o12AAAABIAAAABMEQCIDJcs+6SN4963G6NjXZWna3PR8KsWtAqUk5RG0VXYSDDAiBAUdXsh7lv8aSchbDPKbuhLSZHOYwFybPCkpEBwXCQgwAAAGgEQlRNWBwomhKoVSsxTQ0VPWmR/SelSqZAAAAAEgAAAAEwRQIhAMgcjrvMCdHYD4xxaOv+nSw+BXny0t6QcQbQ31fjeIuYAiAQjQ3OVtF0bVEiM8Xj3qzWqRotCyOLG7g1apNEzqtBSAAAAGsHQklUUEFSS/PSn7mNLcXnjIcZje75k3c0X9bxAAAACAAAAAEwRQIhANoqq44RqN39Xp2+0lrRXf88CJpTr7okypzcEvqxrolCAiBYEym2gCj1WJ1bVbDQc26Dw39JqWqqcGbx0qNUXLSGNgAAAGcDQlRS1DMTjRK+uZKf9v1YPcg2Y+6mqqUAAAASAAAAATBFAiEAzbhiMTvQ/mO3weVzIOo1CR74YdKv4Szw2KyJDbu5wuECIH0Sg35b17Lb/gREqBYLOeKejtN+50sWg51lPqnLdO6JAAAAaQVCSVRUT6EB4n8GqXmFuSXiRBEbYVYOzZfbAAAAEgAAAAEwRQIhAI6+ri8ViX7N+mFZ38uaGbitvqg2TPVCbdy5tmcEUWeQAiAbtnUui2FoPXW35odMFhqYlUPkouFeZJtMPiKO3Re49AAAAGcDQklYsxBLS52oICXoufj7KLNVPOL2cGkAAAASAAAAATBFAiEAwiexF9GasbfDv4xqb3YfCBgcj/eTz8TPCZbjUxl1tMQCIG4UaIW86YJRoyQxlM5RB9x5FgiD4s72tRYvvou5ySz+AAAAZQJCS9C9EqjV68oeL6RtpZ8Zk+xRw9dcAAAAEgAAAAEwRAIgKkLqHzAd4BOAgqey2B2uSTTpc4RU5nKrKP1Aijegg5cCIFK3CzwbtgeT05zumlwHWy/0qkr/NaupScZtqN4jb2hlAAAAaQVCTEFDSy3k7x60gc9Ke4yfiPbS5HOHz69fAAAABAAAAAEwRQIhAOlDKBJFgaeAZ/gVxBfadwi2B0PgY1TtDC+SOgvKx304AiA0dcqOUuxrnietll48HritFRBjoQ1PkMIV4eBM5g0M+AAAAGcDQkxDQtvADhT3ESYOYG7b1PFDlKtHgNgAAAASAAAAATBFAiEA6Gv/F2DW0hBdhUjXNVuaFYu56K2PGzcZeYRayw3zhwACIDnlISYpOytoD8RJGv0m81kr77HPpVKArkdiTNnuE1MmAAAAZwNCTUPfbvNDNQeAv4w0EL8GLgwBWx3WcQAAAAgAAAABMEUCIQCkrxOQ9NhvG6XcDN5tHESii9fXvm2Lm/LzLO11P5pU6gIgOlx4d5j4ubfZUPsOp3J7wu6Weis3EOSqaoZDaEv/nXQAAABpBUJMSU5LQr7dZH44favsZafcOjurzGi7Zk0AAAASAAAAATBFAiEA1/urlqh1piqH+/gvrub+/Wr8fdl+2C8XFUjgNC5yQ9oCIHzAH64DttloeVaYxrlGmFNJo1l6CaqESGr/I0oS4a+rAAAAZgNYQlAo3uAdU/7Q7fX24xC/jvkxFROuQAAAABIAAAABMEQCIE9H94ISxr5ATHfBHCrHfD9w+yQ7Lk+Ahgs8ypSYLYmjAiBtJ//YIPm14EkYzGBYygXVO9UiNb109+hpW3ZtrDQFxgAAAGcDQVJZpfj8CSGIDLc0I2i9Eo64BQRCsaEAAAASAAAAATBFAiEAjecy+mSWrT3+yEYpYUMInLW2UKfw8bZuW2kBxd6haRsCIFK0tBe4Jb7ey8DhNqxyx6IWgHhvStigicvFe69FFYvaAAAAZQJCQy7LE6jEWMN5xNmnJZ4gLeA8jz0ZAAAAEgAAAAEwRAIgb+CSRyQzV4nUbT6+wBXFVIvy9wwW1yNqTJv+Aa4eVYMCIGv1yBdkmuiLf6++CwilpO2ApbrT8wKCUTwL9Cq0aITYAAAAZwRCQ0RUrPogn7c7891bv7EQG5vJmcSQYqUAAAASAAAAATBEAiAsQWdgwcbDSfFX47XP8SS4kYuuIbZtym1ax70ynJDYGgIgfW36P1O3BsuYwDR/C4Z/urEBInSAMv+uQ9JH6BG2MJEAAABmA0JDVFxSPWq+F+mOqljC32Km7JFi87mhAAAAEgAAAAEwRAIgR/HpeTfHO9BI/fpo3n6GcBtqLakhLh4cCDpvpZpZ/ssCIGvxtjASQCZV155inLgOooKTQhq/cSiBp0seW+aiCxpuAAAAZwRCTE9Db5GdZ5Z6l+o2GVojRtkkTmD+DdsAAAASAAAAATBEAiACvDN3xyC21qyLz+UxuEvdGk0WZvNjUXH2zT6rAGo9ogIgPyJ9ivwvJEOzddFx6fTGmYA5zyYLl3A1xq/JMOyhiZEAAABnA0JJVAibhfoV9ywQiMu+8jpJ24C5HdUhAAAACAAAAAEwRQIhAJaBeQ/nyG/TNbSkP6UEdGLhuvbIIc3O/CWf1szXwhT4AiBb20bRi61FBvSqyO6vSDOYA18nmuEoDLOM7gQ7Hrqk9QAAAGcETUVTSPAwRaTIB34487ji7TO4ruae34afAAAAEgAAAAEwRAIgZViDlQHeXsQSzU6Bx8a3MigZdG0wqB7b09LVPv6sdPgCIAm8NQTOlwXm703MQ4H0Wws6hAHGSzCF/1rWqOx/CCrhAAAAZgNCT1B/Hix9amm/NIJNcsU7RVDolcDYwgAAAAgAAAABMEQCIGAWIugW6U/ThiJJZKOWj+E36Xv7jsNZs9+BPO8AGnrFAiA2XhmBrnpLk1sW9OY+oFFWAZt8wQ9zeYtxwYjYpHrYnQAAAGYDQlBUMnaCd5urK/TRM36JdKud6CdafKgAAAASAAAAATBEAiBd9jZ3i5UeIT9b8HzPriPrZmo1cZaz2RWUpzme3XJ4qwIgA5ilz9qfD6kP9ZlQegljhpViGcaI5qKDtR0Dj0yq5WkAAABnBEJLUng8+eDDhaWr7J/SpxeQqjRMTo41cAAAABIAAAABMEQCIHAyi/Uyp+7L7L20PWTrKombw9LjEmv6AUzWy19varVeAiBECm/sr0fKJ1r1y+opQmvTSxtGEDVfaaBSsELNxs50SAAAAGcDQlNUUJo4t6HMDc2Dqp0GIUZj2ex8f0oAAAASAAAAATBFAiEA0P7S42CGp8J0DibX2XJUQhvdP1TdJ/ei8W0snEKA2hACIAOMk0DdTVkOMItn5vmxEJUnSQhxCgqHRK5GTuMr8yXrAAAAZwNUSVjqHzRvrwI/l061ra8Ii7zfAtdh9AAAABIAAAABMEUCIQCuPV0J3vUIjLPjecE2jO8W4jz2n9j0gt0Ui7RsGHNoNAIgOwYj6RagwtQQ3KCjtFwH948q0EBlZIuSNSBOOc8GivoAAABnA0JUVPpFbPVSUKg5CIsn7jKkJNfay1T/AAAAEgAAAAEwRQIhAPD+k+IsmKLFNn+VbkqId6WCmLdrPYzYCobv72waEWg4AiAMhwLYiKZvb2wsJnfhJKUOLanmktsgcYGsmVKJn7e7lgAAAGcDVkVFNA0r3l6yjB7tkbL3kHI+OxYGE7cAAAASAAAAATBFAiEA8eCTiDYyS9qDfKHna4TbWJszve9Azt+ZHasJ02+ZGKkCIBOrq5QB1/uPt6vZluVkN+Uwmgc9Gghm+aYJR+4Vg5UXAAAAZwNCTE8cO7EN4Vwx1dvkj7t7h3NdG32MMgAAABIAAAABMEUCIQC2OfingySvgogQopg/HgL2B2IFR9hOBWbmiMtJfWvVwgIgJwlYhKrV7HPi7WHtXs4bDcVbJO5kIKEqLbw3QF24DlQAAABmA0JMVBB8RQTNecXSaW6gAwqN1OkmAbguAAAAEgAAAAEwRAIgFt3FVXNitBiPGk3GbasWjIDb3iDK3HJBvxVZGr+dewMCIAkdHt2HZTn729Hn0K/W788qfC5j9lPrSDJ1+U8V8LQYAAAAZwRCTFVFU57+abzdIag+/ZEiVxpkzCXgKCsAAAAIAAAAATBEAiA7klIsKBeB5UaABfVU9m15PxWzNFS6pjb7MulDN6+fywIgYk5n+TOi814BX6RDHySCjkEsM97a2/SE+M6K4PZL+8IAAABmA0JXWL0WjL+dOjdbONxRogK16KTlIGntAAAAEgAAAAEwRAIgAzCtr96CSIOT8DaR5HO9bHG3SgQVTVO9IJcG4eOIzT0CIA8XdaVdGu+0jmgkcmrc4mVsek2f87de4GNpApGxY41hAAAAZwNCTFpXMgRqiDcEQE8oTOQf+t1bAH/WaAAAABIAAAABMEUCIQCc5VAxoKLA6mFN2lGZgHuzkaDFDIxMDPS/p+6pHxVTSQIgfLtn6k9ngTkx999Fpixo2AmEcB0dbLhzcdBDhV6yJKEAAABnA0JNVPAore5RUzsbR76qiQ/rVKRX9R6JAAAAEgAAAAEwRQIhAO9mNJ3CXkMGyiaDDXJeEaiSHOVAx+U0SX5pZNwlziq7AiBOchM+0cpNbqmY7khnCc08lchItmk3n9HMLVTeQ+dMNwAAAGYDQk5CuMd0guRfH0TeF0X1LHRCbGMb3VIAAAASAAAAATBEAiBcz3eAwngEVsTWRf/dC9Nhq70frclg7LdvjE8DkbhbdQIgVpmg+wspdtloftbkr/Z3tCR9QohmcvcVRVwTRWt7GlEAAABrB0JOQkJFQVJv69/AqdlQLEU0P84N8Igo3vRHlQAAABIAAAABMEUCIQCfacJJJ0a9TSuXuhgHUH+8OkeAR0ruGimfQbGYXDXqJgIgAaKV+LqJY7b4Tx7B+xmoL67a6HdeB4RhO2hhoSxQYCsAAABqB0JOQkJVTEydGmLCrZkBl2i5Em/aAEqZUoU/bgAAABIAAAABMEQCIA7A8X8SgnLAprYHcrLdWv8+0Juuyj3y9lunZO8i09dFAiBnRtOfJiLsORWNJjmKkrlgj7Xvnw4N6ILnqvWPikZG+gAAAGsIQk5CSEVER0UoQK1BzyWtWDA7okxBbnnc5BYbTwAAABIAAAABMEQCIBKupim2j/Hjwn4KBRG+wVD6m2Er1xmWMvjgOmmPjKkiAiAgK2E0RHsSNei8MoJQpFoIT6cQSifIInqZFiORPg5TlgAAAGcDQk5D3Wv1bKKtokxoP6xQ43eD5VtXr58AAAAMAAAAATBFAiEAlbaQQ/IsK0hJfmqBwdXpgLOL1Bwkpt4n3fM06nlECRQCIGle7mAERLLF6NxBzlCzmzugSde95rjapRF9A8haRUUaAAAAZwNCT0LfNHkRkQtsmkKGuo4u5epKOeshNAAAABIAAAABMEUCIQD1bqgc1qE1ME0ax/2lDFm8XY3cKoV22aNmGh9aVo1cswIgeJCP3iCzrr7tc2dlGggKimpbshMZmJZm/5tv7szjDsoAAABmA0JMTsop20IhwRGIin6AsS6siiZto+4NAAAAEgAAAAEwRAIgDERmUlZYebW5PJWT2XI0kws0f0oJ/IVZXCBK2SPQC0oCIAI96oYCJbfWkcPia2zihMGjfKODp9gH2Lte3xRf4J06AAAAaARCT0xU1ZMMMH1zlf+Afykh8SxeuCExp4kAAAASAAAAATBFAiEAqfIfiPiqWaI1oHpy+4QFiSMKL9vOCJE005QbnlWBoJoCIC+MMK4ljXDQIKoaMew5BXpz4NA+bmxCfHjczGSiCOPbAAAAZwRCT0xUnyNdIzVIV+/mxUHbkqnvGHdom8sAAAASAAAAATBEAiBIwsol72hU7WW95yg2CXXZz++ZdJTPdsKxOgjiuQ2HrgIgB9isXIz70na3CVnE617OSd9dtdnc1rHn773JpGraHB0AAABnBEJPTkRdwC6pkoXhdla4NQciaUw1FU2x6AAAAAgAAAABMEQCIBAi4RUgXUL2aKJnp5z7GrSUxg8Xgo8RUVoykJGrYvYSAiA+qrWQ4rhabLhjVjKmXJZ7W9Rlk0/ad6lLWe959MqgVwAAAGkGQk9ORExZ0t2iI7JhfLYWwVgNtCHkz65qioUAAAASAAAAATBEAiA0oZzJFJOw9MOJe5r7jzK0UEMt4aftutn+/kKqo4ombgIgdaQiDNkAm+xVGBP7DBaufw7kJmoSDQ6JxTuKUY/e6GUAAABnA0JORh3l4ADEHI01ufH0mFwjmI8FgxBXAAAAEgAAAAEwRQIhAOxcnQQr6OiCnK/PqauCqRQeznv5Vp5qX2SoWepz6gCdAiAqkO/In672EHM1p28xqDI31xAbJeTOKgSDr8Qy66TWJwAAAGcDQk9OzDQ2bjhCyhvTbB8yTRUleWD8yAEAAAASAAAAATBFAiEAmuY34PzSl8VRoGwljWJUX0mE2KIJn6p5wU4ePD60QKgCIE2lmDTFaaXg7hknyFG3q/gwwtLqQBwLxV/gJqv1RIrXAAAAZgNCT1XCxj8j7F6X7711Zd+ex2T9x9TpHQAAABIAAAABMEQCIAeEwwXOvHaVmUQlu5OGk6IATgwtbeEPK8luuZDTiqNqAiAvwALZVvhHQ0xVh09GfxfaH7LpIRjyLnC0Ln1J/vSk1QAAAGcEQk5UWdLWFYaDruTMg4BncnIJoKr0NZ3jAAAAEgAAAAEwRAIgVgyiCMG5M1NoosPWlHClL70i4W5yDNABhor9eUkoResCIHJmIm7z57txqTORElCKGN9Kp0mxxBjRePNbFpspMOosAAAAaQVCT1VUUxOdk5cnS7niwpqaqKoLWHTTDWLjAAAAEgAAAAEwRQIhALHgHnUYepSwJHMgGS+40FnD6m27QyC4DEvUojBKIsmnAiACcz4Px/46QaeE3OYooqpg0gLxi/+tFXZZU0XWU6angQAAAGYDQk9Y4aF4toG9BZZNPj7TOucxV32dlt0AAAASAAAAATBEAiBcFWCAylCdIuUiESSQQljN/9R1c3/9VwiCFCpkM9lwmwIgJx1FEwT31o6DkppQAaZ1MWU9dPq6ODgyQNEdcfYAdycAAABnBEJPWFh4ARbZHlWS5Yo7PHajUVcbOavOxgAAAA8AAAABMEQCIDpEoSJkQdnx3On9q2P/m9z0Kvbg12Yj+pO4LetZOqI+AiAvAVGiKZkyliob6RO74KEYXsD4TtrOmk7RlSKuMazLXAAAAGcEQlJBVJ531aElG299RWcipurG0tWYC9iRAAAACAAAAAEwRAIgSCcY0pH9S3eIiII/BosAQwkqzmIhKmDn7zYSBOWGsCQCIDnjqDgnjNIQ5Qw4dNsrOoFg7hlSn78rvNkR1kriynECAAAAZwNCUlpCBBLnZb+m2FqqyUtPe3CMib4uKwAAAAQAAAABMEUCIQCvceg45OXMtHamg7pUqHdjd+gNCDxJKb1rCgy4sJ2ATQIgLfVaZVqsTjn/4gdeq/ZiSlFCkiHvSXCpd8uE12QVwBQAAABnA0JSRFWOwxUuLrIXSQXNGa6k40oj3prWAAAAEgAAAAEwRQIhAJSJ4b3wDFOf0YL5p4j4WHB6U4ZHHVG5jdDZ68avJ2iuAiBzHc+qNqn2ZsjdHYuggGJ/1iXcPzOU1zB8Md4tYZaFGwAAAGYDQkJLSmBYZmzxBX6sPNOlphRiBUdVn8kAAAASAAAAATBEAiBTXSz2U4O6mkFaTNjV0j+23LNWQNRuR0NwT3Yh/9NKgAIgUwPzvbcxRAo2sasRjrOWyZVHIg6vmgYR9eMftwznWY4AAABnA0JOTtqAsgA4vfloxzB7tZB6RpSCz2JRAAAACAAAAAEwRQIhAPzFwB0SUh4uMg8yxJ+4EVQ+TX+p8htFkHLj6Bs7PmUwAiBDhYhCMlMApcH6d+aBi6r6hzRUuNvuoQiqID6ZUZX/4wAAAGcEQlNEQ/Ju9eBUU4S33MDyl/JnQYlYaDDfAAAAEgAAAAEwRAIgHaY5w4fwu5vmN+7Wc1EnTA/3btfJwFKAf+ZwtJCMH3kCIAf7x5JQocl6Ou6UISODeAdbhR6J5f3aRBOUxQSDK9VCAAAAawdCU1ZCRUFSzknDySszoWU/NIEanX40UCvxK4kAAAASAAAAATBFAiEAqUH/mQnHX0XoEQX0oHx+QrYfkOJ2wI4BCVbLRP7gVQ8CIGerlgenmxBP512S31apBhXvnO4gELpVjILYrxnVO3e7AAAAawdCU1ZCVUxMbhOp5K49BnjlEfttKtUx/PDiR78AAAASAAAAATBFAiEAoNl9Rj7TJkoI4q1b2X4OA+kYoF0V3H55sMxoGJAGaU8CIFl3I/DCgIv+S7AFIY1W04bKxcIcYqNNaT7bRcr7NffCAAAAbAhCU1ZIRURHRfYlTNVlxeeN+wAwsLFNHm9IKiQTAAAAEgAAAAEwRQIhAOcq4hu6638P5r3w9y5gIA2HWk/vc3OUfFbqf7w36y7kAiA9qY9YKBPUcs6mG7ticgHMM1JiCC8sIG3mlYR4rPauywAAAGwIQlRDRVRINTDAauxRkb4WuU/8l7b8ATk1JzZzZQAAABIAAAABMEUCIQCqfioJmYE5BSw6xgYux/KccBl5IkdPV1eQ/3bfU8zczQIgcRe9BjOBhroguZ9tgcgw0f6EZB1t1rZcD3DWDLb2kPwAAABnBEJUQ0xazRm5yR5Zax8GLxjj0C2n7Y0eUAAAAAgAAAABMEQCIGXERidMHR/0ABmNhtQ+Ro/vNqgsu+qtbLn7vd0Fu27jAiAj6AC6qRqoxKd+Hvhc5mQgA3mlMK1sZPJhjeUXVE54XAAAAGwJQlRDTUlOVk9MgcVQF/fObnJFHO1J/3urHj32TQwAAAASAAAAATBEAiA83yv2tvCA+mS1J/mTZaE8vCEMPENM1j8WxmTRcGR2cQIgK7m2ANMmC7izrARXK9ErgsBxNjisCXK065nZAPvd1Y4AAABoBEJZVEWsjqhx4tX0vmGJBfNvc8dg+M/cjgAAABIAAAABMEUCIQDIwoymJxW71m1lRGEA/lC6gLg39tFfggkG9JQZnwEKEwIgTalIpNHeCNNXunLHa7VBT8QswigTX1xh6IMm27QupVEAAABmA0JURXPdBpwpml1pHpg2JDvK7JyMHYc0AAAACAAAAAEwRAIgRPlh2ffFOmvHxC3fAGHQduSbgfrvpXAF/+3Xlh+xgYsCIEAq8aUbplrIvFDUpnBkSGdFpkLRTW9Mw2vkJn3eOLwPAAAAZgNCVEwqzKuct6SMPoIobwsvh5jSAfTsPwAAABIAAAABMEQCIG10nXb4Jb+Vjzj3sfyU9Zf+zNPaJiiDaAAA2i3FA2mWAiBfXR9skrQE6UcrQvOqDSQGSzRqLZjGtbZ22KSBDq64NwAAAGwIQlRNWEJFQVLb9jf3hiT4lrkvgB6B9gMbeGXtIAAAABIAAAABMEUCIQDBW+toTEZBnwqBjek8enRWguxx2e0Limb0XKu9spvkewIgTn2KEJij+hQ48OAA7v+CbhmD9LV3N8k/3PyyfbYiWcYAAABsCEJUTVhCVUxMmIXKEB39jyPTZIdPeZVUxSv+6CAAAAASAAAAATBFAiEAi9cfDTMEE0cDbEmxh0nyBZKt3TjlZvIsYGj7co/tOj0CIEMyNBoPNCeZEGGCrYh6lRJrYpj+DbtS7O04nMiXiPRpAAAAZgNCVE82kF/JMoD1I2Khy6sVHyXcRnQvtQAAABIAAAABMEQCIEYeFcAO/a1npw05Zez7axX5J9wmJsYgvEmGPLadIT8RAiB3YhiMjyX8gsF5/pX63OSqypLF+phhfEqKjICRum3/dgAAAGgEQlRSTgPHgM1VRZhZK5e3JW3arXWZRbElAAAAEgAAAAEwRQIhAMYjVXYXXi12dMbY8KLhU5QC952sBpTQFXUIsSgf3Nk0AiAu24/h8uOWKheJAy8y6w5rehh3b0ZrQ/z8T6A4PObn9gAAAGYDQlRVtoPYOlMuLLffpSde7TaYQ2NxzJ8AAAASAAAAATBEAiB7jaCWubIz8f6genXZqsPJcbJAJy8agq2pyfa+Hen2bAIgBYxSrQrQ1L5gFTp7HiXMcD01g/PR/nB0GGWZLn9iRusAAABmA0JUWuX4Z94eqBNG31GBuLSN1rC7M1ewAAAAEgAAAAEwRAIgbD7HAGsYaXDo2zBBzVs8LulfI5m8MrK5kdGrqQXajmcCIE3muIbtUjKoX+GwQr4Xv4K7ZgNcYe85WgNnyaa752ouAAAAaARCVUJPzL8hum7wCAKrBmN4lreZ9xAfVKIAAAASAAAAATBFAiEA640drL95QWd9lYfswbtYej7KifTtamMebtckAggShnoCIF9cA2b4WpLn7WY0avDslxINvIyRUCblM0yV+4e/sWUWAAAAZwRCVUxMaOuV3Jk04ZuGaHoQ3442RCMkDpQAAAASAAAAATBEAiB8z5s5OvtiSFgGgnTaU9wIvzWxp8d6WAjXtWxENbd4CAIgUVqHNY2f0k9kgvF9bBUChzAWEaGB8coBruUwTuxh5lAAAABnA0JMWM5Z0psJquVl/u745S9Hw81TaMZjAAAAEgAAAAEwRQIhAMlX8FhJFxTzqYR2e/K4Qehai/FY98N7q1SPc0zbni8GAiAbKQCQgK7dAHB14D2WtdNIDWJj/qlPUiLJ2RruZ1MRFQAAAGsIQlVMTFNISVTQayX2ehfxK0H2FbNNh+zXFv9VoAAAABIAAAABMEQCIH24rrEk06JLw2WImw9BTvlquwWnsCIKgjN0C7EI6k4mAiBnMjC4RYs5ygG8fk83ymDnunBIz+fR/bFFfgCeB4j6wwAAAGcDQlRI+tVy21ZuUjSsn8PVcMTtwAUOqpIAAAASAAAAATBFAiEAsbXvnuOwh3Ns9LwVqRSQr40FXBt3r5/xdmmGJuXHLzECIAyotD9T3d5Vqj8r9ZncPZYJITo2OLc0h2qH0p6LHx3GAAAAZwNCVE3Ll+ZfB9ok1GvN0Hjr69fG5uPXUAAAAAgAAAABMEUCIQCHoS0xA1nqAOx9M8XKLfAgAxSw1VNRJm3/hruKtS8xmAIge4YcwEpogDxy7IFrldouXX3YOQgSxHdKHZghKMccFdYAAABlAkJaQ3XnrYoBuOw+0EE5n2LZzRIOAGMAAAASAAAAATBEAiBLOHXp0wG6AYBJ4SRDWUvTilNVgyS+yEYf4txaI2VMQwIgek5wwb1DPZu7f1ua9bNBQsglMzWMm8ASQGRuRd8RIAcAAABoBGlCQVSotlJJ3n+FSUvB/nX1JfVoqn36OQAAABIAAAABMEUCIQCRhf/qOtZ96KJYE9gX/HXJL3I6o0ysqp7EGbRSV6jPngIgGWXQ1FQp8zfS4s+OkV1yNdnDkg62qRTPaVeeMkuI9y8AAABnBGlFVEh3+XP8r4cUWapYzYGIHORTdZKBvAAAABIAAAABMEQCICO2u4BkbeUVvPXM++U4finjI4mHX6ztDkziKEqhwZiZAiBADpnoUqiv3zRGJQbwYh4LLpiu4e8gyhZuKph/KuTy0wAAAGcEaUtOQxzJVn6i63QIJKRfgCbM+ORpcyNNAAAAEgAAAAEwRAIgMTLaJJDtpN//eY1gNuDi/4gkkqHGLmJZ3G7HEccBFbsCIDyKUSkpLcuuRf7qR2nyfz6ZzSUU0FB1n/6ED6RtRtJsAAAAaQVpTElOSx1Jbalsr2tRixM3Nr7KhdXE+cvFAAAAEgAAAAEwRQIhAIwFOJTfVYD6SJ5qTyoOzFrXSV0wzwBXKGmtk9DIJD/KAiBn3D1G73Nf/Gec11/PtYLxRzler8YkLn3qYyJzfYnN5gAAAGcEQlpSWFbYEQiCNfEciSBpiiBKUBCniPSzAAAAEgAAAAEwRAIgSioOXXsOU/BNLZPR+VfJ3a9ExxWXQX4Jtin6GsRbV64CID4QahPUFmcXfdExck8CGeA5QiHmPf+JUdoOhT2M/wN1AAAAZwRpUkVQvVbpR3/GmXYJz0X4R5XvvaxkL/EAAAASAAAAATBEAiBnAvDlSXC7g6BjHmVTt2BauiP0jYVtfrL6hn3Q7VnZHAIgWbv3CajbpD8nFYnqwBinFhTKHgQ5dbDx0Hua9x8/W1gAAABnBGlTQUkUCUlJFS7dv80HNxcgDagv7Y3JYAAAABIAAAABMEQCICQcDoYAd1dBKxQ4dsy9/zAkRovq8KKAHdQNlafddDA9AiBa7U5trL8lDqc6CtgperpOCY7DiM8TAhe64SgzTMcUTQAAAGkFaVVTREPwE0BqCx1UQjgIPfC5OtDSy+D2XwAAAAYAAAABMEUCIQCw7DpMmQRrP+0xr9Og4E5BcwRjQoiOKkqII85M/RKP5gIgDeMa96Gp+YDKByhFsrSImr9Vl8GplBrjlUPqJYUupfgAAABpBXZCWlJYtysxkHwclfNlC2SyRp4I7azuXo8AAAASAAAAATBFAiEAueFrenNEFN5t+8eJscy/EWtxHr+5QiT4KItOfA+yHScCICFmFzzSPN3qABkLG7HTbTNionjgyR7kS85YAgAPEqwAAAAAaQVpV0JUQ7qSYleO/vizr/f2DNYp1syIWci1AAAACAAAAAEwRQIhANu2WOpc14WzTyPgeLCGvHvM0+fiHKWJIfvd1I03KMNuAiBvlXJ1ad/OY5AmDM89+/xgLg8kMYRKgLEr5W0B3SwqtwAAAGgEaVpSWKfrK8gt8YAT7MKmxTP8KURkQu3uAAAAEgAAAAEwRQIhAP5lWRfLhIkBDFjnXbax/wmn61CcxT3UczrprK7jPv9XAiArhz9lY1DHRRWXgzt2Uw7AVcvhedzjfAbD5dkFSKB5KgAAAGYDQ0NTMVzln6/TqNVit+wchUI4LScQsGwAAAASAAAAATBEAiAZtbf0zzHDCcoZgcKxYo9wn94H/6NM645dDKQFJIN0YQIgDed7MkNQD3PLCeszwaAHR/5ba4/x0Ry9QxhMxnnFo6sAAABnA0NHVPUjhGLnI1x7YoEVZ+Y90X0SwuqgAAAACAAAAAEwRQIhANOPoAQXUsdv4Vlzstiw2V27JtOBDzzhUxpVCGVS34FwAiBfAMhueLDCtXZjzT3SCZ5Zu1WOWyikc9t5L+WHY7HiDgAAAGcDQ0FOHUYkFP4Uz0iceiHKx4UJ9L+M18AAAAAGAAAAATBFAiEArll5C5fktn0UiugLjKY5BEpjTLdd1BhWoGCNxSBPS78CIFFY+B+8lErDFWGZ+eL3WHwv8dSp5uhPNlkXxIRwoEk5AAAAZgNDTkLr8vno3pYPZOwP3NpssoJCMTM0ewAAAAgAAAABMEQCIDQJTQuON95WRyGYFPwReK4p9gdvQuquRcAKQpB/Tfr1AiB/1qAeAIwW6jhnm3MmN9CI+br/ScIroOGQpu2IqvdPXAAAAGgEQ0FQUBFhOx+EC7WkD4hm2FfiTaEmt51zAAAAAgAAAAEwRQIhAJ9cs5Z6KOpr/xxLk4JMOa8KKkL+C+P9S8/cVka9ahBxAiAL0Sl77Bg9YUjZWGlKjdVsyE+kfLAkEuHP+fKbT+Rv8AAAAGcEQ0FQUATy5yIf2xtSpoFpsleT5RR4/wMpAAAAAgAAAAEwRAIgTdnIGI7wavkacVuAi9pylru8+Rhsmilx4H/BNnXb40MCIBac0bVDcKq3jbWER+fXrK9pUVkRIeMPbUmxPcm7Md3bAAAAZwNDQVJCPkMizdopFWtJoX370qzEsoBgDQAAAAkAAAABMEUCIQC7jIJ3xJBBUd2t0uWnmTNIF5U4gfNxASOMwsKYaY0f1gIgHkSznIuaEOJUR6AwihAk0d4skRtvlFBj2h+LTO/zdZYAAABoBENBUkKlF6RrqtawVKdr0ZxGhE9xf+af6gAAAAgAAAABMEUCIQCAVZLb+2M7iWrcEYVeBkkG50GWvvOzfsA/BJy5QgwW0QIgNv5hyzHvkQmYBPt1Dsi0dkYb9XocEakz/4ochYzsscMAAABnA0NBUk2eI6OEL+frdoK5clz2xQfEJKQbAAAAEgAAAAEwRQIhAJV8vqJ60Wdw0WM5bdN1egTDUONtmHAYHuIkY1UnfeAuAiA452oRx0y0fyNTU+yatGeYDM63W3zYEvGLwHzAKV5nSgAAAGcDQ0RYLLEB19oOuqV9Py/vRtf/t7tkWSsAAAAAAAAAATBFAiEAife0BkpiZs3Q0ikxgPkB3Q620h1TYu4R2d1D4ltcUyoCIF2Jk6KDIQ0VwLORpiVSb/JtBR6XKMJ90Y65qPAvBDGFAAAAaAVDR1JJROtkhrE7VjFLN6rKwuxoidEadj3hAAAACAAAAAEwRAIgJKhaSXqAAOTOHCSqQG06WsO1QqOlUawn6WbQ0TrRJgICIG0WCBZoGYP6iBLrkiQ1l/VS5ReiFGmV2ncF8MIxRc/8AAAAZQJDONQt6+TtySvVo/u0JD4ezPbWOkpdAAAAEgAAAAEwRAIgB6tBOa8nfURuWXPWXQ/17UCXZ73CQ69SWM5Qy4fLMm4CIDcEaO+8eK4n3TbgtjmNyuXUc1zvvDF5G4flbX+fu7Y3AAAAaARDQVJElUuJBwRpOvJCYT7e8bYDglr81wgAAAASAAAAATBFAiEAnxnFTjETUjEtrUu1KRgJyq9jpT9WgkelJm8XdS4aW5kCICcWD1kWTNeajWLwN/QNKTShOZD+ZCnpZ0otDCASZjVTAAAAaARDUkdP9JzdUK1AjTh9YR+IpkcXnD3jSSsAAAASAAAAATBFAiEAm47oilgOIHUN+dcgUN6tf9C1f6htG+QHlR6JE2slUzcCIFRvBLsLBAY8+yqegZMj2ZtY2jvyndGRpAJ+7OQVW4qxAAAAZgNDWE+27pZodxp5vnln7immPUGE+AlxQwAAABIAAAABMEQCIF13mYs9YAVs/hJVEVZxniinBWsaxe3SlWvLOnfdp7S6AiBwKnHZ9ilHQ1cfLKViW1UXVVDk6V9HVgYDWSPDUyJzOAAAAGYDQ1JFEV7Hnx3lZ+xot65+2lAbQGYmR44AAAASAAAAATBEAiAnNWqhKQNAmjiBz86Zw4sJDc9HJkcbp9XhC1pK0gMKDQIgaMNZ7eFZzcwTAlUlx4P3g/24UriL+eVAlEJ3UVWl/t4AAABmA0NUWGYqvK0LfzRat/+xsfu533iU8Y5mAAAAEgAAAAEwRAIgXNAd/tbdqECH4/UEZEm7elAOF+hThphXC1Ns0L+53FoCID9zH/djp6dZ/YDZ7cEA/KsysVWe3hQMI2LoiMKAd+pdAAAAZwRDVFNJSRYEwP3wg0fdH6TuBiqCKl3Qa10AAAASAAAAATBEAiA1AmfRtW5MT5MCsH1PBlbsaWC3TWVyjQK2E/AuOJPi9QIgBHEUDkRAdslIAlad/KyBpSi0UlHtp7PTxv2t4ySN3+4AAABnA0NBU3eUktNkTd9ElaotgMRo4be+avHSAAAAAgAAAAEwRQIhAKhRzskmDfVEyeA6gl9CD15WQr04FduyUAcZIiZlVjFDAiBlg7K9Z0rcjiX63iNYJl4TB8V0sNc65To3jhWT8fGyPAAAAGYDQ0FT6HgLSL2wX5KGl6XoFV9nLtkUYvcAAAASAAAAATBEAiA4nA3+1dGwkA+OXUODx+UFs4tkEI3/HZcaXEZMMarycwIgd2Qc3nfOwTTGLC+dv1B9lhMWmtIKytLRTBbFhm41D6kAAABnA0NCQybbVDn2Ucr0kah9SHmdqB8ZG9trAAAACAAAAAEwRQIhAOIqeAiYy3jojAGYVCaKWyEM+l9pmjPtbf+to5kLhjV0AiAusbpDdeF3XOpGytzSmgGuDqYWSuayq9cmPAUhjBzzTAAAAGcDQ1RUGkdDzxr0wok1E5Cis/58E9L3wjUAAAASAAAAATBFAiEA3Rgd1In+ws44vbBQs8P36LcYywYNOJ5g3WZgnZkHmtkCIH4ktoqGMxKAQjpXwyXxoZPVAr8ehCBeJmaCI7JYlQvaAAAAZwNDQVQSNFZ0YdP423SWWBd0vYacg9UckwAAABIAAAABMEUCIQDItk2TIRxoh9sLn01AksDKOvMPjYzk8K7vnUengBjK3AIgI6pUecFtGwkYNdLyH+vj8nkugRyWSwKQfdwvlKX0w4cAAABnA0NBVFa6LueJBGH0Y/e+AqrDCZ9tWBGoAAAAEgAAAAEwRQIhAIsXnGtunfS6fWwI1TKAJbKd0/gOrZCF9Y8kYH/STUhcAiApVdUriC8OWPOZhIU+bi2w+7W7Vfmbh/Xpa4s9NkOiMQAAAGgEQ0FUU4KTu9ksQmCLIK9YhiCnYSijPk3pAAAABgAAAAEwRQIhAP1jTgroYeXmaOYxusGsax6X5ah8FUaCju1xkKgey1M+AiA7Th/dLVlnX5AT6v+RPzE6y1stu94iJYgzfiwD1FXKegAAAGYDQ0FUaOFLtaRbloEyfhblKAhLnZYsGjkAAAASAAAAATBEAiA/4JCKF9tjl/1AZNWis2qr5YF7S6gICVytpH8zR44b1gIgaXOFZKYT55oz/MiIzgfzY3mT29mmafNkissupX5HSgAAAABnA0NDQ74R7rGG5iS48mpQRVdaE0DkBUVSAAAAEgAAAAEwRQIhALz2MvyUHkXXGv+Ld30pGoTBgTgLrQ0TsTpvHEduRT9MAiBWoRsZMgDwiJSzi32HHdJgUeMd8Ef4POHSL4gEsyhTtQAAAGcDQ0NPZ5utxVFibgGyPO7O+8m4d+oY/EYAAAASAAAAATBFAiEAnrzrLtHSZ7lpEYdsIiJrSl52dgwIog2RwcoI534cVY0CIF8oGaPNyge2yFwv6d4r+b91QHLLFqQa4kWROPvAO79GAAAAZwNDRFhv/zgGu6xSog4NebxTjVJ/aiLJawAAABIAAAABMEUCIQC/2gcKxuOVMJyOYtHht7eocFbcLa79fGwmSzn7JL79JQIgZQEbgaNHSaSnrwNPqkzf/rNQrfsAVN9Yvrsj86l8DQEAAABoBENFRUuwVsOPa33EBkNnQD4mQkzSxgZV4QAAABIAAAABMEUCIQDe1SdEVmBdxFO7VnTcKfFZ0cHWXKYuV8VakbUbvCrLGwIgIafaLztrHRfgcLUsCFEDRgj1i8sNPjk9VoSRKr+spcYAAABoBENFTFJPklTIPrUl+fzzRkkLuz7SioHGZwAAABIAAAABMEUCIQD+qI6wl8D7NN+RXBgYSULw6e/JybZT5RZY8OdUp+ETngIgO7+vVv6rbImge6/O69nSUzLe4sXWmFpU5UZFWMaVG1oAAABmA0NFTKquvm/kjlT0MbDDkM+vCwF9CdQtAAAABAAAAAEwRAIgXknKeGTd6XuEhfH6uM7K7qMFZLXT420WJNwxb6VSUGwCIAsLs93fKLbd4izW/qN7DO5weHe8oFBDlt+Jo0ek5PioAAAAZwNYQ0YBDRTTbD6mVw0kCuOsnWYDmPfEjgAAABIAAAABMEUCIQCXe4H4P+nnLifVcsCMO4C8yPgXMp4GNj12d0mWJeRDUQIgde5rBMtmXf8ufkeeEvMqPYo3gJ0XwUeVfRFiaXMqAIsAAABnBENOVFIDBCSC1kV3p72ygiYOLqTIqJwGSwAAABIAAAABMEQCIA+MVAC470O9IIClXaXYYLZ3HtaqnR0KnzgYF1fPeql9AiBU2p0+E8w28XRQUJ0CIvx0Z9nlFiBU7ShZwj0IQBK9rgAAAGcDQ1RSlqZWCae4TohCcy3rCPVsPiGsb4oAAAASAAAAATBFAiEArvTze4F6iz/DjfjXFxxQ/2o3ErMAbIZ6f/7CDvh7+UMCID5EFJ38XfmYaOBXMJqMjKtaFTxgMZveksgRz894Fe1uAAAAaQVDRU5OWhEitqDgDc4FYwgrbilT86lDhVwfAAAAEgAAAAEwRQIhAMjJ01K/LlVZlcYWQStXDcxv+JEL+H4DTIzfol9sSEkSAiBNQ4Bj6fm4xWW/iwa2+l5B2NxNu18oLuRWxkcx67wCYgAAAGYDQ0ZJEv715Xv0WHPNm2Lp29e/uZ4y1z4AAAASAAAAATBEAiAzfEYnnP3SFps6BfoMFgAGgjSB1gVbDTgZcUTe+WgTJAIgHdogCXnND52bFL3IihU0b3q13rCsIQFSIf7WuxbheeUAAABoBUNIQUlOxMJhTmlM9TTUB+5J+ORNEl5GgcQAAAASAAAAATBEAiBeAX7ZslEcPLsFMjMFLb50MvbUbtzDSNNvpkCLHsZtcQIgPcMFhlRzzpaaDbvAkaIoLEt9eMVH9Nw8QqMtQORt20AAAABmA0NIWBRgpYCW2ApQovH5Vt2kl2EfpPFlAAAAEgAAAAEwRAIgUkP4v1u7+BZOR402c94HvnBVYzbkXaJcgo8h1wa2SQACIBlQ/wuPQ3CP9mTfQizDOOjDgmr0DQpCWSDmgCpmTZcBAAAAZgNDVFTj+hd6zs+4ZyHPb59CBr071nLX1QAAABIAAAABMEQCIHZbjpk4My1PTGRMsQcQ2X1vzbjm1heXbdDe3837ZT2eAiALpmFEujw6y0uFy40og0q2ebGRIDnRi4a3GomSMjkfYgAAAGYDQ0FHfUuMzgWRyQRKIu5UNTO3LpduNsMAAAASAAAAATBEAiBzT5bjvcA9d7aiJcBxAYX/z7r9VxY4JSptZ4JvZHmB4gIgdaHAWxDNlrlcMgVVU6hZ6kQo2StWj1lqIZgRkFioZYsAAABoBENIRisYqjdUitwYJkEbXaKqAm5+evnKTwAAAAIAAAABMEUCIQCe2DgP+lGSwHic3r54h+uhdAl8eKCdm4m7yD1Sum5OygIgBYMCjiv0Z/7He4QlFkIS4rOdI1oA2ouKBqUfsWJpPHgAAABmA0NIWjUGQk+R/TMIRGb0AtXZfwX447SvAAAAEgAAAAEwRAIgQ5MpHKHA++CFJOFd2Q5kE13DSqVWt6qxb2QUSkcgcpQCIBBH8WaB72xV7mDQ2vXQPliQ1ObQOjyoVmmCC3KlAfLcAAAAZwRDQ0xD00jgeigGUFuFYSMEXSeu7ZCSS1AAAAAIAAAAATBEAiAuWikiCa3rUsvl6I/EAafAsEKgMPLZyW1O+Bpu8/ziFwIgXIB5Nhkmyo9pNdbJR0ZBEh7BmD7bVif57dFUzjlNKtwAAABnA0NIUooiedSpC2/hxLMPpmDMn5Jnl7qiAAAABgAAAAEwRQIhAPxtvVLd6FSVgwCIIILVfi02txJqFNIIp9hkJwV8qdZCAiBpJ8QSBuVS42MD6sGDi1hitMRuuW8Tkai+cpGE602hvAAAAGcEVElNRWUx8TPm3uvn8tzloEQap+8zC05TAAAACAAAAAEwRAIgEEnGvdyXlgfTJrtLZ2H/pC4EBJ4oYepPE1SxA5lRyQkCIEnzYViymg78K10gMQuQDgT1JxM8PfMun2HfKtf16pLvAAAAZwRDSFNCup1Bmfq08m7+NVHUkOOCFIbxNboAAAAIAAAAATBEAiBLIwu9XxdhGqNJZ3aIIjzV/QparrUZNdDOSldN2o48XwIgdKhSslXlkBI9KzohDuBtFGvfmgIWCoJaAKd+RtUzflUAAABnA0NJTUVsY2yp/VTb3WbebBwP6vVjfdt7AAAAEgAAAAEwRQIhANGly409GCCcsfwg28qKXX1KwLT/7NihJAudvCQWdwMPAiB8DvWI2iG8n4DlqO7Z1SZFfdabM8I6u7WXkCPDaLvQuAAAAGcDQ05E1MQ19bCfhVwzF8hSTLH1huQnlfoAAAASAAAAATBFAiEAxFlI7juiWMF35cBAGupfQpR2n9hmsUgOc4I6VS80OBUCIAIBMFWenaeIBrgPRgR6IEvv3OAAkc7gmWMuxZzbhgdFAAAAZQJDSwYBLIz5e+rV3q4jcHD5WH+OeiZtAAAAAAAAAAEwRAIgb8mVCFC6Pqw2ot0w5kinRe3+t7eE+ZqA6h5Vinoaz6sCIFntN0gLLfYtQKU6HzZCBPI7XDIcm6x/fUm3VD8Q5DJDAAAAZgNYQ0wIQ5cbSsboQqUYqhhOAnHYi1y3TwAAAAgAAAABMEQCIBERWDaNBr2j434Y+2fQ8IdnXpDQ9mYtxNBAEyZg4/xYAiAgcioAc2twgz8T1MWRTv+A0EVHZSA3NKVZxsAoQXckRwAAAGYDQ0xNDtg0Pf3uMuOLTEzhWjsApZ6Q89sAAAASAAAAATBEAiAQMq/beGmRAATPWxDUaNohBJTMfCoJRaNnRnqtLGV7ugIgCTVDSzlkBngTznl0DlrktmFun6AF4yZYngnZD3XZVCEAAABnBFhDTFIeJrPQflf0U8rjD33dL5RfW/PvMwAAAAgAAAABMEQCIDnK779p/a2ELmE500uYM5UX7RZZTybg0kz/TdCHLP6XAiAMj8v4onoD0vW24O57BLGEHam9MCXopPi4kwU0puvcKgAAAGgEUE9MTHBe6WwcFghCySwa7Pz/zMnEEuPZAAAAEgAAAAEwRQIhANTj6qQmrsNOLX+AWEFY/uFvp8FtNxzRVKSjNvl4xaGYAiARblN6DzgOAbC7/iyqC1pS+1iyqEi/TpfdULhXTzCNiAAAAGcDQ08ytLHSwhfsB3ZYTOCNPdmPkO3tpEsAAAASAAAAATBFAiEA5Ijx/MQKqsnlKCdovAsXuSKgLoAymwPtZUhRoySpNy4CIBdEP2kdG4vG7WHZmG2gRtZERcimpnQy+6fSj87odWafAAAAZwRDS0NU9rxd2yGyK3ajHHGaiukEIyBV2HYAAAAFAAAAATBEAiBGptXCl0AR7aTWTFr8rEOQsxvpGVxUhnnxteeUzN+wegIgbp5B3B2+7lmbiCYqYJG6GdUdBXGb9i4BenWgeMlU+U4AAABmA0NUSYwY1qmF72l0S51XJIpFwIYYdPJEAAAAEgAAAAEwRAIgGAroeQ6EbCbMaHjAU3ihzlTqCO488amGfFQPYiBuiLICIBW+KZngCijwwqdOME2aiV507lcru0fjhWvjnbmWMx1tAAAAZwRDQ0NYN4kDoD+yw6x2u1J3PjzhE0A3ejIAAAASAAAAATBEAiA2oJst/VSSvcy0OToAqhy4kr7m/a3kj64Ef20jtTBLTwIgJ0BQMWX4tLrMLXtV39rv3hkak1x/5iUgZ7q64A27SjcAAABmA0NYQyE/vuE5S0YO7Z0fh/AGbEyluFzqAAAAEgAAAAEwRAIgKWMxw8f5a2nmrSf+H5uuHD5dOhAc5d+mVghSICSxNBgCIGIqjn5xefkGMozVrGZuiJzkF2fzxY5nXYOklyZ0sDKQAAAAZwNDTEKxwcuMfBmS26JOYov3045x2tRq6wAAABIAAAABMEUCIQC+IhJmmtFtsEJ0Y6hcRuEmRNuJgy4hPQGE+XcqhNfsmwIgFm78UuOm/hNHX0QvGiS/UN7mbtZxSHaGvDmpZK7nSMMAAABnBENNQlQ+3SNcPoQMHykoay45NwolXHtv2wAAAAgAAAABMEQCIAYwhcKE4fQWIB0hlvgdIgbtdNTrQyHDtrgfNSQRkwoUAiBfnSC5ccSjlW7I7u5HStjbFUub4MbaIdFZBJj3Yc/ttwAAAGcDQ05OhxPSZjfPSeG2tKfOVxBqq8kyU0MAAAASAAAAATBFAiEAsP0CnGjecqLTeadd+UsNaEMuyVpzVM4D9Fd8SeBWY+YCIA9aOa2uSItvo9tHGVtvu6UExCGBqMOO/FHzv+O4WgEEAAAAagZDTzJCaXRXSza87UQzOIddFxzDd+aR99T4hwAAABIAAAABMEUCIQCi2t0LLfCA+8+DLI09HUH32WUrZPIwEfEYCZMBDSu6EwIgdOGAXmdSvCCG2LuSQ0/CmfITc0CYc4iMY8Jv8hslp6UAAABmA0NDM8FmA4cF/7qzeUGFs6nZJWMqHfN9AAAAEgAAAAEwRAIgO+QIpsmw5YhC39dsh0//IIF1rxjo3aB4kJL5cn7/DI8CIDGIVZxogGOFd542lrZrCkFmdKSm6/vcqA9sIZdXgKdyAAAAZwRDQkxUKamcEmWWwNyWsCqIqeqrROzPUR4AAAASAAAAATBEAiAgb4w3PzTPZPvwvRlV8SHWVvVdS4ksUVqnNluPyBDd+gIgb6gdgN3OS0kcFQ9wNs0qPwdUpn9Z226oGVI6QSWxr14AAABmA0NPQrL36x8sN2Rb5h1zlTA1Ng52jYHmAAAAEgAAAAEwRAIgKsxt9YzmJpsz+kULYOfEkcce7c8a7wZoamNDxiDPlHoCIFzw5bkM0RS8NbwW+41TmuspL6T2f96he59Sjw7xRvgNAAAAaQVDT0NPUwxvX31VXnUY9oQaeUNr0rHu8DOBAAAAEgAAAAEwRQIhAPQjlGRHo0QHwf8rCfCZCTQV5a8aMWJwZ37YKqqZ18i/AiADfW76eXAbQU0vCaoXg2AJ/puG925mJWExMz9vyFr1/gAAAGgFQ09ERU9GtKfZBvGpQ7d0TfI2JeY3JteQNQAAABIAAAABMEQCIEHOgHGFlwo8Q3aJ6k3PUprrVI8MWkWQD2f6uAZOozt4AiAixhgjwFpMmHt36eMSkvUL5od0FhiYx8gOe021lpqDlAAAAGcDQ0NYOV3JqC4+75YrA1Wj1OaBnpr3dtIAAAASAAAAATBFAiEAxnof+QMCvXBc3fu81N2Tka4VqwvC4EIvd58iVekJsHICIAMs2nHaSKQ9+WBI8WgsAg0ctkapvYgZJlziNdM7kYLwAAAAZwNYQ0NNgp+MkqZpHFYwDQIMng25hM/iugAAABIAAAABMEUCIQD29GCiTBigzngic73jVJEZ7cpGvHq09HcCVAioZmK6AAIgcXTIhGo8Vu4Jm6ozlQoFsLVowOEqAJKAXlbZh9Wk7SAAAABnA0NEVBd9OaxnbtHGeismitfx5Ygm5bCvAAAAEgAAAAEwRQIhAKYLwcNz4JhFMvSwyqCb2Ad2nHsa9ntvN4OiFJt7k4CvAiBGx3jCRgfV6RLsK2Bj7Q0LfBlUx+0htZOEcC9tyxZz6gAAAGcEQ09GSTE274UVkqz0nKTIJRMeNkFw+jKzAAAAEgAAAAEwRAIgIa5hIy4vrm5pdg3EXcw5j5AqJX69wchLDJOZ0fm6Z+YCICokFCstwVkuLUC3msfNlQZ26bszxEo69tjRfOmwslHWAAAAZQJDTOgdctFLFRbmisMZCkbJMwLMjtYPAAAAEgAAAAEwRAIgCOIkr57E8JmYjtACiHD97GgsYHr+uvWh7OsYZRFCvKsCICuH7EQD/v3hGtQEMCadQiUYmX7SeWiLDAFWVW3kygJDAAAAZgNYQ002rCGfkPWmo8d/KntmDjzHAfaOJQAAABIAAAABMEQCIH7uk+NE1rdczZfr7HKspMCZsJEOkqYmshOSIXvciHntAiA/EymfFftn8aTcR0z45xtCFopx5q1/gIGp4XvlNDM5cAAAAGcDWENNROLKkc6hFH8bUD5mnwbNEfsMVJAAAAASAAAAATBFAiEA15FdkTzKiHpr7YgZBgb7EhNC1oiSXrC5u99/ve9IHrgCIAD6wMlQzOCeY7IYiBlV/PGvYSml1fehIvvTg9N8Bi7nAAAAZwRDT0lMDJGwFaum97Rzjc0250EBOLKa3CkAAAAIAAAAATBEAiA3q0G1bdPrHuxM3+Kc2uDGBbqYTf4Q1G5STTGPF2m/kwIge4+qLkGhQiMN8GoHjkr+Z5Er7uYfecfU+3Jl8awQukkAAABoBENQRVi3h9TqyImXMLuMV/w8mYxJxSROwAAAAAgAAAABMEUCIQDT9S48+MdZChupJyEp+fMdV4Psfykt1y6SuFYGVOxORwIgFN8KAwRSmyriIqJMj3vK2DoLZmkA3xae/OwYj/XFPGwAAABoBUNPSU5TpI07efQ0dyJJM+SS5C9crPQJHswAAAASAAAAATBEAiA5XQ6yBvPoP83V3TXkJ2vWguPaynOe+cDB0kK6OQpCpwIgd7nBzZznQN94oi6wx1eusZjeJHQVCrXzOFIy7FuXaF4AAABoBENPSU7rVH7R2KP/FGGrqn8AIv7Ug24ApAAAABIAAAABMEUCIQCoBHfmS9/neKgvWsWE/e8tKfZx9XjSrV6i8NqyWsSn6QIgcA2+XNbhbjjLJzLZsnEHAYdd6lNHvpPY/4zGiJerRxIAAABmA0NMTkFiF4t41phUgKMIshkO5VF0YEBtAAAAEgAAAAEwRAIgOgu+UQlhq8WYnNv/2tSnmA4CZyd281lNkvVInyGHTZcCIGOGSw3k4jhraiak1i1Y5C1ByErOaHPauCIcghlDNt4tAAAAZwNDQlQHbJfhyGkHLuIvjJGXjJm0vLAlkQAAABIAAAABMEUCIQDFE8O5MQ0/OgELKNRsLdyEGdykI2YORpBuKE/qI+I1JAIgInd4pUj/r8HSlRmSzTAlV9sKhZX7yle/JpAv4bV928IAAABoBENPTVDADpTLZiw1ICgub1cXIUAEp/JoiAAAABIAAAABMEUCIQD+R6UPmEtafljGB7lHsxozZHxh7Gj25UZFnmc3ZoOQjgIgIuIEe+NTZ+BU/3NhIFQthXpMhdYH/wEKEM5Q52jSLyUAAABnBGNEQUldOlNuTW29YRTMHq01d3urlI42QwAAAAgAAAABMEQCIHoN77LUQx9e25ZUf6vOmTg/zUpJcwGu+trJW/50oZ7uAiAFP2JZD3PvtLns4C0AEx7in9ktx1J1iAaqfTi3ee39TwAAAGcEQ0VUSE3cLRk5SJJtAvmx/p4dqgcYJw7VAAAACAAAAAEwRAIgXJsRMEP6aqjX0B+OsUrXJ5o4hgwrVoH+q8ZRktwphukCIH/rPRbRKY7SpQQQn+6/wA+3CBvXaIIl7zkdG3UF5FBxAAAAaARjU0FJ9dzlcoKlhNJ0b68Vk9MSH8rERNwAAAAIAAAAATBFAiEAtp4b6VkYqRdotPBENmk2Unly7ptvWsf/wqcg9FE8AiMCIBVcSKc7kin6co+aED/595U1kfq9czJib49ZDMcQ5PjRAAAAaAVDVVNEQzmqOcAh37ro+sVFk2aTrJF9XnVjAAAACAAAAAEwRAIgWO0lwG/XRdOF5DXn7sVpZfVZ5xp5C7V7vshDhNNvwj0CICsy5F+jSpNoUbD8wV9mHcJ0/v3KXTp2nWcIFEM22vBMAAAAaQVDVVNEVPZQw9iNEtuFW4v30RvmxVpOB9zJAAAACAAAAAEwRQIhANrVCCJ+Or7BOoBpHuA79kaEzYfhZp5TxrnCFAPXQrRkAiBRaCTEbj1CSnoroke7DRghdUh0qRwwGZaqEcOTIeWX2wAAAGYDQ0RMipXKRIpSwK3wBUuzQC3F4JzWsjIAAAASAAAAATBEAiA1dOxWx1zeMemeT5OcWcO54+CWQJtGgfk3I04AQ7Sb0QIgA2S0YComW5DfcE3IxMpUtGlkecKk0rK7zXHclXo6pHYAAABnA0NKVDq9/zL3a0LnY1vbfkJfAjGl86sXAAAAEgAAAAEwRQIhAI4oE9Picz0fC6IfiplxyjtNogmlgD7JT4wfQaN7Sa6OAiByC2HL9/SWalukbInXG3Y2JCTtlskH3kFYTqukR8u4jwAAAGYDREFHqCWKvI8oEd1I7M0gnbaPJePjRmcAAAAIAAAAATBEAiAHJEq8UC8fuJnE5A91Ho/VcjvVLKYJJD257jCD/QXA6QIgX76Xkw81OPDUoUagf1B4eJOUM/yHq9yWYITvc5eG79kAAABmA0JPWGP1hPpW5g5ND+iAKyfH5uOzPgB/AAAAEgAAAAEwRAIgVHumQ4ci2OyJB//bi3/9/WpJApY/QfDuv0bRCDw7DBMCIBwvk07EyB3oGpIPMoO00DElam3mvj9HYPz3/DDXHYkCAAAAZwNDT1NYmJGhmBlQYcuK0adTV6O3263XvAAAABIAAAABMEUCIQCuGPVX8G/Jwqz2qe6WIdm0LJcdgUX3O2o8UlikK3AycwIgQUCZbPZ/9p9rf4Oq1TkocnYkRMyF72A88/aJE2A60yQAAABmA0NQVJtiUTyKJykM9qep4pOG5gAkXqgZAAAAEgAAAAEwRAIgAeB+tlRiurBPX4j+V6Cp2rmvex5+J/o1OvC1JLfJuUcCIAsR9rIl6qxpqAwwzOtcpBncw1I3rWrxh0rX6voF62oNAAAAaARUUklC4JIW8dND3TnWqnMqCANv7khVWvAAAAASAAAAATBFAiEA7opjp3LLPsY9B8oN0a2xDCdwi7uWGVQ8CJQw2iGKYmMCIDwsBUU+YqVWZXKhZEL1ksb6YEoP1JfSw9ghPd3IvXmLAAAAaARDVEdDnn0pvUmbbH2ipbLq/PSjnTvYRdEAAAASAAAAATBFAiEAvy37TfsWpCTeFs1WavtriyX8m8dKJHQ8lMVZbH1AiQkCICuRm9pt69JFyifYORqCuAIIZPAfuZKLLPCftGSMnzyNAAAAZgNDUEwkjCf4FO8snFHCY5jQlxXNNRQvxAAAABIAAAABMEQCIAkgGVyScNi9dd1AElIUmpqpNLByxYI9qH0MoZt2ZHbbAiBTXOFuqam7rq7IIXPDrvsH0Zavc3RyLf2sxKPRHTHYHAAAAGYDQ1BZ9EdF+9QfahuhUd8ZDbBWTF/MRBAAAAASAAAAATBEAiBza2KRTCRSc0wZ/cZt0aTJbMoRJe5hvFj2sL5aGalSIQIgG6m47fDXypKZ15RDzTpHf4M6uok8mnnA0R9mJMuLLkkAAABoBENUWEPqEXVa5B2InO7DmmPm/3WgK8HADQAAABIAAAABMEUCIQD670Mh/4fGpaAGnL3Ob23SsN+W+f7/T518585G4gfZFgIgaykTC5dy54oYxiHVWm5pl1l6Bwlo6H/OhC+uUBLFcMsAAABnBENPU03EvNZMshbUn9PGQ6MnYvNGJrRaGgAAABIAAAABMEQCIE4ognH0vqQcpHzT31PRu0fqtZ7IVB9CyouB5NRoZc/7AiBEGzgDR3aac1iU09nIC5ieZZMZT9pwUqXoB1EBp10BcQAAAGgEQ09TU2UpLurfFCbNLfHEeTo9dRnyU5E7AAAAEgAAAAEwRQIhAP6o6hioDTsPm6F80i4nMxj6xt2MgpEwXb6UorJ9Rd8MAiAxdGv+a3aJESL3syxABHjeTWfFW4Ot1XvsPdxi+vetYgAAAGgEQ09TU56WYERF7Bn/7Zpejde1CinImaEMAAAAEgAAAAEwRQIhAPIWYmJma0YCsQu81c7FCbP/oLtxIwR1Nn58fBY3hmkjAiBCp1a8emmMq8Djx93TUiVnczxeRXaUXGooM8Wf/i5rVwAAAGcEQ09USd2zQiSX5h4TVDvqBpicB4kRdVXFAAAAEgAAAAEwRAIgGmGqov3vxGcKRwki/FIrrz02rDFcNnVXmdMH+UmPVP8CICe8ViwdXNbe7rMDbZ7tAzai/LT6KB4lRc0SgedvxuBBAAAAZgNDT1atqGsbMT0dUmfj/AuzA/Citm0OpwAAABIAAAABMEQCIGmm5Ple5Mk1K1EYrvJsmGqj21kV4iPdWJp7H6tt2BKLAiBmOs7IIjYGnKMdcPVSiXe7fYoSdtp5UM9u7TNrCaG4KwAAAGcDQ09W4vtlKe9WaggObSPeC9NRMRCH1WcAAAASAAAAATBFAiEAuTRTxtmraRE5YP9pZyVqofEpm4PSsSwKNf1ZGmTWjAcCICbLRlEYcj0rFyrNQj7ffZ/2Bz1gcQA29R+97IFssgfgAAAAZwNDWEMhNAV8C0YfiY03XOrWUqyuYrWVQQAAABIAAAABMEUCIQC4UQBgRvXxF2kOTSIb6ji7ecAWojxwFgDfMJWqoPhEjwIgQkJ7rLlmhH3+yVoxS5QNgagxouLQFsc9q1L65B+jmpQAAABoBENQQVkOu2FCBOR8CbbD/rmq7K2O4GDiPgAAAAAAAAABMEUCIQCbu9YG6QX7ZzSUrlGYvYGNwHx5b158bHJ+J9+RIrGzwwIgMTw5sYaQ9qE4yE7sa/e/yesQ1KkcpeJsLa5Zwn1iMoQAAABmA0NQQ/rk7lnN2G476ei5C1OqhmMn18CQAAAAEgAAAAEwRAIgAu5OHyJ0bEw+rfSoD/DuW97eqF3DQaZ9WbQvZdoU8g8CIF1oB8OKSmZu91rcBm1brMpiX9HC8zlrfveOA80OeO1rAAAAZwRDUExPcGSqs5oPz3IhwzlnGdCRemXjVRUAAAASAAAAATBEAiA7QZBHXQ/a6UXQy5NZMaWZJvA9o3xJ6nEO6b1dyHiHlwIgOs8M7QU7z3YF4oAKFLm+00TcLSoFpiGakcz32Z2/AWMAAABmA0NSN39YW5Ewxk6en0cLYYp7rdA9ecp+AAAAEgAAAAEwRAIgd/jw0QcPCS9v94TIhPlxeSKnbqRQC0bd2pX+7J14GokCIGuRluGDzRiGgjIB9W5WPmhaOMzeqhX2maVrOG30FrMYAAAAZwRDRlRZaVaYP4s84XO0q4Q2GqCtUvONk28AAAAIAAAAATBEAiAvzg6qBgrY0h+CaYBGgengMt10nBv0p9WYTPwkMA/CegIgVHnP5WlPXhgOTqJw1xhQW9XFP0pE7oRUkp8qHJZFqusAAABmA0NSQq7zj7+/ky0a7zuAi8j72M2OH4vFAAAACAAAAAEwRAIgBTVnP8biAI5Cqc1StccpihKP5SVFEISMZA/y0O4zQvECIC3XiDm74E8e85y3s2tOmKJ0hnUe6zgbHWW2Jjby2Y70AAAAaQVDUkVBTSulkveNtkNlJ3KZKar2yQhJfLIAAAAAEgAAAAEwRQIhANG0Q28nFGPDSQ8z2s81INJawQ7qcLDymwHQV40dK5KaAiBcbmnulE023eqvVnIHzQEJkDEBxOy3A7K3KSlhbnK9WAAAAGYDQ1JU8NoRhqSXcia5E10GE+5y4insP00AAAASAAAAATBEAiA5xj9Ck9zC1jvNMIwSiggkOtqr3IJKpFewpnBRGH8x7AIgOSWDuTqcu+Gg04ty1+wPKSwO/xenefgerQzTrsmqHaIAAABnBENQQUwxkQr/VUV4R1WXCuH75/5l1fDuogAAAAgAAAABMEQCIGAxBfUHTglc5bKSo6nUq1swOAniJ0tfvSITZONdYvEpAiBWwDAL0LNh9mvRucCM1OSc/A4R949MwQr3GV7vs32F3wAAAGcEQ1JFRGcqGtT2Z/sYozOvE2Z6oK8fW1vdAAAAEgAAAAEwRAIgazbZILTYLKsqJjLoH79Nesu/TO/R1oJD3eUFUHtpP5wCIEr9QBaYGnRZlXvr+H3RaoUV5MdlXwx67PzWaWLZvEhQAAAAZQJDU0a5rZRNEFlFDaEWNREGnHGPaZ0xAAAABgAAAAEwRAIgMmQqnmYrQXcbfCT9VdF4jFKksb/VxG9pZbrS2GSBkWgCIEphHvdzcoa2XPAv6jeQNjxEr3ccYpK/df6miQNV1RMmAAAAaQVDUkVET04GA+KiejBIDl46T+VI4p7xL2S+AAAAEgAAAAEwRQIhAITI8OiQ0V2Ghj5nlO6kciQCB9zxvUHoI2q10Cdy2j7uAiAN6cXV+8S8CloLTLPNgR4bZZ8hTTDpiWKhwSj12WlckgAAAGcEQ1JNVJI4v7eBpV6sw88F99+UA4wZjNm5AAAACAAAAAEwRAIgCxzStttdQVhyaxxKWOYebgHXcUbLchdSW87XATtIo9sCIHrey/ArZcs9UjfGeZXdy7eRsUaYAoCim7ccNCpB70o6AAAAZgNDUk+gtz4f8LgJFKtv4EROZYSMTDRFCwAAAAgAAAABMEQCIHUWuVTv6GOELP0T7FK1KCJEGQr7FnCAbrraF7Iiox+0AiAiCYVRiVgkUmM4NnV5QUhKmIj1gZVUbk+dEHYLQ9TXYQAAAGcEQ01DVEe8AVl3mNzXUG3Mo2rEMC/JOoz7AAAACAAAAAEwRAIgOsZLGevbfKTz2Uk26fN3LdyhXSc+pfs5u9lxVGINOK4CIFnHcu5leC1Qc8guojOEXuqnSJS75xcAhcPEHpGvIDusAAAAaARDUlBUCDiUlddFbhlR3ffDoTFKS/tkbYsAAAASAAAAATBFAiEA5XF2OyCSzkHEPPdaTWiZ/D3FrTt6l/yx4HgX4x0brRsCIHhK2VoJ9eNZVknU0tbifNdx6pyJeHY65egq5QIQSQY3AAAAaARDUkJULPYYwZBB2dszDYIiuGCmJAIfMPsAAAASAAAAATBFAiEAtK9NcsboLMZf3WHDo0puo49oZIEuLn2lYYRU61WUgTECIAEjrt0+nHXjyS4R6raRbFzDrnBxPweaNmrHLBW/inp5AAAAZwNDUkP0Hl+8L2qsIA3YYZ4SHOHwXRUAdwAAABIAAAABMEUCIQD1u+FLHcihONfVn6wUrGa+aDNZrH0UZUq5PV7iA0PECQIgE4WveLzpTNzq9ojG1GIOGf3ThssfiCuvyWY+gxMm+FEAAABnA0NQVIjVC0Zr5VIiAZ1x+ej64X9fRfyhAAAACAAAAAEwRQIhAL+ykQ4016Wc+CorFR8FC6muJ9luOoRZ3X0rncbEd9XLAiBzOi8soC4xwd1Ar7KKOSPsuZPLkgmVI3xGDezb6jKXvwAAAGcEQ1JQVICn4EjzelBQA1HCBMtAd2b6O65/AAAAEgAAAAEwRAIgbH84KQ7FoNz/rw5DxtwsqvyWJ1dwbfUDqM0LaEJAtFwCICxUul01RQ+rITcwNEOynUMMiJeuDoZlJ2EpGNTtRRVbAAAAZgNDRkNd/4miyqTXa8KG901nvXGOuDTaYQAAABIAAAABMEQCIC7ZPDgueiYBr8msqJWie2FPMTF9zOX15ng08ufmurqjAiAjT9Zftbvy06C6uilBDF2umgQHRiXXFLpFdx2ebClAqwAAAGYDQzEwAAwQAFDpjJH5EU+l3XXOaGm/T1MAAAASAAAAATBEAiBRilJwBahnE41+pJBti1v2QZpiVqTOXoGglvIkZ8eVywIgNuGV3uzK6Ai1O+jM12piXiy/0Fn036XS6Hdx7XZWoMUAAABmA0MyMCbnUwf8DAIUcv649yeDlTHxEvMXAAAAEgAAAAEwRAIgQyBv2O/1pcEf2PUCd8QRGlwieJtNuxdi4MoVGsLOBKwCICmj/h4ByhmVMtNV+t+z347ldYAILpdzzKlfRIdMZTNdAAAAZwRDQlJMpvplMazfH5+W7d1moPlIHjXC5CoAAAAGAAAAATBEAiBO7oE4JNaJ3oFSiszf3L6rtWyOoSCFTb41qb23PK7SCAIgFJ8ro8rInPp7i9eJp1kWWWSEtfZ7ouWqcKGu8Q6r6JsAAABmA01DT7Y7YGrIEKUsyhXkS7Yw/ULY0dg9AAAACAAAAAEwRAIgUbBtvwTIQkM8xe2o7oUEQkYUHsV9uT/phQgqXmV+/HUCIHHYd3c6d2nMcoxRO5IH5kL5VJnl/H8QrV2ghWN5u1KXAAAAZgNDQk2V79H+YJn2Wn7VJN70h0gyIQlJRwAAABIAAAABMEQCIA4t93hG1k5cHaMs8ixXkl/fZHUT5phco25DtkMFdGLIAiAkW7X1BWvPXOav1h6bzcTP7UOGTRz/l+7ZntX5n0o4NgAAAGgEQ0NSQuTJTUX3rvcBil1m9Er3gOxgIzeOAAAABgAAAAEwRQIhAMcY+g1JZ3sYRcQAM9XocEUHaVOOtblW42rma8DbdpovAiAUftS9A3Xs9C0D09Y0b5OlMUlImZMfePokcbWMjfz5EgAAAGcDQ0NDKFd6bTFVm9JlzjrbYtBFhVD3uKcAAAASAAAAATBFAiEA2yDkxIdqzrI5Os496f4HLalwHioVrD+poVTwDjrXpbYCICV9Ka8EoEY/uff6APM2TP5drlKFusvNYsXGhBo8c/uYAAAAZwRERVBPfPJxlm82NDvwFQ8l5TZPeWHFggEAAAAAAAAAATBEAiAz33EvKabrHuJbrw+nPMs9q/9MZP8gLCq4l9fIFz5SIwIgcu0wWA8J2zhW4T5VuD3P8lZOwDyGXF4yyBeF8H6py8sAAABnBFhDSEa0JyBx7K3WnZM63NGcqZ/oBmT8CAAAABIAAAABMEQCIFuPpGXWUjc+xQuNpJhbIcUMQ8nf79XxleNpViSlec5bAiBdPznv87hKLQCYSpIvx5NH9IwG/lEIBvNS4bcnJ9e2OQAAAGcDS0VFctMqwcXma/xbCIBicfju+RVUUWQAAAAAAAAAATBFAiEAvlXadYIkEhGL4KPaWdY1Ty4tPYIlsAbMkMjk/Zx56DcCIAtTso6gp0ZGqOB1OSaxtLmmhMMOYGLe1XOSZrpOkeDSAAAAZgNDTFB/zihWiZpoBu7vcIB5hfx1VMZjQAAAAAkAAAABMEQCICR3a6mwPj15Ib2445p2Bfk+5MXjTqn7ZRIajQgL3ZgUAiBp3AD0/995n8Xu8YapStahqAqh8YRLMfALkrq7PzvZ4wAAAGYDQ0xMPcmkL6ev5XvgPFj9f0QRseRmxQgAAAASAAAAATBEAiAhcbMzcMvnER4GsyEW3Te4KGaNns0Wv1B36Gw7IsADOgIgVeH2yiv51fMFDZV13KyKBj2Nj8BfaRkkuv/vVYmxeq8AAABmA0NNQ35mdSVSHPYTUuLgG1D6quffOXSaAAAAEgAAAAEwRAIgULq5u4XRgX6AnrS9aaZXTAqOlWo06g9iep8ToQuLpL8CIDNy6rlmznf9Nr//lJiEtSZnK2ZZCpVopJ2ES3KXPedUAAAAZgNDU1S7SaUe5aZso6jL5Sk3m6RLpn5ncQAAABIAAAABMEQCIH0E/PlLicVkpuPHpqKJHveuMDqr0kA47EpTfjzht5RpAiAgOj8EZojkBAsbFKqcLd+GPbwTQdvedHcqvesYZAhgfQAAAGcEU09VTLsfJMDBVUuZkCIvA2sKrW7kyuwpAAAAEgAAAAEwRAIgPPybT6TrZ1EfkS1wbvEoDZCjNAcWhcOc6RXWyHvzal4CID/o/VNrngXcR/dsTX6aDa3CHUsR6Ppe3YLzeKxBB1ZRAAAAZwNDVEZFRXUPOa9r5PI3toadTsypKP1ahQAAABIAAAABMEUCIQCIMgEUSy+LWD22JSPHB0UA9TvK/vk5qjjeu+KEiBDifAIgAjRm8ubMuAv3YtyW3wpcInArDIUf13mXYKdhwoMfdNAAAABnA0NDVDNvZG+H2fa8btQt1G6LP9nb0VwiAAAAEgAAAAEwRQIhAI0SyNvhQ/YEO5Q8D4ZzIF8qps+uh8TItqY7tneq2pOzAiABIjhy7I/jx9J8p65cakXUUZoAFysduGPiEO1eiJlzTgAAAGYDQ1RHyHxd2Go9Vn/yhwGIb7B0WqqJjaQAAAASAAAAATBEAiBmxI3XQehab1uqrJ0T3vTWuhZX9Hh/cGRUfvEq0DQX+QIgRn/Eh9xLBJr7K+6ncIpYEpb+amD/b6cgVOr2TNu0lOMAAABmA0NUTL9M/X0e3u6l9mAIJ0EbQaIesIq9AAAAAgAAAAEwRAIgPsZMY7yGBb3lzBF/Nve9DdfvS3pSS6eVfEXjmAPr1vQCIFt6Lt6O7CvU37gQ8wfIhF4/LDKFRz4Mfi/dxuULTgWzAAAAZwRBVVRPYi3/zE6DxkupWVMKWlWAaHpXWBsAAAASAAAAATBEAiBQdmLlKpbPZCCxC5e7FoFfHp3r46/vJk0N6aqloTRYwAIgJXLeAI6oxpS0g8V0WtOZbV36WqmQH3/cfojIE7Hzl20AAABoBENCSVgFw2F8vxMEuSYKph7JYPEV1nvs6gAAABIAAAABMEUCIQCkDVsXv00ZtL8CvyWO2ernlFUZ6eXFdRLIPtBQnf3o3wIgVpJa9V0PRwfbyQ50TwehoepDDR3xD3hlgPzxh/OjlWoAAABnBENSTkPJoeZ4yQJfDUzxKdbeDYDwfZejbwAAAAMAAAABMEQCIDjcOdrjVkV1+/nJ3pgmy4bVrlFWaTAhpCTWwB2RvffmAiAzrV3z14m0yuuSv9/bG6jy0GjefrDok5J+7mlO0h1LbgAAAGcDQ1JW1TOpSXQLszBtEZzHd/qQC6A0zVIAAAASAAAAATBFAiEA5HYhvKXWrrMpJbfCcPVoPtvJ08oA7U1W1Zao4FiQed0CIBj5mHZ+2TUc1BCzNwooSoFXqh2IcGnCFKPwzI6LPta/AAAAZgNDVkNB5VYAVIJOprBzLmVuOtZOIOlORQAAAAgAAAABMEQCIAuAipOPwCW7+dnPfE+06i0l1IBO7N6UDS7KoeWnIohOAiBS/Lb7Ee3mYWR6HxmB2BEPXUu+KffuEb5loPcm/Ei0UgAAAGUCY1ZQvC7MC/31ZmZABIA4waunt1JWgwAAABIAAAABMEQCIGczTwR0O5Hh1HyEzt1go1AqYbJ8qYrXaXr+Yt/iYmwTAiB5Fxr3lH3Z9k/Fq6Bz+4/iBqLTVNdnLQdFB75peoqyoQAAAGYCY1babLWKDQwBYQopxaZcMD4T6IWIfAAAABIAAAABMEUCIQCzNAUJhkTVAWTUe4dG0n9BhwT12DGYwr7YiQkEfrGKdQIgVCjULbL0KToQ3c/WDFGhteN6JoU54DqS9wOwbEBUReQAAABmA0NGaWO08+P6TkOGmM4zDjZegx98zR70AAAAEgAAAAEwRAIgM/N1GMtBH08IFdgrwxDVJ2NLCcnzic9G8twWRL2VBH4CID3Hu2TvSsHU53m69WGM3AXFriV8pNBOW4Z98uVgfRZsAAAAZwRDWUZNPwa114QGzZe98Q9cQgskHTJ1nIAAAAASAAAAATBEAiA91sltK55qePo2/nquJnGAfypyev1fjoHcQZiFPRdU6QIgLUH1kEzZ7xDfxzYur2MC6qShgBVCLtRpYMG6KKqlCzsAAABoBENZTVR4wpLRRF5rlVi/Qui8NpJx3tBi6gAAAAgAAAABMEUCIQCWkZxZKvGPqBoUXY/RJ/YJcYFJvSRI/7W69ubYo6zTHQIgDA6Gvftbg1sEMLp9klJCmQAgNbXSB9H1QRiIfQTBMuEAAABnA0NWVL5CjDhn8F3qKon8dqECtUTqx/dyAAAAEgAAAAEwRQIhALoxDCrATVeljlFYNELSbt5ziMSYu9yNq2BqXIXjE+SjAiBQCYZc/2ZjQsQgTWbw02oBvqUM4cNq4C5lsD9rhO32wwAAAGcDQ1pSAiP8cFdCFPZYE/4zbYcKxH4Uf64AAAASAAAAATBFAiEA12lTj66IoWgM0C8LlHsTBpQctntsPBsCAm7o0D9ajCUCIB/jsa3LiYCjx8YbBSxMiKUzlcXnZaMxFz1SLP5GA0AoAAAAZgNEQULasMMb80yJf7D+kNEuyUAcr1w27AAAAAAAAAABMEQCICfQYE8OSN4x2q94ii8Y3jewySQ/tGC6OvfwQ9maY8rpAiBRPH7vl9Nbkj+IEGFkjQfM37ntLI+jplCaMt2p256QeQAAAGcEREFDU6MRCOW6tUlFYNs0yVSSZYryOTV8AAAAEgAAAAEwRAIgbsRTBoCxfSj3yl1/mDAbgQwVzGFbLxc9Vuo5x9eeq64CIA3nc0LzIeqBr08QkU2+z6EeNMw6MXwb2URxqf9BiSl+AAAAaAREQUNY9rplm0GTkrci7WPU9SMoIuzv8mIAAAASAAAAATBFAiEAxp3bU8srEUMy9lf9t/Mj6lZYllsPA33VeFIJHo+7mI4CIG3XUYAQ1+s/wYEVeYv8VaUhf7zdG0OT/TsHLFdqRo4OAAAAZgNEQURbMiUU/3JyUykmN9kFQwFgDCyB6AAAAAkAAAABMEQCID6ePR1oDAOUWVUtlsqkOOV0L9el4ulJ7NM9Q19ic38aAiBgIxRM/Z2Wg4aHloifDm8HG90+qG30zhp98QiWKKWqiQAAAGcEREFESfsvJvJm+ygFo4cjDyqgozG02W+6AAAAEgAAAAEwRAIgAedvWUpGjKx1GZMCJXB8w0hxF7mfq8F+84gUYIPIUaYCIF9rrINMvCgkbtUYuQd0V/BJmoH80yBk87kZzSNLSH3mAAAAZwNEQVgLS9xHh5GJcnRlLcFe9cE1yuYeYAAAABIAAAABMEUCIQCyYSBMlxkX317vk0FDBEAb0VacRmfLCX6h9TdvxTFahwIgcRQS/7I8ylZWZWK50B2Fe/r4T5e6EaqedQRHbHVNJBYAAABnA1NBSYnSSmtMyxtvqiYl/lYr3ZojJgNZAAAAEgAAAAEwRQIhALl8LTWDtT29oLGUY6DPlxmd0cqEj9fYO2Zxqen/dNDsAiAMkbilB3/pgnBv7pndy9qq7ojcA//HhXwO2ZcWpIwxowAAAGcDREFJaxdUdOiQlMRNqYuVTu3qxJUnHQ8AAAASAAAAATBFAiEAs6qXljMoTrD1VFkJkzOrks8G/dWNyQ6cBwAAyOlohkwCIHsQ7H1mCfUd2lPQg6bhZaCr86d+EyUObyYHcoCbSa/1AAAAZwREQUxDB9nknqQCGUv0ioJ22vsW5O1jMxcAAAAIAAAAATBEAiB37sBIIgS0d24z5fJLHNnWDgKXsvVA3Kkoc4kRXcfVVAIgQzkGpTLtdGtiPixihYof6qYYPxhm4VGmkNZRhkrSwLYAAABnA0RBTptwdA5wigg8b/ON9SKXAg9d+qXuAAAACgAAAAEwRQIhAMviFpVyBV6bGJ2cfM+qpR0jlXkR9gpH1Pchgr7ikPIUAiA3Tip1vqg1vgkXRMM6TnrjghIyprvwqLCCSGvS82XE7wAAAGcDREFPu5vCRNeYEj/eeD/MHHLTu4wYlBMAAAAQAAAAATBFAiEAxSF7LX+wZONr5r4SaJeUynDDnbWlXEdpDGMEZwnuxwUCIGEjyeS/ROVmNmq5wFUesd2QHRwzNdpJgNEZNZN/Mo93AAAAaAVEQU9madgruSShcHlQkD4sCmGYJAJOJUzRAAAAEgAAAAEwRAIgMStK/8PW3zn+/Pr2SEtpF7nzT2HdhjiBrdiJUXwibXACICAzbRJ5xaTKSMM3ysvqvLEHVdrt8ZydOr+94RT5mLd2AAAAZgNHRU5UP/In9kqhfqEyv5iGyrXbVdyt3wAAABIAAAABMEQCIHPFBqNLCNMbAxFl3WtSVoJypERM5PzU+8QAhlB4+r6pAiBmGDULtFVoCC0CEVG3hIwt6Y51dynSP3fyL78zcNmRaAAAAGcEREFQU5MZDbzpub1KpUYnCo0dZZBbX90oAAAAEgAAAAEwRAIgM6WOD0khOjQhq2DLb0Mq4wESzGgZJUFHkN4E31rTK2ICIDHyZ6IJWCSuHV5ah0oEm1WWAMIEfVshn6KgdA0mM9cqAAAAaARLVE9OnyhOEzeoFf530v9K5GVEZFsgxf8AAAASAAAAATBFAiEAwCiANi4oCdR4vkSJcYNmTtZ7gL4RukyFzlLCJ64MjpkCICYvDi3NZp5tbfAwIe5lTIqhC8g6KPAS1GQBf659m+S0AAAAZwNEVEFpsUg5XOABXBPja/+61j9J74dOAwAAABIAAAABMEUCIQDTy5x8N0nMdP63tqpHdN6hggP5MesZV9amEG+CJxVddQIgGQme1whTAg1V6bVXzKeqS7VwqyFSDtoLxuwsfFvPn4gAAABmA0RUWHZfDBbR3cJ5KVwafCSwiD9i0z91AAAAEgAAAAEwRAIgM9r80GTgumXs8iSu5v7hrnq7TteqB1OUfsc14OxbxVICIHNwQextC42Hib0YH26wbG/XAZjB6brcprzqF0wCCRl+AAAAbQlEQVRBQnJva2UbXyHumO7UjSkuji0+2CtAqXKKIgAAABIAAAABMEUCIQDEMO4uE7lR0RMtXWNukDKHTKkW42QAbXnV6T+hV4FDQAIgdGml+htbwuUsOK7QHiggkwmHtW//NVcZIftJoLNSpYwAAABsCERBVEFDb2luDPDuY3iKCEn+UpfzQH9wHhIswCMAAAASAAAAATBFAiEAwV8XPXMkX970hsWDxVcfrkaIbC2aapFFnb5w95ayMW8CIHmDJHotJ9DY8+ypOyAnTbon7X6q9SjNJ87CxX3OxzfvAAAAZwREVFJDwgRk4MNzSG0rMzVXboOiGLFhil4AAAASAAAAATBEAiAGf8vuSy+/096ODCtIyj2p4vXwsbeBiYAySwIvMHaXwgIgXo0roEG30P6YxxaYiSSWdIaGaTnYD9NK50DsN5wjuEYAAABmA0RYVI21TKVp0wGaK6Em0Dw3xEte+B72AAAACAAAAAEwRAIgOEcFql41mlQQp/WWA+qpIUIeW2+QycNmufb/ZG3WRiwCIGC/0NF8HcL5GQZoLSCPuhw7hrnomNBl3gRQHOF7ldmJAAAAZgNEQVSByRUd4Mi6/NMlpX49taXfHOv3nAAAABIAAAABMEQCIBmXbb2RnsU13WXaRc5pJAom2/+d0mGYo0wHK8XTtAkZAiAvdg0Fx5L6jvdZyQFjZZ7TuqBywgVoTr8zoRsqXB83EQAAAGgEREFUeKu7tkR7aP/WFB2nfBjHtYdu1sWrAAAAEgAAAAEwRQIhAPN+SGUmB+Alov0glVozVJOICaNCZ/tGUw+4h29zz5yYAiAbnQb1xXU57e+LQMhWQTS8ZjaskPt8jGrVYrVZWw2cbQAAAGcDREFW2C3wq9P1FCXrFe91gP2lVyeHXxQAAAASAAAAATBFAiEAoULCRFpuZYHRGoCGzSEvH+ZCOGuI9+X4QXq7JoEGiLwCICxJYhgVEM5rl7It5G6QAwajPQoNqmiLvtBLi/ImqyN8AAAAZgNEQ0E4b6pHA6NKf9sZvsLhT9QnyWOEFgAAABIAAAABMEQCIHI7kDzSXSmBZ8+V5g3Wys7Tl+ULH6My6i6YtmQNDo0pAiBGQUgQW3/0T9fEA8Y+ns0op1RCzN6g4ZdO+Uk+VzVOdwAAAGYDRENMOZoOb76z10yFNXQ59Miu2WeKXL8AAAADAAAAATBEAiAuAzR7U6LbYmUbtTD6e3nwzDXtu8BFgsC7WZS62D/B8AIgBzXrN1fHOu73ZEkVBQeTdZH8OiX58xxiH8tknDI43EQAAABlA0RSUGIdePLvL9k3v8ppbKuvmnefWbPtAAAAAgAAAAEwQwIfblvXzgLrdtsSiCanTHUd9VIrCKpJ26EwJBSzjMzYHQIgE8raC40RzzX64/BnJKNaV1gRASxloTtxe6yFhp8uRtwAAABnA0RERsxO+e6vZWrBoquIZ0PpjpfgkO04AAAAEgAAAAEwRQIhAICU3q9SNXc8m3hXmQspIdeb4FAbtOpXg0/TgD74f0QiAiBtAK7eVToAeZzNUr2gHb4iCTQRhxOxZSyUHNjznUySygAAAGcDREVBgKsUHzJMPW8rGLAw8cTpXU1lh3gAAAASAAAAATBFAiEAxUfMoe5J2TitISWWLMUwwFZ9QKLQZwCJzX3Uk9mc6G0CIASuHi5hxdNsILai0RG0qJ2jiNeU38kWGlbu8HZVM1YxAAAAZwNERUIVEgLJwY5JVlbzcigfST63aYlh1QAAABIAAAABMEUCIQCk77WZFe2F9GmE9aEmZIslE2InwU73Vri7dVnacipSZQIgQ/3Y+NU6LpwGlnGWQYO4hNHaUqH6gYvcHyStXM4yrnAAAABoBERCRVSbaL+uId9aUQkxomLOz2P0EzjyZAAAABIAAAABMEUCIQDo/r+kQgFzhUrBFv3alIdrUVOgs6WR8R3odhKDUCV7UwIgE/3+CeGvFxPIdcRAIvWfmS6d9+LPRby6cBIpMkZ3vWYAAABnBE1BTkEPXS+yn7fTz+5ESiACmPRokIzJQgAAABIAAAABMEQCIBXjg/4+fdYdW1u4AbjiiO4w/iAWEWfqWHZGRjs64RmTAiA8RmxHFDTnmZGWsIGPlOISSlVzZDiNjuGerNyprZwpTAAAAGcDRElQxxnQELY+W78sBVGHLNUxbtJqzYMAAAASAAAAATBFAiEA3zIdNuKM35UKIkmaUtjrdDHHkv5S6KbZtejU/YdAOHcCIFkB6aNx656V7c+tQQZpu/qDD7WP400r//qsI1YKNv9rAAAAZwRERklP7jubUx9MVkxw4Ut7O7fVFvM1E/8AAAASAAAAATBEAiAmQg119JsrOz1JOSG77JSI5UQBzHYNjnNI4n7WA2uU/AIgHG6dxetbXWyN3iUGo0lxMuCgLNNzqpZxN2JJbs/UnuoAAABnBERGSU6E9CvHyrOTK98cd7sIUov/IKRBgAAAAAYAAAABMEQCIBrbj9JkKvGKgN30oy33VceT3NTCQjWa4Jb4DQKFnaFOAiBTlaPyIr63RGYraAZFyHXj8aiajjc8ZCvWiYvVV9u/FQAAAGYDRklOBU92vu1gq22+sjUCF4xS1sXevkAAAAASAAAAATBEAiBleNeS3N3IIoyqc+1+6SLZH/cDbQ8gamBrlu4/rY2duQIgJ64aiYZs6dSKJqW5gR9M6APIHBr/42Y1oJq88ki2CfwAAABnA0RQSRSUyh8R1IfCu+RUPpAICuukujwrAAAAEgAAAAEwRQIhAN1cfHlYubN3MDuBbRjnGy9NlxJcG09MporjpVVN+JGTAiBDu/PAFSCuJCT94xKk+oYVhWuqvA71dZR5q0GlC0pYpwAAAGcDREZDGyp22nfQO3/CEYnZg49VvYSQFK8AAAAIAAAAATBFAiEA+Zk1pPq/u9C7eIdI9892mv7DQyuZcoSZnZdFBko5MDkCIAS2EGYIHWZ/forq+atPKkyJ0lLeEQsw68KPpPNGaMigAAAAZgNEVFT598Kc/fGfzx8qprhKo2e88b0WdgAAABIAAAABMEQCIQC0UFU6rX+/fTpYqjM0Cj+0pHgVJzUrvUNo80BOglARawIfI7NzCWAJz56xAZDKs+nUChXPA389lcgDXBWaWepJJwAAAGgFREVMVEHeHgrmEBtGUgz2b9wLEFnFzD0QbAAAAAgAAAABMEQCICgEIuYHhOJHglE1yzKg11tynRVB7WDM2KyN4AMneZNLAiBk4s+FhFz5OGps8orp3qfmrIh7WxNwg9imG4Wwjo7hQwAAAGYDRE5Y5D4gQdw3huFmlh7ZSEpVOQM9EPsAAAASAAAAATBEAiBGUt5SDP/FMS0VYMeWO4esDuohOoocwMWagbitdTc8HwIgAd79v7U/hP2lzUe6dZovZOD5lyogA5NaVLuZ/d+Pf2wAAABoBERFTlQ1l7/VM6mcmqCDWHsHRDTmHrCiWAAAAAgAAAABMEUCIQCyRYgj5ZKu6e6azWg67+Ez+0m3OALF0cb1IFsOevvMLQIgBf3cjoz31ir2Iu9qa7XwQnWYm+tt2bVHgxrHjBaR/W0AAABnA0RDTgjTKw2mPiw7z4AZycXYSdep15HmAAAAAAAAAAEwRQIhAOxjAI/jce3wjHMMKlAP1luYcYSR1gVhwyRGlXhDCHhlAiAStkb9VeqfoM++9KVAcRGLKzw7n85m3v4F310iFDKYTgAAAGgEREVQT4nL6sXooT8Ou0x0+t/Gm+gaUBEGAAAAEgAAAAEwRQIhAJnUIiUPgQX1ucQOO6Wo1/1lgIHqt6WYG177WjpYzmAiAiB0z2GqlBMn1HUIY0jrZt7NCmbMoBcGgMuiaQtO/lh0PgAAAGYDRFRIWtyWHWrD9wYtLqRf77jYFn1EsZAAAAASAAAAATBEAiAZrJBDm0a0T65lB+6xcEVixoC/jW68KCDnioVG7OkvIAIgHJYC8Pf4Qj8Xrh1XJSrETkQGsxqKDEABcz7CyfBmhh0AAABnBERFVVM7YvOCDgsDXMStYC3s5teWvDJTJQAAABIAAAABMEQCIHepVJu1KTyxPF3CjCgZkxvRszhAAs2Qe+fpGf6rqibRAiBD5yCsMuLW97hA+/q6IfOude6vfwZpbwDXOr1r2w1V4gAAAGsHRGV2Y29uMt2U3pz+BjV3BRpet0ZdCDF9iAi2AAAAAAAAAAEwRQIhAL6tJU9pcQgR/l7cZbeAFt6TdI034+X6QBLsi9cCQWAkAiAF3qZDQmajA316csyDm/YYIM39ua9eqHn3wOI9DFzfbAAAAGcDREVXIOlIZ3lNugMO4ofxQG4QDQPITNMAAAASAAAAATBFAiEAv0MXIM3UQ3K2iB+0rrFq1Q3NoW6/1HI2Arz8FrjDNcICIAjURf6RYTMQmthx5NxDvO0yN6g3wwF/tFsC24ln7W5mAAAAZwNERVhJe67ylMEaXw9b6j8q2zBz20SLVgAAABIAAAABMEUCIQCXdvgqsVc8UnBSOXtbbTbskUm7c6+2r7GpgVg+6MlTTQIgHzPoE9lw4rB/8PDPESa5VhzRr7JzVuGT4Gq07BQCnYQAAABnA0RYUmXMonkQhydoVumbFLwB9GZMNWPdAAAAEgAAAAEwRQIhAJPaL8GdabGho2JbnGr9GtFKfkylgr/Esg4zjDpt/LbbAiAn11Q4OtVoRsmU97SLFSzcZ/g5u1GpPKGF8hllMhlN8QAAAGcDRFhHRXHzo4bRvRjiXXDRF+cGf6C9nQgAAAASAAAAATBFAiEAvGibVRGtvkuPB+y8jmnQGY0SqDJfnLrIaRZFMGFqzvQCIAFOiod8Co7DyYf2GTEKMnVjXc4P+S7BcPTu7mycuPkrAAAAaARVU0R46yaXMqt1pv1h6mCwb+mUzTKoNUkAAAASAAAAATBFAiEAup6+P8seufLa3lSfnpCHziYB+muXkBrBXImL8FmcUDICIGEdm5CCW53l7qvbUwm69h3HEf0z6wKBtt8UjXw5gNArAAAAZgNER1hPOv7E5aPypqGkEd7319/lDuBXvwAAAAkAAAABMEQCIAy2T34SyOnvNdHKV3FHCWo8KpdSSfnqHwZqdjlnMgyzAiBdKJHJv+RCnQvKCLVGDRR6NPwckss5ETQSM7zJWll6FgAAAGgEREdYMVW5oRwug1G0/8exFWEUi/rJl3hVAAAACQAAAAEwRQIhAKc+/1cB7aet3AEZ6x5epriBpVEy5Rxbzsnq5Ul+3f2DAiAg8+4cy8ZRFhKGvpgha6KfsksnaniK8hrYVMJCrxANJQAAAGYDRElBhMqLx5lycsfPtNDNPVXNlCs8lBkAAAASAAAAATBEAiAIFLBZPE/wh4+M/COZGeMVF7bu1VCR5ukx9MXRYckSvgIgbVqIeDjZqKel/oKkWOG4Iru9L/Vmagfwh9OAbysvq2EAAABmA0NFVPZgyh4ijnvh+otPVYMUXjEUf7V3AAAAEgAAAAEwRAIgAJqFqeoxzTQUIZZnMk8SjPib2XyXtnp/MCWbLcfgh/ACIGOW1/iNAF/dVfZUay39IKpyvSehoxKqTwZ4WI6PJYAcAAAAZwRER1BU9s/lPW/rruoFH0AP9fwU8Mu9rKEAAAASAAAAATBEAiATf/F7xSsUGBUFlY9JVBB4bumPHE3vC99hGifbtnUHzAIgaharAmgDRKstqnPgROIRz8OJKPbyZwTeCnx2FJLKfXgAAABnBERBWFRhcl89tABK/gFHRbIdqx4Wd8wyiwAAABIAAAABMEQCICeKPlaiFAX3mFuFE1/DKoV8iJm8tLV5giyl4yxC5Z3sAiBdvje1DHe1VjfsugjC79v7nfC5SrXbVkORvSIfXA65agAAAGYDRFBQAbPsSq4bhylSm+tJZfJ9AIeIsOsAAAASAAAAATBEAiA+DcGKYxXY5p3ies8lfOql3cmbBV2ZOCcPMB0s+ct8FgIgQoPYcrKZjVDzcZ2hGVSkcH/8IaPkoyH48hBn4tifhd4AAABmA0RSQ6FQ25sfpltEeZ1N2UnZIsCjPuYGAAAAAAAAAAEwRAIgJDAO8/5ZguB5TaahmQyfP38o18M9vOEVkeQJ2Pggv1ACIAjkgncsPVwjhJp4ogzsRKlM0InUiDhsffz41OiKQrEHAAAAZgNYREK57vxLDUcqRL6TlwJU309AFladJwAAAAcAAAABMEQCICfoOeTMnAY7ccZJcDHO/wnQQDNfea2b8gRLQyl0CVjWAiAaikQlCpaoqRhrx0hbnuBtVp9T6sdLVyq0oIPk8i599gAAAGcDRFR4gv3t+3Y1RBqlqSeR0AH6c4jagCUAAAASAAAAATBFAiEAiqrCtNtYuTJ+mMkUGqTGBJP2rqr2e15IZDSlQfYOhhACICl+OQLC6AzQh3JvOK4U6eDhSNigq/78ydWqsam/xXKPAAAAZwRER1RYxmYIEHPo3/jT0cIpKimuGiFT7AkAAAASAAAAATBEAiA4X7outq7wUI4fFN4Yv9ndjK7jo0pUA5WGlLJ/8cJ9/wIger+VdHXrA2NuvgfoathkEzFXRi2RYqbg4MqZePZcPRkAAABoBERHVFgcg1AUePEyCXcEcAhJbay9YLsV7wAAABIAAAABMEUCIQCkGyyBDTodaADEuRbLBy7Ew+9xXsEQ1YbT8l3PC8PYcQIgJPyN9C9Sv1OcuGcZh9XBNBRBrr8pUJgTwLaZ0XzSlBgAAABmA0RHROC3knxK8jdly1ExSg4FIalkXw4qAAAACQAAAAEwRAIgEGbLcQj2ZQpGw3xLTM98FY8eA3r7o/JUMm4h5POqbjgCIEoAvoSlWDRZEyYuX4V2/cuGI1Xx5e59kX+i76tJ+WpWAAAAZwNEU1Ro1TRBwOJT92xQDlUb3qPRAiBsmgAAABIAAAABMEUCIQDvdisEvjktndpYDLenHrcdpv6b7yUiVbUoNyFFmFN61AIgSvzXzpoTAFAncp3I+GDEv69YpODI9YoxgDYf3TLUqagAAABoBERTQ1AD4/DCWWXxPbvFgkZzjBg+J7JqVgAAABIAAAABMEUCIQCbYuqncu89VXJI4VcupVbxJExtxMtqVzPZ0fZCl4H0KQIgIBL41krUSuArph1VTqmxmECJlG2hn3cS5+WZiHA9rFIAAABnA0RDQ/+pOqz0kpfVHiEYF0UoOQUv37lhAAAAEgAAAAEwRQIhAJOlrpC7J9cyScesseJGdhcJXu//TuMh+bSXVw/D3ObdAiBiLrT+eTw5rzmVnh3EMh3xGWLKNyGp+Falo5XyptY7BAAAAGcDRE5UCr2s5w03kCNa9EjIhUdgO5RWBOoAAAASAAAAATBFAiEAweEJRpdtpsCqaEeaJTIOPr+gKbrJ6DCw01z8kttMtkwCIFEALxyj9gEu3+QXqVQRhbyXcDRPBtVMELlpRo1YNOlBAAAAaQVESVNUWEtHAfP4J+EzH7Iv+OK+rCSxfrBVAAAAEgAAAAEwRQIhAJmnxZJvepZ98RcKVeE7lO8sqwQHTGwG9my4lBqy9goZAiBLCUyubvs0V5WgBmpm9OLa4eY7a+B9PEWf8SMFtBTHlgAAAGcERElWWBPxHJkFoIynbj6FO+Y9TwlEMmxyAAAAEgAAAAEwRAIgIXDY6OkUrW6y5vthnb/26NNY+5UoUfcWZ3P/7akqvxACIGh5IboaO3rIGOUmiUCnJotQcnL66ONJr/LCKm35gtMKAAAAZgNETVQsy/86BCxocW7SossMVEqfHRk14QAAAAgAAAABMEQCIBsmZ/LnVetYcMmFAn7NY87CHnGB/0wZsP19uJGnfEkEAiA+MOWWXI2dMObyHZ8N58RyerxLCcfIOPsSSmVpBhV+fgAAAGYDRE1H7ZGHmRm3G7aQXyOvCmjSMez4exQAAAASAAAAATBEAiAVm1fZLjWNcUctPxAH1+tKrq45HYfhfgWurSwBEnh+IQIgUHwC+Nst4K7WLGRMCPJ4nae6P3D9xGlYAShn0GvC45kAAABnA0ROQYKw5QR47q/eOS1F0SWe0Qcbb9qBAAAAEgAAAAEwRQIhAIoha6pAfFJo5GN4Re2QsiIiVuJtia72CvvZHSfgDW9SAiA+M3gQBEgysJeQUbZ5EIZvmR5rbQmXcSRMUI7TfIqBmQAAAGcERE9DS+Xa2oCqZHfoXQl0fyhC95k9DfccAAAAEgAAAAEwRAIgVlwu099L0wtsgVoBNzkpkjY8OaYwtOZ7atja3VVLM8YCIAQUSI6ox3KgsmQBsBy3dE+Yzv88qguZvG931UGzt8ntAAAAbAhET0dFQkVBUvHTKVLi+7GpHmILD9f7yKiHmkfzAAAAEgAAAAEwRQIhAOUsHnoogsCwbhtGOre6puZEWdsAftFrPB2QQ0j2W4ImAiA1OvGUYy1E1/NHfmeUQPBXcvOspkLXyRRiEIorrXon7QAAAGsIRE9HRUJVTEx6prM/t/OV3bynt6MyZKPHmfpibwAAABIAAAABMEQCIE8Cb6K914QVNt9DDgY+vifcQuGlUv6UHqfqlrqGSF6rAiABL2AOQtUSqPYmMglZTl31VxjSAbTwOpapnLvsRDPisQAAAGcDRFJUmvTyaUFnfHBs/s9tM3n/AbuF1asAAAAIAAAAATBFAiEA8ZNUgrRWKJMU0kAv3NAQnuY3/yXyNhQMYMchoKxo/y8CIEoaSrz8w9C3AO1j8GPXABJtJKpzroVsISm/VNedhwPnAAAAZwNET1KQaz+LeEWEAYjqtTw/WtNIp4d1LwAAAA8AAAABMEUCIQCFRCFAmYSYU4LXlxRkogdqbnbLQjbIBtdNZgx/rzIXqQIgf8Efsu/vfQCdQ6pNTFjL9lGn2oN/U1WnXH3pt8nugb0AAABnA0RPUwqRO+rYDzIeesNShe4Q2dkiZZy3AAAAEgAAAAEwRQIhAK/zoPPPPa0ic4sTADL09JlgeSDaJZqg6r8ZyeYylPNlAiB1xR0Mco1YYYbtMd25YajnJL8SbFCnnQROrHVwxzC28QAAAGcDRE9WrDIRpQJUFK8oZv8Jwj/Bi8l+ebEAAAASAAAAATBFAiEA5oOhQH6gQQqH7gY62/puP/sUtx8qsuqEGnq1+dOUQWwCIHwm73uzfueLIE9L3WH7p6KhfTMtvo2wTBkVZw+ySFAvAAAAZgNET1d2l0x7edyKahCf1x/XzrnkDv9TggAAABIAAAABMEQCIEGLaa7gZJoh4SghEKSfyf+68PGdmEJAZ2Xb319SzcobAiBvYa9MVsC1zj6bsHO5a5WwMPn3DpgcntqTVsXEuUs8+gAAAGcERFJHTkGcTbS54l1tsq2Wkcy4MsjZ/aBeAAAAEgAAAAEwRAIgX0mnOZPLAWZm4fTkXoUhdfh/yhMouGgfTQFRIYCa3qkCID6y4tXuUuCGLABO6JHIfPcDAOfuGed5ZyNq3HaPRWXaAAAAZwNER1Nq7b+N/zFDciDfNRlQuiozYhaNGwAAAAgAAAABMEUCIQDYWmYcCxg4axnOERAAz+Y0ekh+FhTJtglRXdy59B9uDwIgYUvKtmpB0CFni+1RHMnbqaelCeEFaHteo/1c1EZjBCsAAABnA0RWQxlFJDVfJq9mNGjUmW8gepGMc+ATAAAACAAAAAEwRQIhALKJ9YFZeD/Sm3RLL8KfskuVlIlavtoG4CmyN87EOoXhAiBoYqahZ/CElA3g4Y/xaTw3mIJDhBpqeCLhRhCdR+1L3AAAAGgFRFJFQU2C9N7Zzsm1dQ+/9cIYWu41r8FlhwAAAAYAAAABMEQCIDcrmt8a77y2eLS9xVT/nEcI3uu+OqKrJiUovbpBXPKdAiBDw+5XkCUzkS7E6FGUfHWcG1jF6LiQiw5VW+1uGZVPtAAAAGcDRFJDH0qVZ8H5ioydfwJoJ/CZtBouVNYAAAAGAAAAATBFAiEA/huxjVmfEG11vJGJNSKb47w5St8rgs+vBm+1KfAiYecCIHKag/obrrD11/j+DkwCuRLu7lxkPdrQi5DAB/Rkuor+AAAAawhEUkdOQkVBUiI/tcFMAM+3DPVrtjwu7y10/hp4AAAAEgAAAAEwRAIgTMSgWsu+5isaXATPyGeijs8b7aLQ/t9uRWsPMs9+j0gCIAzYegwrP/1UD5zLVUZZUt5iooTXbaUFZnKE/Ui6J80pAAAAbAhEUkdOQlVMTDM18Wr5AIv9MvHubCvl1PhPoLnaAAAAEgAAAAEwRQIhAOLS0Rym1ZtLRlj/WMILa3VtQLMMkZqr1GlvP7dVkw/kAiAnHn0qy3/ImG9d7cLqpdMKPEEphYBAYbXcA38JsUrRnAAAAGYDRFJQJ5nZDG1Ey5ql+8N3F38Wwz4Fa4IAAAAAAAAAATBEAiAZt/kyn9urRXbe0PDewHKHNpGhAFkeqmqsbh4crgWWGQIgTDRd3YTQWxcj3jXi/8AYMcCZF52JhXHZddBQVe4EE1cAAABnBERSVkhi1MBGRDFPNYaLpMZcwnp3aB3nqQAAABIAAAABMEQCIHoWQQBFg3sK0SZuBrGFs5UkN9MNK6e4npnJI5HP0NwsAiBKCklTezwssyKqNcvGLKOl+6Kr8Exou6AVJ2ZvhZiZdwAAAGgERFJPUEZyutUnEHRxy1BnqIf0ZW1YWooxAAAAEgAAAAEwRQIhANJKUETGk9JvQrMLieshRDcgRW6rIqSwHsT6sBV1AVEHAiBtRnf3Ei70cEZZloNOHnFKNQpSGOywXHW9zH7QIoA2MgAAAGcERFJPUDx1ImVV/ElhaNSLiN+DuV8Wdx83AAAAAAAAAAEwRAIgLpgpSZt1YQaIaDV588+AxTWG04RpIugYTbyF5/AduRUCIBHXlHK82auwnTNdStbrQ9K1psBkxwZdfcoLk7hO7wHIAAAAaAREUlBV4w4C8EmVfipZB1ieBrpkb7LDIboAAAAIAAAAATBFAiEA8XKgi0kStFoFNQhraJaqfo5PL3XXSJEg4BepMc3KspECIGrQoYMz82CoJkPHRB0RHzwoAqy+l3ts91M9rYwdWMOaAAAAZwNEVFLSNL8kEKAAnfnDxjthDAlzjxjM1wAAAAgAAAABMEUCIQCw85tt7UcfgUoxBMe5Fcdm/M3/YG4ozO4pDSQBRBNEaAIgfMmdiXZPy31wjKjBKAl4ZGuLENlCA0nyRH510DHGcdgAAABnAzJEQ5/AWDIg60T67p4tweY/OSBN3ZCQAAAAEgAAAAEwRQIhAMn6+Vq3TBxDEtr0shRbGHKYL5062tTeLCN8JhpZIlNeAiAJwMKGRCSrIEmkLggRThPCQxYeK+OhMvpW+Y3B7oYImgAAAGcERFVCSe1/6njDk897F7FSqMLQzZesMXkLAAAAEgAAAAEwRAIgW1rzII+6MnSST1THnWNB7tOXUfUIexP0VTIFrDdOJL8CIFITkzmfnXUQDlaZjH7/2LmF+wyu3dx2TYfMKfXBBMe5AAAAagZEVUNBVE+hF+ocDIXO9kjfK29A5Qu1R1wijQAAABIAAAABMEUCIQDt2lF3TL4T1qvgZ9wXEhK2BKd4MkM4mb1q/7T2r3DGagIgTlKoKA2KTTksFVDosXsFANQ7Ydx1C19wPJOCiwjoaZgAAABoBERVU0uUCi2xtwCLbHdtT6rKcp1tSkqlUQAAABIAAAABMEUCIQCwoZrMflQQpoESaJ0MEycavh6l0WoOz/2wXeLpn4xsRgIgYR0pn03pwYNbzfq/3jiXKUARq+k0Cx2gppoalp0b/gEAAABoBFZET0OCvVJr23GMbU3SKR7QE6UYbK4tygAAABIAAAABMEUCIQD68rrVAwFgA26FFgS14Qqxwg3dx+dt5APEJS7RyYBfiQIgfnqVRgNHNIgsVbPS8Ie3zyaTmX3qnvKwbgoByo4uUzcAAABlAkRYlz5SaRF202RTho2dhlcniNJwQakAAAASAAAAATBEAiAAw92MKhMK1CexbkaT5qd3jI/J2k23gQJ7PMMp5J6RSQIgcCYipPd68JfUdjrHtLySi3qPm755kEd27+MVaIiW0UwAAABnA0RYRKHWXo+26Htg/sy8WC9/l4BLclUhAAAAEgAAAAEwRQIhAO/pPh9VfkebLRScTJllSWmt4gcb7CQliva3V0sHOqknAiBu/5i+8vcL15kFOlvg9DzKtY9qIo+Gokx+i77hwjJ9jwAAAGgEZVhSRGRo55qAwOqw+aK1dMjVvDdK9ZQUAAAAEgAAAAEwRQIhAO78iHYMMDfFYZRRXi9UVZin2tghgIUNyNH6howQ6RxCAiBca/BnbbVv3CUZjEc/0Pw+bx1GwYyxYvUdkwxJdGdd2AAAAGgEZVhSREcC+JZXc5h1nV7IEVwg+ZpzF0eBAAAAEgAAAAEwRQIhAKfcf8aeyYijDU+LNhDuhGsQC05j6DJ+gbrgG8yIlRXeAiBtwKlEurptiqjDrupCT1zOcd8dCuj48MpJvzRCYSihjwAAAGgFRTRST1fOXGA8eNBH70MDLpa1t4UyT3U6TwAAAAIAAAABMEQCIDYN0xxaJhY6LvyCS//2k5sa8LWFEjePwij9RGnIecKTAiAgG3FqvsQdI8whzm01/t98dHZQheRuBz4hGvGfvww2DAAAAGgFRUFHTEWZTw3/264Lvwm2UtbxGkk/0z9CuQAAABIAAAABMEQCIFXR6RghugwgDNoA5d9KsTXjP+DCPer+dR3ftDJCUmgFAiBipDCtYGCutn3F4smvGe3TVLXEVniiMvMIAPlyqyv4jQAAAGkFRUFSVEiQC0RJI2p7smsoZgHdFNK956asbAAAAAgAAAABMEUCIQDojFAk13KIF79doY7GBDssFGbHq7QXh/LElsLQ3PgIsQIgfVwr++riCu2ib95EHrC42/LVG8x6eHHRDlisl4N0nzoAAABnA0VIVPnw/HFnwxHdLx4h6SBPh+upAS+yAAAACAAAAAEwRQIhALZ1uYUUh8Ljo6kAuWiqvM+zwmow7Yqz4wxsPECPJeeDAiAU+vhd3zFBoIrE/aBuQf1upE4bEQFazhK1R+58RU6MpgAAAGcDRU1UlQG/xIiX3O6t9zET72NdL/fuS5cAAAASAAAAATBFAiEAyZ+xleoB5sDFbQ87vAyGyOUbiYbUL7TphEsTScHJIAMCID3Qnl6VozFQmbUMOsueJ9CPGdPS2lmAEMclMqC+Dzx0AAAAaARlQkNIr8OXiMUfDB/3tVMX8+cCmeUh//YAAAAIAAAAATBFAiEAzgd637bJ6waKPxRlFOfobdyuHRm6AJthLjx10mctEPwCIGrLYJaWz7lLoRokLF1hRfB1/uLoe29scDKRu9lrlxzCAAAAZwNFQkMx89nRvs4MAz/3j6baYKYEjz4TxQAAABIAAAABMEUCIQDGY09a1ZtPEvcD6C1kzBhRVZxRm6gGU40lx6M7KuS5nwIgLxO5GTsxdWLhUZaBNyT+IEq4SRj9CX1+dh+7UUCE5nwAAABnBGVCVEPrfCACcXLl0UP7Aw1Q+Rzs4tFIXQAAAAgAAAABMEQCIC2sCHpQmyc41+DC/pRHhObaei6yOToS7kPgdtLOpyOvAiBEzT9CQo2Zx+YUHIVPSiu4GcvaItXfi/8SK1h0Am8mvAAAAGYDRUtPpqhA5QvKpQ2gF7kaDYa4stQRVu4AAAASAAAAATBEAiAl7wvPvmZoasg3cVT+dvOsZfABcF/2MZW2WgwkKuu+GQIgfvFt7ajxIYHGWfGlgLObPb4UmXHr4Q0GCEP16lD6tlMAAABmA0VDTqV4rMDLeHV4G3iAkD9FlNE8+ouYAAAAAgAAAAEwRAIgL36J9Aq/4wa5PSjdvKwBAwGXrudGpmlEnp+8eis6HuECIAUswKKmYBI7Sv8b+b2yRC2uIPjqQflht8p9iWGjfgtCAAAAawdFQ09SRUFMsFL4oz2LsGhBTq3gavaVUZn58BAAAAASAAAAATBFAiEA+oCmplpyfJivt1SQK7P/bKZMUFQikDz9y5zkD8SR6oYCIAz2Hq8NvpW7EfUxwFw+bnKs+NfOqXXyZBKFH1u5k5QoAAAAZgNFQ1CIabH5vIskak1yIPg05W3f3YJV5wAAABIAAAABMEQCIHRzEOt5GOlNSJyGysD+Rzq+EMrfaECpoKFaSX6RHrwAAiAU9iqfxqEG789oDep0tGWPO/RF2JhGhYV+HRMV+DYYvQAAAGcDRUROBYYNRTx5dMv0ZQjAbLoU4hHGKc4AAAASAAAAATBFAiEA0PDXsXcN/OLahHR6zfwny5jKTpb1CRDf0exIZcPsDjsCIBJZaQKAMMzA1BK+xiIoYaj96ukAZg7rvtfazbJfwnkAAAAAZwNFREcIcR07Ash1jy+zq06AIoQYp/jjnAAAAAAAAAABMEUCIQCZpE5f8dRoVBgbr7PAJfMkUncptQstuZxj9HCMDwsZawIgPK2yvGJUpwxVfwpk4lrQukC+hhMcN4JZ6+YnCcotpXwAAABqByRFRElTT07tWFadUWpb03Qn69WSpmGcDFgZUwAAAAgAAAABMEQCIDyxQzXO6+lHCd0/IMTvwbrCV+KGNSruba/ms2VGntcRAiB1a8tkhmBF/GOo8wdnPWc/yuhs+K256CVFjuvoqeq0uAAAAGcDRURVKiLlzKAKPWMwj6OfKSAusbOe71IAAAASAAAAATBFAiEA2dDaT1znfKhUHol+pmPF7AQ/El6xODg7yMTRqMIR1cACIDy2x9m4EwMmcH/sHkDsoK5+KdNPh2CdThZ4W4U3cUbkAAAAZwNFS1S6sWXflFWqDyrtHyVlUguR3a20yAAAAAgAAAABMEUCIQC9VSCjUn/cdLQ+IahYBwGB0Zud7igRuVCKpoaB7HUDRwIgMBr7B0vltDQQf97sd+ufQSDU5Cx81SSKRE6jwgd1OUEAAABoBExFRFXHQfBggqpH+TcpBwrQ3ZXiI72gkQAAAAgAAAABMEUCIQCZ+6dETQHubzNNUPseeBbE4tv5beAm83jTYFw1/bh49QIgZ13uZohZ+zyvlGOKZw6zoYrQB+2wAqL++l45AJVEn+YAAABnA0VEQ/od4u6X5MEMlMkcsrUGK4n7FAuCAAAABgAAAAEwRQIhAN4Ov1HKuQ11gQtler1p44PsqliuToMtGNhh3wTiVxGWAiAz5IX9hFUnM/9AWbDKfYRJCLGmR2FySTxGdp1p0sxtcwAAAGcEV09aWDSVD/K0h9nlKCxas0LQii9xLrefAAAAEgAAAAEwRAIgGwWGLf1a+EJsARVKFIZIXCbt067RLeoV0w1ikcUxqyACID7KNd4wTmp1KoeWd8QjD6LzC/KAQZYNRo8SAhDGGrJgAAAAZgNFR0eZmqZIjwduZ2VEjwkKuoP7tHD8mQAAABIAAAABMEQCIDhZuvheYk3ridxZjzgX+64uzRynGfVESchRO/x+8HPLAiAsFo5SpIjEctE0yw0V6Tk4WYTXKsroS8m5IduLdGt8SgAAAGcDRUdUjhtEjset/H+jX8LohWeL0yMXbjQAAAASAAAAATBFAiEA7xYSpu4Xrit87S/mYpk1ds0q6aJG1dcdn7bRrNH0RkICIClbpGW5ha0EPFubSCsRFRADf3cywHf9E8ptQv+MVG2aAAAAZwNFRE/O1OkxmHNN2v+EktUlvSWNSes4jgAAABIAAAABMEUCIQDlQk5FH9SxfokiHwAVh9iiRksoyv7eqMITAQd+cN14SgIgGfNM4WavAnzXjo62zsE5xix4kyi1A02KlYzPXQc3xNMAAABnA0VLVE7NtjhfPbOEf5xKm/P5kXuyelRSAAAACAAAAAEwRQIhAJcS4uleEKAwfbVAtT9Tlxy5+M2N8D8Z5xvAvHt3MRh9AiBf+8BZVGI+GAxgKZmHaDvt0fMHYlRs6L2IR7fkrwLecwAAAGgERUxFQ9Sf8TZhRRMTyhVT/WlUvR2bbgK5AAAAEgAAAAEwRQIhAJ9Z8PNWle1gbpBKEbMuBFQ20gp8iZgzknpqSko+ot1wAiANsEVV93/3tA7FqUvvI+P5qIxFhD8YqLeQ7FB7Sk4JggAAAGYDRUxGvyF5hZ/G1b7pv5FYYy3FFnikEA4AAAASAAAAATBEAiA6MWdvv/tt4CfqFNClpenwdivsdq/NvaofB6XOP7pH1gIgMTo2kZqu7tW2H5HJOcfZs9iDebV6VvUqwLOAn5662a4AAABoBEVMSVjIxqMaSoBtNxCns4t7KW0vq8zbqAAAABIAAAABMEUCIQDr/wmVsLCRpKka5Zrg0GOK/c6lneI9krcAjfernrB6wAIgbJb1g1aQlohGWr0xwYifDl1EHIlN9yd/HoqqfDFsz54AAABnA0VSRPmYbURc7TGII3e11qX1jq6nIojDAAAAEgAAAAEwRQIhAPqRa+GFRQbUGutPhFrV52A1+36CFe+8jok0BJe4CIASAiAG0DB3uQsZ6BkMCal/9wtKffyqCVsyaeTy5Bzwu5liuAAAAGoHRUxUQ09JTkQZekxE1qBZKXyva+T34XK9VsqvAAAACAAAAAEwRAIgVEStTBunQkFF3hJOSAyrqGAsIEHOUwdRIpmKkfnkTKsCIFSWH6dPhLiNkXOMj5o//YXhMsK/9LEj9SRKULuvb3OdAAAAZwNFTFmpVZLc/6PAgLS0DkWcX1aS9n23+AAAABIAAAABMEUCIQDCKKh+ZwFGSJpuIGJlpTTrqZu5C8K12mqJ/sLrotcRSAIgQCVjO5j96y6Vp2Dr61gyUDryMp659Yw/K5ufM4YDFdQAAABoBE1CUlM4ZGfx892+gyRIZQQYMRpHnuz8VwAAAAAAAAABMEUCIQDmjRbWFtt7q2dBvi1JnbqY1q4uwstkl+nBeYQn+OKdCwIgEeve6J6NfewnJ1QgPQqE9nrryknlSLkpqsRn5dKZHTEAAABmA0VNQtsKzBQ5bRCLPFV0SDrLgXhVydyNAAAACAAAAAEwRAIgCSh4XqNzzJOe+BU/zdxNiIvBjvry/GbaJL97ylSNL9MCIBGDTItfwgd6bzPVD/J+QTj8TQe0cjmjiuQQNdRsl0iaAAAAZwNFTUIouU9YsRrJRTQTKdvy5e9/i9RCJQAAAAgAAAABMEUCIQCgI92DRnpM/tAgiBBa6SJt4qbH+sYyFqxzDPSU6nQCtQIgA76LxcLUez7mPDQSE7Bw79F3u3sdWzUlKMFYP8iq6yYAAABnA0VNVrgCsk4GN8K4fS6Ld4TAVbvpIQEaAAAAAgAAAAEwRQIhANvXe+rFO7ZOmIls2I7GeM1Qv4B2ocavda18anrqwRQ5AiAZCzw5quCxPSaeWAqmMqzjdaGD53Bnj34mKRmY/rSozAAAAGcDRVBZUO5nRonXXA+I6Pg8/oxLaej9WQ0AAAAIAAAAATBFAiEA2eT4keah94EXDQtovomHBscWGpvIrSp5kbAUCU1OwJgCIB9qFRw5AVVXPKN5qY95txQa1bkzh0pHD7o6ONSzVAQHAAAAZwNFRFLFKMKP7AqQwIMyi8RfWH7iFXYKDwAAABIAAAABMEUCIQC3arPXe3lcE//sAhuhTjfFWVlqpzdXwwbQog97ot4bWwIgZnnQzHlEHko2FPGqGmUFBdMSI7n4lOOsGs3RynxmyX8AAABnA0VOURbqAay0sLyiAA7lRzNItpN+5vcvAAAACgAAAAEwRQIhAKjmOfWl8lKCQnsSX26Qb50hA9Ev8oygFyWIex07QWCaAiBSYMPjMMVlUUnJtcp7I7P7CW1KXvB/uvOrQ6NqcwdqFAAAAGYDRVRLPEo//YE6EH/r1XsvAbw0QmTZD94AAAACAAAAATBEAiAQrowcbCbTXFHNGlJ/xJDTNopyuUPfUzX9i+k+niqdkgIgH61Ez5i38Llxgs97O8zxObAqwerA/3PEcwg/wDpgNCMAAABoBEVXVEIXjIIPhisU8xZQnsNrExI9oZpgVAAAABIAAAABMEUCIQCknTBOPwEvAA5GY4rkhXrsIGXlhmYxJI3p4r6dtDqVIQIgKbOKrqEkfDOBUCZCF4OC8fxa6Z1htwowlak4EUTXYrwAAABnA0VHVF26wk6Y4qT0OtwNyCr0A/ygY84sAAAAEgAAAAEwRQIhAIJDo0EVqRh5rGnzou0121AqJbytTlfu2qpFvMKTKqBfAiBwUsKVYGZJYIVUHxIy+FfDarXAhBo1nEH2HqyiIR2hqgAAAGYDRU5H8O5rJ7dZyYk85PCUtJrSj9FaI+QAAAAIAAAAATBEAiBZy2NalwDvylDdqo1x0ZbUMGopt03uG85ebkIdGEZNVwIgRdU+CxW8VFqcinkKQzlLdCegDnv4GatkWYx+EN6c528AAABnA0VOSvYpy9lNN5HJJQFSvY373zgOKjucAAAAEgAAAAEwRQIhALejRxDt1bZvNFlFj3L25tXeWgdDPi6kOshihdimZvShAiAcIYIsuH70eMU1lSbjKdBAOqHdNuaFZ9QlTAxh9pLlfwAAAGYDRVZO14CuK/BM2W5XfT0BR2L4MdlxKdAAAAASAAAAATBEAiB6+HFZPlstIMs931WaEIF0p4RMTxsiODjFh3oL08Z1UwIgO+hINAIJpu4GoCDBdZ0BED8GDXyUA07/EeBNIstbYPYAAABrB0VPU0JFQVI9PdYbD5pVh1miHaQhZgQrEU4S1QAAABIAAAABMEUCIQD9QA1EzKdQbjfTazec03qAP81fv+1eZaydk46aQyPQSQIgPmO9DytHfuwFduphq06TtXaT22VzI6VAIbHgDdg6P9sAAABrB0VPU0JVTEzq1/OuTguw2HhYUsw3zJ0LXnXAagAAABIAAAABMEUCIQCd/UKfW/kfbDXvoNL97A52XZdLL42KbpFGkf7gRgi5ugIgEwHbkhlCenRhnAwnzamO/WsQNlLrkmmkIJtVM31qflQAAABqBmVvc0RBQ36eQxoLjE1TLHRbEEPH+imkjU+6AAAAEgAAAAEwRQIhAL2RzBVFNt57pkmt9/ixEk1Ij6Dwu1XP2EVEL1+NcjlsAiA6EVKV5cuhTGrvmf9wcSwGPsnenErtE073nWo6yYYWOgAAAGwIRU9TSEVER0WzjyBmFTJTBt3esHlKZIJIa2t4uAAAABIAAAABMEUCIQDX/CXn2lhVHFs09PEWET8/jzji9ThCViIQeWJ+aDaRFAIgJuTYe6gf9Bw5Vr3oEcfZhzPmCLFeeAwitbjyxz+WI7kAAABmA0VRTEfdYtTQdd6tcdDgApn8VqLXR767AAAAEgAAAAEwRAIgYtCzh77PEeGOyPZOjuZSphVYETILyTZlzgmCTRL8ORMCIERGOCHgrhEfpVRdFoDPkgw27qEjiaBHn7aKAS2RKNUeAAAAZQJFU+8TRL34C+8/9EKNi+zsPupKLPV0AAAAEgAAAAEwRAIgBDpdU8e1Ewa/9bNriRgHK3gUCVDPAoroxTN0UDq8Nm8CIEPIKA2NJLBRvWpYqXUjOUeFXYlpzCJ3irCWloveGP58AAAAZwNFUlSSpbBNDtXZTXoZPR0zTT0WmW9OEwAAABIAAAABMEUCIQCCVc2VwIgPpoFUTMoRI3eUo+VWo7Zh1XW0k5NXnQF2BAIgB7k8/qsGlVFlUP9/IEukvAaIQhOTnSPhWyZU6T6UX34AAABnA0VST3TO2ncoGzORQqNoF/pfnilBK6uFAAAACAAAAAEwRQIhAOCvL6MPDgNNxWYmQnLkASlMaqBQp5zXWuL/nel7+3p7AiBBBvG88A6olBAuwWgZqy4lHayRy1uTEg1ZaRiZTVlB9gAAAGkGZVJ1cGVltnc0Uh6rvpx3Nynbc+Fswt+yClgAAAACAAAAATBEAiB9NSm9O5UG3tKdgEZzBBFIeMDPWN++XglVNPvn89tjrwIgTXoQC7yTGIl4MUMcIptoKqUI+ZtyB9P3E737ozdDixMAAABnA0VTU/wFmHvSvkiazPD1CeRLAUXWgkD3AAAAEgAAAAEwRQIhAII2taydwWgNiRxoBXksLe9C4LP33MVQAaFdnffpvRoYAiAuFOKPsuprQyK8Q6AtcoSi6Z0dQt9gFrwXUIiyIZELKgAAAGcDRVNa6KHflYvjeQReK0ajGpi5Oi7N/e0AAAASAAAAATBFAiEA2f1CLyrDc2+QHRVFY+nwBxkdqYJgH0xpxHMay94HEPcCIEm9KEQ0o10ocn61PcnsdKJxx5T3zEiTGLAMDSOH/Z5eAAAAawdFVENCRUFSo0Dwk3qMANsRyDzBbOwSMQFg8LYAAAASAAAAATBFAiEAzhfYy+7G7jM9hJwfAMdGrApeYnz8i0IKxwkYw+E5LGgCIFo8epJkJCR8bWQjSzclMXiJ2AW6uxzWNGkR7rhi09xzAAAAagdFVENCVUxMl0yYvC6C+hjekrfml6HZvSVoLoAAAAASAAAAATBEAiAPcNnzZ9NYV6fUDqoLgCS87X6rbGlPfvfHfm06gEMJGQIgBODPezD/qKN5B0jUwke91vrbUXCPd8EUzoGTOusg1OoAAABoBEVUQ0jddKejdp+nJWGzpp5llo9JdIxpDAAAABIAAAABMEUCIQCXYArRvlYiTlMxUscRdAB4jmleja3WVLqefZ/kGx6iegIgMi3XGPQ1n8+GrbeBfDZXvEfGvX/0cNlGjIkevyEYLIsAAABsCEVUQ0hFREdFV+KwjnSyssBB6Le7tIvxzca4r7YAAAASAAAAATBFAiEA5KmkRtMltnbOKW221s/t6Ermbfn4EBuvOMAgHV8dEScCIBiOWzw5OD/bjpZu4s6pp7+e3kJibbIhiSTC/Dfxrpe3AAAAZwNYRVQFTGR0Hbr9wZeEUFSUApgj2Jw7EwAAAAgAAAABMEUCIQDp6U7Aze68TEXAITUlMHui3Wk8LMtS/vHxQAzS6TwSoAIgXGeWbnUqFlLQhbFsyCBfv3UwanJvebw8Prp01BAZuOUAAABsCEVUSDEyRU1BLFqZgLQYYdkdMNDgJx0cCTRS3KUAAAASAAAAATBFAiEAklghbDn2am1H3IaaipXqzH1rOOpqiHw0WhAZaC5wTmcCICwx49U2fNMGfZbmpfGAqhbNQr/5lnH7s/edWoKAbHNwAAAAawdFVEhNQUNP7w/aHUvXPdwvk6Tkbi5a28LWaPQAAAASAAAAATBFAiEA40bO8hslBt/sajI7i/5p/tD2FKqnnxyQT7F5xrRZ0OcCIAqJbtmoWKUS+R+pg4rt4s271WEIEZCXLFsqcWBp5rNrAAAAawhFVEgyMFNNQZ6kY+xM6enlvJz9AYfErDpw3ZUdAAAAEgAAAAEwRAIgC73+MDvSXicweLxtId2eLEU6O1e6Ku3FBNCupcmUWV4CIBUtLauJEql+JxvPjZBzduPz77gSAFFjtIHNA7i2l04XAAAAbAhFVEgyNkVNQWFIV8dVc5NU1orgq9U4Sc9F1qQdAAAAEgAAAAEwRQIhAIjxzxWVgk4a9+aDswP2zF2AShPBSncNIOqYUA+0C46UAiB/B+UsULBYY2A0MK5YbcxtaO8nAePNh1M44sTrRrnZPQAAAG0JRVRIRU1BQVBZMWsTuVHv4lqtHLVlOFsjhpp9TEgAAAASAAAAATBFAiEApsSuqgNQGACKblzHW+GQu4Oyc4cnNvzxLinudYKTg/YCICQ2wBqehesYenqAmTfuAeWnn0VW3K41P1ZgN2mEDyQVAAAAbAhFVEg1MFNNQaNg8q8/lXkGRowP11Jjka7QiuPbAAAAEgAAAAEwRQIhAOB94gOPtNH2yoWqgo/UQ7IpmvZjBkruvqpCCoMjCs99AiAnOfo0bawrLmZLaS2D8vq8gOzUOeLwsD2//VVMSxryWgAAAGwJRVRIQlRDRU1Buf/guO4tGvlCAv/tNmUgMAdIpNgAAAASAAAAATBEAiBOCAX531UHDyIecbpUnhD3gbtIQzC88owf9idd/w2mVwIgRc/zqifJdusoMzHZN+XSaMadIlPlp1gUmeEAhItsLk0AAABtCUVUSEJUQ1JTSb9wozoT++jQEG3zIdoM9lTS6atQAAAAEgAAAAEwRQIhAKfrV7HD9OzSt19jWSHhf2v9BUufnQEIf+CN2gK7fn8/AiAJNJUOsyQkaXRM4cFwkJme68bQpMCiaTGimMFgUQXVFQAAAGgEZUdBU7U6lry92c943/ILq2wr57rsjwD4AAAACAAAAAEwRQIhAP5CyDjybhGpjSCcNBbZy/rwR6Ne0QhJ1ZwIeQNAN4SDAiAlN7jRA97sm48/3F6/tVcOHAQGLE90DlX3aJp+btReAAAAAG0JRVRITUlOVk9M8eXwMIbhwM5V5UzYFGvJwoQ1NG8AAAASAAAAATBFAiEAx8ChansJJwP9eKOX3GZdk2PY+6cK6upiTwI8zd/XDcgCIDj05+qFEca4p/QiHLN5mxCEzn/PWIw4sjJGw8mDpLg7AAAAbAhFVEhSU0k2MJPgGJnBBTLXbA6GRTeh0mQz273bAAAAEgAAAAEwRQIhAPFanbdba4NiwLNJZkoVnxwic2UqVDg4RAKwf87tqRdoAiAzLNotk+YGVEYFKbudCPpl3jdUOW2qHFzxoOxyJ7pWQAAAAG0JRVRIUlNJQVBZE2+uQzPqNqJLt1Hi1QXWyk/Z8AsAAAASAAAAATBFAiEA9VcKuFJVl2PH+awbgqSny/Co61xbLcAfs/x//kr/7c4CICUCnew3+9YGeAQa6mdzpvS/adkcNf+aJXfdDt9adeTIAAAAbQlFVEhSU0lBUFmfSe1DyQpUDRzxL2FwrOjQuIoU5gAAABIAAAABMEUCIQDxAXykAGDZ2PVI3ujStgNuKk7Dh0Dg8y+OkwXYEJaBqQIgcJI4zO5KksdnXY0vFd3bUg846ARhj9KYgXbkc1vi4FUAAABqB0VUSEJFQVIvXiyQAsBYwGPSGga2yrtQlQEwyAAAABIAAAABMEQCICYgWLFTOsjKt2TPm1sqUHoJZnKM2E8g3xMuz7vY7s27AiA2bCmwwDfCG4LVVVnojpPY9U5Kd0aBc7fqgoCAdtk6iAAAAGgERVRCUxuXQ/VW1l51fExlC0VVuvNUy4vTAAAADAAAAAEwRQIhAISUmJnL9OXG9NfKf/8o2SjdtIGsDOirsOcLPN0k5yUjAiAkkYEmc/XRNwbJuMZrX2P6yuZFwfg3+z4UXGa7ATCrzQAAAGoHRVRIQlVMTIcbrtQIi4Y/1kBxWfNnLXDNNIN9AAAAEgAAAAEwRAIgLASYX8YwQ/tI/4jldRFMdAtSsqxbgn1WBMDwvVh2rXsCIG3jAlLC6R9mlYU8pOXvunbHUQAUkLE5qXUFyY1TXxSIAAAAaARFVEhCOiZ0bdt5sbjkRQ4/T/4yhaMHOH4AAAAIAAAAATBFAiEA+D2gdWd9EKIvZdHhDZnw+iInVcn4VRNjV1wORJBDy4ECIExCGOy1dtqWs3Jcny2GmFi2PujKQvnlP0ALZ+BzW9s6AAAAaARFQ08yF/k0ddKpePUnw/fESr9ErfumDVwAAAACAAAAATBFAiEAyXkZKMKV1TbF5pA4f39eYy3tIOD32bQivviP+WwDkXoCIAkaTlLP684atrsfeUeGhUZnakr8h7CLIdzcdXcOhgeQAAAAaARFTU9OtnuIolcIo1rnwtc205jSaM5Pf4MAAAAIAAAAATBFAiEAth2qLh7itoIhOcvXRnJca7R9X0Xy9MJ1J3DVb/LMuHsCIALxDIv2Q+xR7R/E+fxA4uEuIRkPmNEyWdqhHNmcqzXAAAAAaAVFTU9OVJXaqrmARoRr9LKFPiPLojb6OUoxAAAACAAAAAEwRAIgKu+4yD3N+ODN6ct/P5mSHpE3OeElO6UUekwWPlz32sMCIHwdulYcR89MLVLGJutzhuZfU10wNx0uer9dXYyCQSDjAAAAaARFVEhE2/tCPpu/FilDiOB2lqUSDkzroMUAAAASAAAAATBFAiEAy1bQf7z4PujItAevNqKKS2rs4GsiC6Ut7gj23N2haHQCIFmjOsxwicl0WD7bDADylSnKrwQytdNFmoK8LYop6pleAAAAZwNFVEcoyNAf9jPqnNj8akUddFeInmmN5gAAAAAAAAABMEUCIQCjOIQJcZR+xU2BhvTELDdipuT1qrMwlROj4mMlrOjMIQIgKggbmrLJ1jYWYr8Ti6OmnntdvGlaB6bXSJ5XGQQ3MUEAAABnBEJUQ0UIhpScG4xBKGDEJkzrgIPRNl6GzwAAAAgAAAABMEQCIFluIKWDmzTejaJRcWS89tErbOp8D8NrUrQGv646ook6AiAHemHX3iLZ8+YMVOVzihbs/fwIHm4RO6TOxHnEX3nfiAAAAGcDSElHqSQPvKwfC5pq37BKU8jjsMwdFEQAAAASAAAAATBFAiEA3eRWcFUmFdkvqUM7cdwOu91CZ4ykp7FqnR7lC+HraKYCIG2NNsQXpxgK5grFE73tHwz+mrQQSZAwgO51YbMDPIUiAAAAZwRSSVlBCxckzJ/aAYaRHvanWUnpwNPw8vMAAAAIAAAAATBEAiAwdqTzAiUmGgPqFEQwY+ctXZsJGyFsOBTgaZYB9LzhmQIgEWiI8R8HJAZpx3ss1Lmg7NYDvcGEL9fRGF7OXPI7RqMAAABmA0VOQwOfUFDeSQj5td30Ck86o/MpCGOHAAAAEgAAAAEwRAIgI+tVlz3Ab8Xg+Dl42Pse4xk4CbUDWxe+WRBWyn3jQdYCID1MYVAAHGuWOUpnN/rNMv7Dih1rtj8kyEHwnLaYBeioAAAAaARESUNFLgcdKWaqfY3ssQBYhboZd9YDimUAAAAQAAAAATBFAiEAsW3i5HbtJres4NRhIHwIYn2qnghdz77M53q1gDa1mGYCIBaGYAIzle75XFrtw+kX6nmvJ+wnecN1nyYL8KC5h6+hAAAAZwRGVUVM6jjqo8hsj5t1FTO6LlYt65rN7UAAAAASAAAAATBEAiBBLTOuxXkROYTHdznaEHxsUmYBm3SJo/4NsMKDTN7DiwIgSzoCdj479rd+i2sBMt96yYUwzh/WRVe1wE9wZOST1L0AAABnA0VUUmknxp+02vIEP7sct7hsVmFBa+opAAAAEgAAAAEwRQIhANZ51mY8kBFuXDzJNUYBSrNPqOKTDEdMaub/aVLvSKoCAiBFpm0NQK3CpkbEfulxUWkhAwJZSh2ywH3GjRajjCnqZAAAAGcDTkVDzIDAUQV7d0zXUGfcSPiYfE65el4AAAASAAAAATBFAiEA67qipD297mmIEz3sVSi2UCD35sW97idH2s0kDuwPu2ACIHvpqnobEIiRZ+u3Nd5lTmSJIkWyJU5xaD2gd9KyzcfsAAAAawhFVEhIRURHRRDh6VPdullwEfi/qAarDMNBWmIrAAAAEgAAAAEwRAIgXwItt/OahDzNi9nVoDFEPd4AYIrjeyWQ0XatIlQT5ZACIDcGJbX2YhGtdR5+oCb5fnO1lGbAsJeVd0wRoPpuW0GCAAAAaQVFVEhPU1ryvhk6arypyIFwAfRXRHd9swdWAAAACAAAAAEwRQIhAO6RDqfu57g3NYwqYQw2oE5+6NLm9zD+E8GSJabLdL69AiB3EhpbBbGArp8kCmBOSANmtoKePc9R71tCsSZLn5sFSAAAAGcDRVBYNbqnIDjxJ/n4yPm0kQSfZPN3kU0AAAAEAAAAATBFAiEAh7IeZh6TYiC9uhPc1tUMDnXYZmDGAq/zh/oy6zoLy/wCICc/BvxfNnMbw/ozRqtRO4fR2UUspKNHp5hbez6cef07AAAAaARFVVIrV9roNlPdmeh2/x8RuXDGhrkKmi4AAAACAAAAATBFAiEAlvM2uOm4guG9RBH86gQ9ugbOLU55nDiKchxgiYySU1gCICHpsm2dG39rDmlaYszVTqV7R6qYTItPxvg3EZxIVsq1AAAAZwRFVVJUq98UeHAjX8/DQVOCjHaacLP64B8AAAAGAAAAATBEAiB3Nhq9T0/CGvhgg4o5iLjk4SEFOcqfL7BgZN28OLSrpQIgVLmBrpru0Gp96ptwnqMhvrLIw8qYFBui7GhaquTme2oAAABmA0VWRZIxCKQ5xOjCMVxPZSHlzpW0TptMAAAAEgAAAAEwRAIgfTYY8hvM3Wg8Cj2GhPXsjbDyzD/Ritt3C2IltdesyhkCICN82Te0PAT+JRquq7H3wvH8n0NcK1a4FXNIVEfC/JDzAAAAZwRFVkVEWq7+hOD7PdHw/P9vp0aBJJhrkb0AAAASAAAAATBEAiAR2fTZjjXZZ6dRfObZjuoVEfJoQonspsXamBRcyMn1VQIgSFRombMkZP+R9TnRum1F5W/t4SP+GbUOo1xA6P+uYwUAAABnA0VWTmiQnlhu6sj0cxXoS0yXiN1U72W7AAAAEgAAAAEwRQIhAINHzOFrQHIzWApZzdLnVfkDCWvkTQL67Qzac2lLirTAAiB2JU2NirTuYPPjy3frRcPJf90zpHsLcfjiQzfMgfUmwgAAAGcDRVZDti0Y3qdARegiNSzks+53MZ3F/y8AAAASAAAAATBFAiEAxUasuo5++e0+EP5rrmOq8hyz+QQGUY1E8jLYIF8QtwYCIFis4XeLsoKmokTccrRJiWdRQ646GpetBKWI34dOISXaAAAAaARFT1RP0+fnHSBAOm0L6tVYwL8ZRSo/0AIAAAASAAAAATBFAiEApGiH4r6QqVuM90mVvT1KwVIYR9kXR0wC7w3cDpIhOE8CIGO6gAjjgvX0d3WHRKI4ZVlUsXcNmf3wZn/rvciXqf/AAAAAZwRSSU5HlGnQE4Bb/7fT3r5eeDkjflNexIMAAAASAAAAATBEAiBHZhwVotWwc3eJDCc0CKPqfeDDvTJekTuIigNeSYj83QIgSTSQGn3GD4I2xkC3M+7U6KV0pobrHJAbumRCJu4dI90AAABnA0VWWPPbX6LGa3rz6wwLeCUQgWy+SBO4AAAABAAAAAEwRQIhALWMnGQ09YC2LJbdh6ZvgupuSAd420FfJ4NK6wuYAeU4AiBOBxdchiAuYKe4l2TKx2lmGLfpEtkTlR4+EzD+K88OmwAAAGcDRVZaepObtxT9Kkjr6x5JWqmqp0up+mgAAAASAAAAATBFAiEAo9QSBVDW18J+nYp6AXCJXn1GEk8ryLh+Bf1jdzedC7ACIB5mmdrahiDdZk8kNbv5+PDzPoJDy2jKWRhnOBNV8jt2AAAAZwNFV09ESZe35/yDDiAImv6jB4zVGPzyogAAABIAAAABMEUCIQCByicrhpwJ2jh+YX+eL8CnmPVH1qmPbczPGcJDuchYugIgFB0peQR5ogqFSC8rgp302jRa7OuxNChlb0/aDnLGBa8AAABsCEVYQ0hCRUFSa6qRzYqgdDF2DvLu3+3O9mKmuLMAAAASAAAAATBFAiEA17GIB4ETNnvWeZdTBMCilQvU8yAUXCgWYzdYHeV5mGMCIGD5QIQe2HPdQSQvdSooaG+45VSztQQ2MswANwPDh35KAAAAawhFWENIQlVMTFku9owY8FoixYkCY96l2VLdFA0qAAAAEgAAAAEwRAIgdx43q6h9NevfQAttWWxfb2gwnj3+OKQr8fSyxJJIWrkCIChqGXyGqTwy9cOFv3l8+DvveGKwfxpgB9TXSaXkIC7UAAAAbAlFWENISEVER0X4zGfjBPjho1Htg7TbvmtAdtUTdgAAABIAAAABMEQCIEKWoYTvxKIjzYHwavr5KMGblxyuCHSuLi+/JZCOgy4kAiBJM33/xrnwOBbbXujrpSesB6DcmGk33FoA9Oy4ld24NAAAAGcDRVhDnkwUO/41+FViSz+ERlq3QBoXoSAAAAASAAAAATBFAiEAluUrCHiTRtU+XOaJociM5/HNGBFWPKvBW08Z/lq1g5kCIHtQC8Zr3W1dD/Sc+vIEJTAkgQmERuJOIYVRzt5pirvQAAAAZwNFWEMAxLOYUAZF612gCho3moixFoO6AQAAABIAAAABMEUCIQCpWjV76tyAhNmJ6dH5rjU1g9cxfvbT5e1G3JvGsIcu5QIgSKryztxtV6stIlaN6elDXKGXHXHRrJQfPcK1FSSyafcAAABmA0VYTYOGnedrmtgSXiK4V/UZ8AFYjA9iAAAACAAAAAEwRAIgLoQ8rThqC77+avM8bwVGMIq3uYmH1ghpH6mLiAcAsNECIAplbnF+3rfUjRbxf0d+PY83aXvafahdzYByT4kfdRWDAAAAZwRFWE1SyY4GOcbS7AN6YVNBw2lmaxEOgOUAAAAIAAAAATBEAiBKNexYghfokyHzv2Ot1pcsRhuXkrZWXYLiUKD/XpfxOwIgNsx8xohN/1QrCVBp9sr78xY6EOZWKJ/FlPEzN6b7THwAAABmA0VYWVx0OjXpA/bFhFFOxhes7gYRz0TzAAAAEgAAAAEwRAIgd2j4Eh1MJItgwxwBCZoVP1Z5t+aNtxQsH3LDaMJLNN4CIHhNvMWV4P2ds8aizInceduXoEbYkfSnDaAeqZW8cStjAAAAaARFWFJO5GnERzr4IhezDPF7ELzbbIx5bnUAAAAAAAAAATBFAiEA/azUBbXA6VSSXQsljj8UZJu2YcrND4Z99foG7RrCsosCID3YrbRe5tlJ8wqYpA09/SYBMXW4FqoKoL0LBfwSL/n3AAAAZgNFWlReYBaufXxJ00fc+DSGC58+4oKBKwAAAAgAAAABMEQCIFN3ryilye8jHNsQroaZFHCT7uxdTUVRQX9bJo8BEsfQAiBGr9VMbv7WaACh9EqyaHgZnJXLc6Fp8+tM/OSJJf2bNAAAAGYCRlR4pztsvF0YPOVueG9ukFyt7GNUewAAABIAAAABMEUCIQDHWN22PYzZI+LB8ETH5CU6BQfclJUgXYAmoj0tcHaulQIgF74/YjUdtGmafOXFSFzrtedx0bJhmEsroGa7qZcsY90AAABoBEZBQ0UcyqDypyENduH97HQNXzI+LhsWcgAAABIAAAABMEUCIQC7xvIBe5G7NgOpILGPIpdLj6xRgI2jqYm9Tk81/0xDvgIgJD4DrMjZAPAl0z+gBBTmpwI6bJXZAvw+T8iM+k62uroAAABmA0ZOVNxYZO3ii9RAWqBNk+BaBTF5fZ1ZAAAABgAAAAEwRAIgOyG4paLTomUZZaKLKvHld24WMsmkpd3A9TWR8wByMpcCICdUutJ6iQawJ2qxJHWbrqqAuJ9yOXV5WR18aVFL9taxAAAAZgNGQU0ZDlab4HH0DHBOFYJfKFSBy3S2zAAAAAwAAAABMEQCIBWxg1o8L339PvoxOiwceBWSXSaxnH1FpgdOo5AhGKvqAiB7rc1RsSBoWz79T0o1CT4u4GibifnIcmWTCDaAKw7mrAAAAGcDRkFOkBYvQYhsCUbQmZlzbxwVyKEFpCEAAAASAAAAATBFAiEAp6aHGKploRORg7O/seXiIp58L3ma3OZfKlGhOp0Aj4UCICAw57lCTY788Ifb+0LB/knfsLWW8w9TTmkq5Zss87kZAAAAZgNYRlMWr1v7Sufkdbmtw79csvHmpQ15QAAAAAgAAAABMEQCIBo5Ihu16mePHYsI5WaOTZtMmTb3kRfuy9kFhx/OOr8iAiB7fU7Y0r1dxn3MrmDg6Dlf3cx0iISpe7NXvHmMggzv+wAAAGkGRmFudG9tThU2H9a0u2CfpjyBor4Z2HNxeHAAAAASAAAAATBEAiBXT1NueG9ADwttzkw5hYlTOJBKvzb73lF1YNJ5fCvx9QIgKOTlSArFbqjkxy0Opbc0fHBnh6du0JFNvt8UqzGMaRwAAABoBEZBTlh9yzsjVsgi01d9TQYNDV14yGBIjAAAABIAAAABMEUCIQCMneXT4VJ/alGZFTGhA0Veq2hFql+oAJ98RpEEtIySmQIgMOUEkOliy1xfe/09ujbegMN9SvJL4eUqTwZRaYmJylYAAABnA0ZBUnz23HaUgqvuL/dXldAA84GoBi3sAAAAEgAAAAEwRQIhAKCHvztEmnVRisOr6iKBzFkvjpSbaH4AD6cQRvCmnG7xAiADw7uxFoxXvl8+xF4WByzmyg61oJDaXEavVkEWNmOeKAAAAGcDRlJECr77dhHLOgHqP62F8zw8k0+OLPQAAAASAAAAATBFAiEAmX7gekdv9iMEE7fXjGBV2WsNLP61qvHNIywA8uXsVLgCIHHCNCLIb2ll//8l8BjZeaSnRcn2Fm6jcC7xwRQ7CCNQAAAAaARGQVJNoCRskDK8OmAIIEFa5gDGOIYZoU0AAAASAAAAATBFAiEAxvQrbh1U3Ph8cmYRmPi1I0kigSzodvkgfSFG96gXK/UCIB425NhzqBUYfi70XtW21068Fg86Xrh/3ftURVqyBkSXAAAAZwNGVFQq7BjFUA8hNZzhvqXcF3c0TfTA3AAAABIAAAABMEUCIQCkdsaHDYfEAx9i/DxkitC8EcN28U5etlPqv59WyQptBgIgCNoqSoqukkKnpDJOHSfLcwsbIxHpisVTcAWsIxonNsMAAABnBEZFTUmyboubbPU+SZq9ssg+FTN76FqeWgAAABIAAAABMEQCICEEWEhPbFFjMl2D5XsYIla0xH+FN9IttoDsNBhdhAg9AiAnp5tH1uOh6dHGBNfJpVRP1/aJgyQX5ZpcTe7GceabpAAAAGcDRlJN5crvSvh4DlnfklRwsFD7I8Q8powAAAAGAAAAATBFAiEAmcrU/A9JWp4dAYEvxXkHrvGSaRGCjTmmL9Wog/RHQgACIFS5gMhaZob3h+7QWqnf1LrISOpCER7ZpHcz8BEAJ+jKAAAAZgNGRVSupGpgNop70GDux9+MukO370GthQAAABIAAAABMEQCIFEd2YbYgxHMrGtvGI7LOh0GFV5paWieF9qL6IeSyh0XAiB6ub/YIgnd7WV9zO7uoEP/uGjluCArWqbFYGR8ZL5JNgAAAGcDRkVUHSh8wl2tfMr3aia8ZgxffI4qBb0AAAASAAAAATBFAiEAgJXHc05OucBVtGj7lENgFzxicljLromIl+cJprMUSI8CIG7f9/n9tj/DbIxa3W+gP48feNYOF0myH4fNX4fEroyuAAAAZgNGSUjfw+hXyMzqdlfg7ZirkuBI443uDwAAABIAAAABMEQCIHc/rhlQZpYGggUh6I95sQp4/u1uX3u3ZuHSly4zfpjlAiBmyN/VWJd+RY9DE8PMgssYoa7vN4/bt6WPllj9c2BQUAAAAGcDRklEUvs2yDrTPBgkkS/IEHHKXuuKs5AAAAASAAAAATBFAiEAvhEpz7KCfrKf1jURvWH/3fZ8A33BJxfoQTfzSEDIi2ACIBeJWsoUMAtv2nihH6VU4V9Ib6EYhKIhDhR0xs6yOsuEAAAAaARGTE1DBMx4O0ULjRHzx9AN0D/ff7Uf6fIAAAASAAAAATBFAiEA7Pv07N9YUnKDGOJGOuS6TWrQpQI4tU3utRU4laqV0ikCIC2Vw7uskT/PPGZVsZJjtArvK/gGL5+by1bXmHBi65m/AAAAaARGVUNLZb5Ex0eYj79gYgdpjJRN9EQu/hkAAAAEAAAAATBFAiEAz3FkWRv8NE3Xm2Rple3UJTF2n0PC32idEd355pSFUhkCIDIaCvHXfqFfGEICytctav10o9scRei/MdmgAgRzuE7DAAAAZgNGR1DZqM/iHCMtSFBly2KpaGZ5nUZF9wAAABIAAAABMEQCIFguhlZzGnleJx0CKh6Oo671CJnvCx72p5ROAH5joSBrAiBMOyv2cKMctw+VxXgClWKad3IkhWWjDQmLAU6iUkC9+AAAAGcERk5UQr1LYKE4s/zjWE6gH1DAkIwY+Wd6AAAACAAAAAEwRAIgGBretnhjdAAfefGfn0ey8bGU7DaKmU6juxRE4rgxKD8CIB4OQ6ECZIjm7oBNnhQpXOhbsVrTiTzQe9g3OU/HANQuAAAAZwNGVFjVWfIClv9Ildo5tb2a3VS0QllqYQAAABIAAAABMEUCIQDr791i4g6thG26KNleom63sCi/GqlQ4XtVgL5c8yHpHgIgbKZ57ZAxH5O5P1ci5KvrS2c1LRrA/KZkjWy3smBhUPQAAABoBEZMT1QEk5mmsEjVKXH30SKuIaFTJyIoXwAAABIAAAABMEUCIQDNx/L6+xoyvi84jhpz+syPuIcby2bp44ugrtxE0k3l3AIgfgyVz95HJdTPILO6wa1qxUIh8nftTpqTPxljH6I07z4AAABnAzFTVK8w0qfpDX3DYcjEWF6bt9L28VvHAAAAEgAAAAEwRQIhANgPOotPtTnnTSiFv+xbggp6mNhSKKMH3Rx2RFkDCx/7AiA8bgE3EgIrh3IQJwKqhdN0cG6JlbjPUonb5DtO12GNQAAAAGYDRlJWSN9OApb5CM6rBCilGC0Zsx/AN9YAAAAIAAAAATBEAiBXeK2se6vf3+ztJtC6hUSq+EwpQa/CxGgWZADUcpTovgIgItZJ4E9ZuZJGt3Do7o3bySzFr/SQGStevZZABFJ14M0AAABnA0ZYWaAk6AV+7EdKmyNWgzcH3QV54m7zAAAAEgAAAAEwRQIhAKW/wJEU+zykR72YH3azKgxQi32wuR3TbLHp5yRfvzWgAiA8KYctIjwoYp9sgVM93RP+s9QXKEYpsNRylr7zLy2QVgAAAGYDRkxSmu++Czw7qeqyYsuYVugVerdkjgkAAAASAAAAATBEAiBw13EI2zXYZ2niLOXNkU2Fy6tan11ILC06QOkx+O8bQQIgCJ4jIYmAZeg4tGdikaPGLfqHxxl587r9U7ftIzfiX4sAAABpBUZMRVRBd4jXWfIfU1MwUamuZX+gWh4Gj8YAAAASAAAAATBFAiEAv8m/rLRE3KgSdRLIHSSuae1a4WGWrltdeJUQlqqc1m0CICay+IIbF26IDwOBK9v7A0cEMyYqp1xip6yOsqNndiN2AAAAZwNGWENKV+aHuRJkNamxnkqAIRPiZq3r3gAAABIAAAABMEUCIQDtikQO5JBUMN1oIsd6or3k25h580JqVSMClC03sakuUQIgc0nQaLhZzVOJUsy5Ux9mpcvJyyXEG0Pd9DOHlRhL/HQAAABnA0ZMUDob2iittbCoEqfPEKGVDJIPebzTAAAAEgAAAAEwRQIhAJUAn1Uk+yw+cF4F5xQ5WXWx9Z+XVyqNSU2jmrgZ5DzxAiAYWnJP+pV8g0g4aiDdCW0LvY1P3OJ97JDcZt1ogu/ztAAAAGgFRkxJWFjwSorFU/zttbqZpkeZFVgmwTawvgAAABIAAAABMEQCIGfD1SmQv5CPTJh6/gnUab4AAe81ZN/5xEZlzWv8Qys/AiADp+iOK6fNbU25GC7KD7Fs5cbrGvgmFSp7Y7k/GFh85QAAAGcERkxVWpVLXeCaVeWXVay9op4et0pF0wF1AAAAEgAAAAEwRAIgUbDBUL0Rszs3E50Y9YtLvRXYqMOeTbfz9PMhvD1wypECIAgw5J3rs29DQi5xLdWoFGqebtPRpui1/IAqmk5AYoRfAAAAZgNGRkNOhOnl+wqXJijPRWjEAxZ+8dQEMQAAABIAAAABMEQCIAcQ6s+lMDbs5pFG2Jq6i/PJrEwJjR0T0Fg3RE6oAas3AiBU541+19tJKU0ujgn4O4X5bNxL9kuCAY0SPoqOE1D/OgAAAGYDRllQjwkh8wVVYkFD1CezQLEVaRSILBAAAAASAAAAATBEAiBsODMo5J7eChS4mgx85GElthyS28hjCyOeacAW/3hVWwIgeX4VE/DdnR40e4w/PlHUrFv1Nrvj9UNByDzvSLUUl4gAAABmA0ZOQkeyjzZb9Ms420tjVoZL3nvEs1EpAAAAEgAAAAEwRAIgQJaKi8Sw+U32Nc0w9aj7TUF3rgxbYJcK0T8QgnRa+oQCID+VEQhAJKw1FFxbZLpia1A6M1WOYm2pW0kR/BMCrCydAAAAaQVGTktPUwcHaB80TeskGEA3/AIohW8hN7AuAAAAEgAAAAEwRQIhAKcerE6Ti4+OLxqkHSJEvwSnC9UWNGgu05BBqcJg7Nt2AiAqQeEhpdHtCZ//ZjawyeJWHT6CZARCZPfMfoEVgyZQlwAAAGcERk9BTUlG/Op8aSYG6JCAAuVaWCr0SsEhAAAAEgAAAAEwRAIgf8Gg0LWMGQZRmHbdjpFhgbiN5ZAGDbH7ApumFFbkkG4CIHkZvKr+f3aXCLRS9Gd9Q4VomM5otOB60q3h7bP5A078AAAAZwNGT0yoWA8zY2hNdgVb3GZgyu/ocJdE4QAAABIAAAABMEUCIQDi/Qj645vdQnktP78h/B78vrJM/glOslxYtbiuwiaxrAIgFtfTVk97yMHoZxYCj4A4KEGAYam/DnhJOxpRgevQgj0AAABnBEZPT0QqCTvPDJjvdEu29p108vhWBTJCkAAAAAgAAAABMEQCIFQdSNCE6IH14UyqsauvGY93pCEKlz4Sv0GyWrT4buZHAiB3oe45g0UmRztipTlilY4WaSTbuQVQ83ynk4TCWBDFIgAAAGYDRlJYNqc1V/W95Rlew57KgtKLijbSEUEAAAASAAAAATBEAiBrTEIZpGOgEhzN01/yv1+2pZr9+Lb1fhNif8/47veAWwIgJTKxxn7xWFOwJYJTJPQE7a7UGnjVvbUdk/yDvAvRUtwAAABnA0ZNRrTQ/fyEl675fTwokq5oLuBgZKK8AAAAEgAAAAEwRQIhAO1G74W258xT11DIenYaFnoVEarmR9ApQmUMuA3FNF3kAiBnLEM4E2W+tFVPHWwEESPbYNR/Vl1j1Y1OGaE5tM1aBwAAAGgERk9UQUJwuyOPbdixw8oB+WymWyZHwG08AAAAEgAAAAEwRQIhALqnEUTNuYa6KmBfIVa13xNEMvvsLqqVDRbarqq6kXHmAiAd/N29mQogUYHUO5u+DCVZ1Js1B8gnqTiTSnoqjJLm9AAAAGYDRldU8VGYDnp4FIFwnoGVdEvyOZ+zy6QAAAASAAAAATBEAiBM5SBLjuOx5+JLCyvT3H5JHxIK9qExRoE7I/QH3mwGUQIgLfgI48GHFp+2GSl0ee4wyMO/JIJ9GBQJzNoG+idIQqwAAABpBkZSRUNOWNi44eyonaAU5n/bwgFOqo4XEHm/AAAAEgAAAAEwRAIgNIluk2Qdo4EP4T4qXrzLGt8Xk/v1XqwfQ/FpN/6w6HkCIHXXy26biIomZ5PMVuh2/NRDrWDVOOmUDjxJgiqIPbi3AAAAaARGUkVDF+Z9HLTjSbnKS8PhfH3yo5enu2QAAAASAAAAATBFAiEA2zSdM98m7QAA21aKGNSZEtHUBHCqg/Z0rYk3/WjsRKMCIGy/Uz4We0JuENALxcMGVXDO9nti9E28Zi/zA+pPIZZGAAAAZgNGRFojNSA26RGiLPxpK14uGWaSZYre2QAAABIAAAABMEQCIDjzIbYrZUxCuUBws0Z/Ynlx7bgM1EInzEPqrrQeL1gYAiAe7KmRXlzpmgHCyUFhssEYDQIKDemOnpmQcIqI9wZKqwAAAGcERlJOVKOuIjBOS+wFMn54EnaLESU7WnyFAAAAEgAAAAEwRAIgVTGvei85HqwQOTlCW5wfelQlT9fuyOXm1N/08dv5LMkCIDL1zPsWNdyINgDuXaGNUSNIZ7EjDajGKO5FdbDOINa1AAAAaAVGUk9OVPjDUnzAQ0CyCMhU6YUkDAL3t3k/AAAAEgAAAAEwRAIgCDGQ3EU7yPYzSBgpK5wXaaGaR3CNO84lr96jFIOeqjcCIHz9uraVUTCnxmF6Wniu/6PIqG0RiuybAE+wwsMIAr9SAAAAagZGemNvaW7lruFjUTEZ9PdQN2xxh2a0D6N6XwAAABIAAAABMEUCIQD3JEt2ZsYGRxylfWO4Rzn5QUeV2xkZUg0jWFYfzZsuFAIgCVj5GPDtpSmIbzIz8nsNzQi0TydJ6Tp1FoR6IQYxWfQAAABnA0ZUQ+b3Tc+g4giDAI2MFrbZoykYnQwwAAAAAgAAAAEwRQIhAODQQoJPfJBcISyqMz3716r/+GbS/KtBWaemTbkp78kyAiB29/I5FEDCJqyCeNJ/yIS+ZMw5a0Ch1tsSchvs7H3w7gAAAGYDRlRJlD7YUtrbXDk47Nxog3GN+BQt5MgAAAASAAAAATBEAiAeL9kGDZzFdkFlBgtpuJ2MkD/l6kUpqKvxb1mkny1cNwIgDqrcYdWca/gAStG0xG8M9DXgPNVeSSRuuxJUFLYkWPcAAABmA0ZUVFDRyXcZAkdgduz8iyqDrWuTVaTJAAAAEgAAAAEwRAIgNXVLA4oFkPYoN1EK71Y8HQOP4eIDmTpduAj32lWxLroCIBPFQD47YgCCH8bTiLH+ObArjx2tw6OJyJGnbIFvwmLDAAAAZgNGSU4d17KHi21Wce1gLmCBiw2aDNHN9wAAABIAAAABMEQCIA0Noj3n2IvvaNfVyHrrbeMgYncFIoRnV/gw45SWbaQQAiAd7e04jsJq7Z0fLgLSN7wzL5soVVjrBDLAXfhUVbLdzgAAAGYDTlRPipntihsgSQPuRucz8sEob20gsXcAAAASAAAAATBEAiBiRz0s4frg5CD7BaRzORO05i5jq4OCeP+u9SRvMAIwQwIgX4SIuJmJwS8BVAkB6xVwRYc6+cFINxPpuXQT9lTWytkAAABlAkZYjBXvW0shlR1Q5T5Pvagpj/rSUFcAAAASAAAAATBEAiApQgxkgKD7HyO3EpcrB+cSlz4zFx8ZStAEAHiRWd6nbgIgeq2q3ww+nOtYYPlWFYgeu+EMgI1N5XS2YBy/SV84DQ0AAABnA0ZZToj8+8IsbT26olr0eMV4l4M5ved6AAAAEgAAAAEwRQIhAIjDqq6OQZLdACQEvwvdSew86uYxG36wuXdFuXS8l0+pAiAkHLIRuqm5Lon98cUBTuCKR3ayqjdGAHSbhitM37D/FQAAAGcERlVOREI9gyG+Pdfr/1tsfaLvZhS4VHrPAAAAAAAAAAEwRAIgTYikAQcP+c+wuSj4fxsK2mSrdMBTY77lilTpaOvGuJ8CICBq/4dfIAWyHo/txSw0WGxc8JCb0EKvEGFm8XY5GUniAAAAZgNGTkRN9HtJabKRHJZlBuNZLEE4lJOVOwAAABIAAAABMEQCICznuY2x10jFV90Rp3u10HrRGED0iuw6lWepp7Bp7oYXAiAmqABPjWWo23YIp7zuK94SvutNU1d046LL7Tw6OCHPgwAAAGYDRlVOQZ0Ni92a9eYGriIy7Sha/xkOcRsAAAAIAAAAATBEAiBfDjp8s3uM7A4NHwpgzb4vi7auBovINlde6UT2ptiSkgIgZ4JCe1I/jKVIjKUbVRb+j9ouL3KKOGpiAdQOM4hxcJwAAABmA0ZTTtA1KgGemrnXV3dvUyN3quvTb9VBAAAAEgAAAAEwRAIgL7KZSOFE08CPcSI5xNsQMgOAHALBK4BJpkNza0jHbjICIFUgc5s3JKIvq8NBEDRGREsYWwJ2zkt+rVv4HNsrNayvAAAAZwNGVFIgI9z3xDjIyMCw8o264VUgtPPuIAAAABIAAAABMEUCIQDKkVINre/VfdmpmzqRgKrOjted3rG/Wl0lxPTHIhdM7wIgVODSID+5UMvDq2Glzj5OyUQzB/5hsT6HGa2uuAgrwwYAAABoBEZUWFRBh1wjMrCHfN+qaZtkFAK31GQsMgAAAAgAAAABMEUCIQCZy2BJOPHke3GG+iLxFWVi5Ui0uZx2qVa/vBC1Mv+D1wIgBZLUwB38ZhBKg+N4BXN5K/LYeV93E3EndarxGxmhVyQAAABmA0ZYVBgpqgReIeDVlYACSpUdtICW4BeCAAAAEgAAAAEwRAIgAQqkdQXIRDsOS6t89N0sBHjcXXmQbebhyRXQ0+VYXYsCIDx/W0zB8DYdch5OF72Q/pH2+lZrvlIocC37CBGaTXduAAAAZwNGWVpr/y/iSWAe0Ns6h0JKLpIxGLsDEgAAABIAAAABMEUCIQC0I7rYHJ738CuAR74T9Q4VuSPDpl65UX2b4xbqQ72DOwIgbiVA7+F0F6a/DJGNsGwgaApRY9LbVznmSbA4JxY5QrgAAABnBEdBTEEV1MBI+DvX431J6kyDoHJn7EID2gAAAAgAAAABMEQCIHmU8rXGNXllsjvWZ89vUrzAP9sqNBOZjUp1A2cuGBIzAiA/4tHAgy1NKvz7tsAVLP8zCfEyhX5TqbQgf+GHLJCsggAAAGYDR0FN9nRR3IQh8OCv61L6qBAQNO0IHtkAAAAIAAAAATBEAiAls1qGwArTjcas1kbvTrgam2oIvk69PqqyPj9FZ+oTTwIgG3VlnnV6Obvm+Ej+6ERwWa/dfQQ9h8oH5MMbqhtdvJcAAABoBEdBTUVj+IoimKXEruPCFqptkmsYSkskNwAAABIAAAABMEUCIQCkvj1BMW2TtVrpdE3tTn+iWvzus2L+98s0RhjjHlgrlAIgM3EWV1tI2Tl1M+SYQQXiwgoDn4CrBkXJ18iVO65ldIwAAABnA0dYQ5U+IpRbQWcwutBQCa8FtCDlmOQSAAAAEgAAAAEwRQIhALY/1iTUYVVpn8pYaVjEKin8hZ1+dg7NuGn9eJAeMeXsAiAFtLtUEnCjkOauHI/BjZ2kKMFXL2v6TIkDvMITyj3K/AAAAGgER0FOQcDqYwb2Ng/n3Ktl0Wvxo6+Sx5qiAAAAEgAAAAEwRQIhALrbf3QtKkKscmm5QwFIcTSzEOwcYtXnbBmFG3LsCUs1AiBGaFHioF9tpYmsucbpHHtfwjfRH2PSczuFElb6XY7Z+QAAAGcERk9SS1uxYy+gAj4ap2oa6StGNcjbpJ+iAAAAEgAAAAEwRAIgR6dnZEOz40t8dcSfWikXK6SgNiypZhZsyyfIaxD//UICIBeeTn/Ox5uSrd0MKHaCOu5rMrfIkcaqDZifzGbbzq7MAAAAZwNHQVRocXT4xJzrdynZJcOpYVB+pKx7KAAAABIAAAABMEUCIQDyQa8KhYgVjesJzcyfAH4u2MHJj3DYxFODttoSFEc7owIgNRalmBg73OPRmh8QUdKpKeeJT7T9FJow9AYreIyvi1AAAABmA0dUSMN3HUfiq1pRnikX5h4jB40MBe1/AAAAEgAAAAEwRAIgC9W1Q4L7TKenlpZdt8Qj3i7YG1vIkvO+LhrC88TxLpMCIFI+lWr4ca2VUXO/grGdH4hqZTpJtp3gzVTJDT+fZjaaAAAAaQVHQVZFTHCIdvSG5EjuieszK/vI5ZNVMFi5AAAAEgAAAAEwRQIhAPYqW9xq9t+Fb/aEU6A7xtzv8XfFP9dBrx5MsLF1TuIpAiBInvCyYrOgwTC7twpo75ugGsQVPJQnZqLm2drp4j1/GQAAAGcDR1pFSsAPKH82pqrWVSgf4cpnmMnLcnsAAAASAAAAATBFAiEA9MW8VJP3LDjq7FUFKJaXTgC7dO5CYb8ZcqHY2U5gq60CIANm3f8EUAF4kinvjKN5aSpLZFNfV6/kLynOFCytfUm2AAAAZgNHWkWMZemSKX1fCSp1be8k9HgaKAGY/wAAABIAAAABMEQCIBH90xlLIcxwAPKLskdYmjhsnvPJ7PqxhHIRtw1YEi8OAiBirwNwUVH8zk1rdJ2fsgYdfwJiHIMLzZQb0xCh3UFdVwAAAGYDR0JUdYX4Na4tUici0mhDI6C6g0AfMvUAAAASAAAAATBEAiBoocnW8IhvfkyM+kt0ho5IcZXY9jHl0WyahMMFHUbAQQIgYFb9buI8FTda0xZ+CGe5l5mbuHvFHP5CTSosq/49OAEAAABnA0dFRU9PDbTekDuI8rGihHlx4jHVT4/TAAAACAAAAAEwRQIhAOP7qySbSxibNtP1Gt9w5beA7LPaelk2lIs99M3eXt0MAiBScuHE1RsaAx+WoH1xE4J9xqO9q1hyBztq/L2i0Ni0vQAAAGgER0VFUWufAx1xjd7Q1oHCDLdU+Xs7uBt4AAAAEgAAAAEwRQIhAL8VQd3TtSRd6THzWsmLtab23ooIBmZoAS7IiKhw+KneAiB1vkL8FaGmK2KyJJWXrWL4GvahILtC4ea+Jb4JOHpeZQAAAGgER0VMRCQIO7MAcmQ8O7kLRLcoWGCnVeaHAAAAEgAAAAEwRQIhANwbT3cL/K//KW3Zc9DTn6P1F2Ijwq6n4Az9xas5jqqAAiAP/ytKANfZnbG8O1VZpCw2GrF6PCfjQ4UsEJJ4erx0qQAAAGgER1VTRAVv1Anh16EkvXAXRZ3+ovOHttXNAAAAAgAAAAEwRQIhAKXZ5wzL+Co6hyCXf5lThBBU54mx2PTwqy8YPgy6xF8IAiARaOHL/kHCRz3ufat6ks9OJLi0/Ar7qKZSuNp8avN73AAAAGcDR01DaP7AvMYXJ93sXOziaDAno4NJJxAAAAASAAAAATBFAiEA9lgGV+OiW3Qw4V+R2PWN9sD4fzJOZ0HglN4d5PXouxgCIAl4WIihLxpA8hSu6s0au+0YSTL7Bz/dTefyP9146UBgAAAAZgNHRU3Hu6W3ZVge+yzdJnnbW+qe55sgHwAAABIAAAABMEQCIAiE1f2suqWjY48Gc/uLoO2XsfOpOmbFZqA/43VZFL8jAiA/rDYnZ8grFw8qyZ3VAPM48H0R/Gd2IpdOMxyTDWFARQAAAGYDR05YbsiiTKvcM5oGoXL4Ij6lVwVa2qUAAAAJAAAAATBEAiA7hOjdC+NpB8ZbT4HbUmwVXa9pD+U2arxnYzyzRc9UIgIgfA0KH97Xa3fX2zF8jKcNXc6hIzqZKNXT5nmXnp8ZcxMAAABnBEdFTkVt1OSq0ppA7dakCbnBYlGGyYVbTQAAAAgAAAABMEQCIAzYzVubIxp1t/1P4JozTA/Z6jFTLaWKZq457wo8i1G+AiAsp/FRtc71EwRK11xRbVFA9qDndmBnbqask+SMjW/3bAAAAGcDR1ZUEDw6IJ2lnT58SokwfmZSHggc/fAAAAASAAAAATBFAiEA5BvKOC14eXnVTR34nbSlcQCpR/pz5VnxWme19t7R2LgCIADRiaXy5kNUGz33Riu6I2d/Kn1XIOBe2xZz03RbeRUnAAAAZwRHWFZDIvCvjXiFG3LueZ4F9Up3ABWGsYoAAAAKAAAAATBEAiAD7MxH0vRbYias0KDujaVFxL42QnsiZVNgAuq9yygvCwIgCnpQ/d8kIOKHfhdLBUv8yAkdMFQ7xWgy9+OgcfbRh54AAABnA0dFVIqFQoill2A2pyWHkWTKPpHTDGobAAAAEgAAAAEwRQIhAMyUve8dntafpVOpt+f37b6dx6H95Sz4UqIry60Y56OnAiAVE7k5aheiKL39vGikc+dsGXORCO+P9wQuDPUjF3Ml4wAAAGYDR0dDf5acTTiMoK45pP3bGm+Jh4yi+/gAAAASAAAAATBEAiADxrAeugG342Xzl1x3dHnkRYwcgibP/sERln1y0A62GAIgRwBwi5+t+KwGuXduvetqArmJDeCoNJ5OpO4odt0Dnw4AAABmA0dJRvzYYphWKLJUBh96kYA1uANA0EXTAAAAEgAAAAEwRAIgVWDYALJKBV0CkHZYZwNLR4d+KQB8fnwWkhu2vWQgkC8CIC9EE2m7DK5MGrI1wwDClRAyWkRj0wleHfHwoVdKFUAbAAAAZwNHVE/Fu65QeBvhZpMGueAB7/V6KVewnQAAAAUAAAABMEUCIQDNjCmaFyz7O8n2f6gQtIVI8TV6hWh3CBGPpNmrd0xfJAIgI59FOdU5WZ5LoXB2+Vp7QoMJbgam/rcXFgovX4pAGOgAAABnA0daQp2ui39tN+qOXTLGw+hWptih07NjAAAAEgAAAAEwRQIhAI0xFAhWtLONOnGXkGClnbRvnSWL0DZU1dR6+jyrsiWIAiBOqZJ8rIup7zI4wUkoJD8S40LCNzbZL7TWabAV66pZGgAAAGYDR0lNrk9W8HLDTApls64+TbeX2DFDnZMAAAAIAAAAATBEAiAYPKi0o2mSzHg8e9O7H17O/2VkhHBUnd5rzdMd5wzvqAIgT9mZVSpUiV6qZJMdTojt69+RspDWZliJRzCtDdkx87gAAABnA0dNUpuNXzQC90x6YdnwnDLTyge0XBRmAAAAEgAAAAEwRQIhAKeQQNO8fIbuFzg7mveeIOyTsSiXe+D86CZR9JO95NRQAiBOKInfI7oUIiTrr1RBSGTCB9IdZFrZh9iA5o4/zgfmNwAAAGcDR1pS5jjcObatvuhSa1wiOAtLRdr0bY4AAAAGAAAAATBFAiEA0mE+smCTljQ0RiWtbV20Pw9p0qaUutSpcycNFFnwsPUCIFzGiPWMl6TTPzig2BTm4X6gvh/DID18J/LiHys32L1uAAAAZwNHTEFx0B241qL76n+NQ0WZwjeYDCNOTAAAAAgAAAABMEUCIQC6CAA88IbCsvNe7o7FF6km7QSbWdHgj6M2zPMJ/HxhggIgBAGtDfK/iefEmGVujzP8OIwTlfHNVFGlbTblEUsPw8cAAABnA0dDVaTsg8iQeIjQBqN96/dV7jl2bziuAAAAEgAAAAEwRQIhALmAmVfu+PD7l/TL2YNIc8sxWTD+htia4bFI3f9uaZsTAiBT08L6FgEwllU3mGGwBiY5WUHUIsHM7sYzQi5Mwr8r9gAAAGcDR1JUYg+imTBGpT3x82X6P9yebHdjr5YAAAAIAAAAATBFAiEAl5tnVCCzkNROOlKLv+s7LjkwnNN6PjodCUxuIKJc/H4CIDlH4pc8R+tEBrqegDgoSFe6fx7JXRBnv1IhlUgmtxaoAAAAZwNHU0Mii6UUMJ/98DqBogWm0EDkKdboDAAAABIAAAABMEUCIQDtD4MaRZTpiUUbN6PsFPWDRX9WyGJz7GtEU0lYcMTNEwIgLlznJdAaykyYRAB5bXjBXs44uClAiJ1zsVR+SBTvpC8AAABpBUdVU0RUMkKuvNz43kkQBLHJjmWV6YJ/bBcAAAASAAAAATBFAiEA6mwO0UfFFGh0QLxKsgxErV6etYTEgTPrMPVx5VPJG90CICZICWVl1PB0nUOvae93IiuWDuWmG0cATuHWUFjYrvXZAAAAZgNHQ1DbD2kwb/j5SfJY6D9rh+5dBS0LIwAAABIAAAABMEQCIB5dzBkc/Of1wCLNdgA5SDG70ST1y5zq40CSrJ7WP0/KAiBeC33S/wperYBxC+YY8Tdeiyvg4uiOhul11VKjfV6y3AAAAGcDR0JYEvzWRj5ml0z3u8JP/E1A1r5FgoMAAAAIAAAAATBFAiEAnbqLY1t9WOYglxT5OzwB0lrR9sDYAFnEXLGHQ9SBGMQCIBUPIGIau+p1GM5MchVJGHu9eQ5vcDQ90O2GHbEu4aDKAAAAZgNHTVSzvUnij4+DK40eJGEGmR5UbDI1AgAAABIAAAABMEQCIE5WsyoW6yNqYfN7OlkzNzkC+JEd8E3j1qUT8knw+wkSAiAp0MCd7jn1ziK8THh8ak7agpK/Obq28l1XqAmu0PVuDwAAAGYDR05PaBDndogMApM9R9sbn8BZCOU4a5YAAAASAAAAATBEAiB8A3eQTb8B4kC+wSkZoDLgugAR9wGv5wXxsIBCyJXRjAIgct+iUcIRPzm4hPPpJU4YItqK3hXMZpEce+/6jSYYefcAAABnA0dOWSR1UfLrM2LiIsdC6ceIuJV9m8h+AAAAEgAAAAEwRQIhAJbqSvyclIOjesZgaKxLIH7A2jNQpOK+bxJGEpz72nXhAiB1pPG7vfHR+PPIi3IxpsEyQxJpZ0WNphBWE16IxvroowAAAGsIR05ZZXJjMjCx+HGulGLxssaCboingn52+GdR1AAAABIAAAABMEQCIQD1MboYOt4BacTWi05QCtMwxnCmXqwPpy4QnHd69UojKwIfe0+egnRGTBJrtlaMfcqaA2uw9fwh+CF7Th8w9IFKGAAAAGcER09DT+Wp99c4qDnpPmEbm/oZJRVCxyQnAAAAEgAAAAEwRAIgf83BkBxIlKxZSXMYhTyVn+lizLoaEWU3cFYOJ4WhaykCIBLJv7dmfuyL94fNkAG9FZp/ujvVT0c8SkahGVkb8E5VAAAAZgNYR0f2tqoO8PXtwsHF2SVHf5fq9mMD5wAAAAgAAAABMEQCIAdovHY+YVAXD+kwSbONaiVj0z2dsVxZ1c7poINMBwhWAiAq8ARmjozwpmJUtiU7Ik1807vJ1mkoUlMMjCuOgql5LgAAAGgEWEFVdEkioBXEQH+HQysXm7IJ4SVDLkoqAAAABgAAAAEwRQIhAKlbD8Fc8Slc/uiWhlvzAkiY2xdw30ArskWZxlDiTC/rAiA8qv5JZl5+QI3FEqz5EkkdHuHzsYZ4z1KxfdolhhZ/UQAAAGgETU5UUIPO6eCGp35JLuC7k8KwQ3rW/ezMAAAAEgAAAAEwRQIhAMYOjxSHq1uwI9Um9wQb6dzXJgvrOjCnkAuyTb+n1L0GAiAzbedGPAkRiQ75ijDCGc1BQigu3Zh5Sz+VQgUqZWsuRgAAAGgFR09MRFjqtDGTzwYjBzyonbm3EnljVvp0FAAAABIAAAABMEQCIEP60v0C16nXByIgcF1EhIkHRJI2yYOBKFFXg9Ao0QKzAiBrDbTAgLhtE9Yehhi9+ScByLU8VTAJ5ocYvLVN2IABEAAAAGYDR05Up0R2RDEZqULeSYWQ/h8kVNfUrA0AAAASAAAAATBEAiBBRgdEd0VAEHOTJvNgprWmAMcrWUPT60DxKhdweD2kgAIgPUMnZKSizZoYvtJfCiIfP2WLP0aDP6YD7u0D3oYR0pIAAABnA0dMTX3ZxcugXhUciV/eHPNVyaHV2mQpAAAAEgAAAAEwRQIhAJyXecTvcW7PQnsZ5VdHLfYvsOSBguwXYIlUOn4y/wTpAiBIlKueKi2zIXFSWacSq8g4tkQrb9VIyyFFqLKJ8p3N7wAAAGcDR09N0xQazT9dxTIHc5b/OYS2cDUjT0EAAAAAAAAAATBFAiEA42n3YcuKEEV76M+e/FSVkwqjCWUIMB+8eA4ovpSEwzACIBlVgNeZ4NQX1ASialv2x2Wn0PK36i6VZlYh9MS0huv1AAAAZwNHT1RCO19isyjQ1tRIcPTu4xa++gst9QAAABIAAAABMEUCIQDiXYny/7ksL3jFdKhbgAm5pBPcYQ4rfNp1dzZMOj0wRwIgSUzp6MpMtVc2LrwvS1Gei21Cki2XVQzbIpofJiG7QpAAAABmA0dPVGE/oqbm2qcMZZBg6GuhRD0mecnXAAAAEgAAAAEwRAIgFgXaRSqEGmNTTQcYjwj1DBQa3LWAHItP0Tk88QUstvECIC8MKd+9hpbCrvW723O7+BE+APD/J4zvIF7YntzHEcb8AAAAZwNHQlTL1JGCNGQh07QQsErrF4k0babOQwAAABIAAAABMEUCIQDzcpuNsJG2xPrnVNGYKOjc9GsVX7mDGIlbsam7KbOcPwIgDCnvMLb++2Cxg8obmh8/4EEeHZXq+bX9JQAmiiQMoKMAAABnA0dSVMlE6QxkssB2YqKSvmJEvfBc2kSnAAAAEgAAAAEwRQIhAJqaHe0mZqKWBmKFLCiegzqfE9Z37bLVkAif4RG7CFjGAiBs4KUEbtcVEcvsKKGWCktnSd12cloffF1A5Wv7XABn1wAAAGcER1JNRLREIIywUWwVAXj8+aUmBLwEoazqAAAAEgAAAAEwRAIgRIPeHdZQhYCpV7ytj9+Tx4Ya+EBVt38JhsKayTuS9FUCIDoQRxyfZc66tyfSGHAibEhP+2j0kHpRFo0uAdnL6ZBrAAAAaARHUklEErGdPizMFNoE+uM+Y2Us5Gmz8v0AAAAMAAAAATBFAiEAjMhYFFm+x+myUZ+yFeSP74KXDWy0ITPXeIFNao++5wACIFP/r35vaI+TIDxawVsz0+bsDjLVAuLMeaWEd5xHnijnAAAAaARHUklHYYrLlgHLVCRPV4DwlTbbB9LHrPQAAAACAAAAATBFAiEAiuOIzx0sXF6TDKRutsysWGhgYj2ZfjqI581NSdZnaN4CIF7VQkXVtrrZcgdyJbwZBMFtgyxVaYIazqGfaClSAHrAAAAAaARHUk9PwXGVveSdcM78+Kny7hdZ/8J78LEAAAASAAAAATBFAiEAo4869RNyCSD2w7aaI4iFBLh964yq8s1wtMQfkEjsxMACICrHeTxMMPXDwWpngq3yBG9b6pLK5PQ4oowGL/NTirnAAAAAZwRHUk9XCpqc5gDQi/m3b0n6Tns4pn6+seYAAAAIAAAAATBEAiAUqGmwXEdwCy3QALNo5ZxXniQKWgLMHwDCXeoTzmYeRAIgSL718MpcvAcNali//UY9tcD/HEPvOx7MZKJ0AmtO4ucAAABmA0dTReUwRB9Pc7223C+lr3w/xf1VHsg4AAAABAAAAAEwRAIgHFXe6hFwUAHLdogkU5Z3P0baygO/1kQEyLROxwIP3KICIGnIovab9X4SdKufJ+DZGKa33kzN6RRHZ9F1jEuvpzilAAAAZgNHVEO3CDXXgi67lCa1ZUPjkYRsEHvTLAAAABIAAAABMEQCIDki/7Yb8oB+c/1mgOjOB1UH0/Q1lJqIgrWuheW8YbSBAiAIlkdqS2kWa6m9nWmaBJyxM81mQWm1ZgU3KB9P+H93RAAAAGgER1RLVAJautnlGFFv2q+9zblwGzf7fvD6AAAAAAAAAAEwRQIhAKQOUyNlW9SgKRpNKRS+PtmNSgcjsGMDWYTuPBqgk9TkAiBIMYMXzdFOdWIvsY0Q0EHEhcjNqk4Q1F3uN0cB2FOzXQAAAGgFR1VFU1O9z79cTZGrwLyXCccobQAGPA5vIgAAAAIAAAABMEQCIH6R4C+gAQI8xVbjTJ/AJLU1hJEuP2jU1/bhyLtQeAV+AiAOD/Ag23BtacPHr10ZdWdEbZXJ8V9gFrluC+Qoi57ciwAAAGcER1VMRJhHNF3othTJVhRrvqVJM22cjSa2AAAACAAAAAEwRAIgFM7aBQVqkUkr1fKK3LqSw7esVyKbQ5pM7+X+OUB1t6gCIEnX4Jf5hDJffias+KgQVWpfMF8MpEVb0jZE18kA41PJAAAAaQZHVU5USFk2hLWB2x+UtyHuACJiQyn+sWq2UwAAABIAAAABMEQCIA7V2ZliboqWjU+KtCO6Q7+4xAr5PYZKeN1S61Qk5cORAiAeh5+36GfyqoLWTckk4nHHvcRTkxC3ALlKqNdgbCgkZwAAAGcDR1VQ97CYKY98afwUYQv3HV4CxgeSiUwAAAADAAAAATBFAiEAmi24QjRAkH6TgMXFG5jEkqqCD497RghRyNVWuaXRqjgCID22rC//EqZdtyl4Gu9Ncs6goM2bHlIGoqo51xnr+qzJAAAAZwNHWENYyjBlwPJMfJau6NYFa1td7PnC+AAAAAoAAAABMEUCIQDoEJnGYsYxxGx7jNgUS+CWLYa92Wvd+BaSjaU+6+OHEQIgHdJXxUJF7AExf/1mRj+7SkFiUNMFO1yJAY5x4I3BUHUAAABnA0hLTp5rKxFULyvFLzApB3rON+j9g41/AAAACAAAAAEwRQIhAK/TSnz/s/saiVdOuTf85/sm+rhbFfVS2XvarMi8ip27AiB2DtMxSykHTOkASkatu6yP3LwOHDExpC/Slz6Tb3ZW+wAAAGgFSEFQUFlaVn4o2/orvT7xPAoBvhFHRTSWVwAAAAIAAAABMEQCIBsSxN1WmG8v0zwIN+PzJ/xouIbUp1HVBaQo+4kHr3YQAiBQGMH+Y5x4CGg9pKiqlymLVartm//eQ/18qTCBdXHlUgAAAGcER0FSRFxkAxxiBhhl5f0PU9PNrvgPcumdAAAAEgAAAAEwRAIgJn9osb4WeTfJB30uB4hwouu7xZUA+A8zKQX+gehYhqYCIDAC2HMyjoWe1DLQHWQOP8uzF1LJlxavUesmhLGoOHk7AAAAZgNIQVSQAtRIW3WU4+hQ8KIGcTswURP2ngAAAAwAAAABMEQCIGgT+giXrVWu0MClx9ii/vWmgrV0DhVvr2P74/Ap1kF6AiB0i4sOt89lgQszhEJUlai5wp4CskGNSKGurZ+bWjS0kwAAAGkFU09MVkVEbJAz51FtggzJos4tC3MotXlAbwAAAAgAAAABMEUCIQDhkmXTNj/tddpIhnu3LKkBe2Ao3jvteidJ87Ayibn8GAIgetImVSMd7NgQ2bhnEIf99SKH/nxBQNrWSPx5x85o3oMAAABnA0hUTktLHTidT04IKzD3XGMZwM5ay9YZAAAAEgAAAAEwRQIhAPJfinCttqWKRDExK5zbVQ+sgorITD40S6a2MtkaQubsAiAUeg0tEkjRclw0M691A0pSKHzJIG9w3dLHQ+RRNM45QAAAAGYCSELiSS+NKiYY2HCcqZsdjXVxO9hAiQAAABIAAAABMEUCIQCtFaCWm6JXVk4pgiBRtTjV2a/FE4HZf5aaHTx+WxvgMwIgZOyUXIgJLcvv6mIrA/3idkXfCQYjICW+HeuAEonTyU8AAABpBUhFREdFH6O8hgv4I9eS8E9mLzqjpQCmiBQAAAASAAAAATBFAiEArNpGmOZpu2ZGR0v0b7IBDWczzOvAT1qfc1QBe2UdhYECIHbheRKnHGYJbWywwP1atmjr4rUe0JxUJf81UySIuP9WAAAAZwNIREf/6Blrwlno3txUTZNXhqpHCew+ZAAAABIAAAABMEUCIQDk07beFtFl1DtitxuL0u8C7NN2uR+2gb3uUDII4WD0kQIgARCZ+ughGQXfnhCpfCrFWOBCi44SAVc1cuYnEPZgzRwAAABtCUhFREdFU0hJVB2c0hgP1Ol3H8ooaBA00COQsU5MAAAAEgAAAAEwRQIhAIe43UpOfron5vBFTui1lsanvFHI96MjaO2Jk04r9ppbAiBzQymHhyLY+RaOjGN5toMfRH+Wq7AMb6CCfQ9QaU7UFwAAAGcESEVER/EpBHPiELIQioUjf7zXtutCzGVPAAAAEgAAAAEwRAIgRGr2rAtknzd+4z39fZx/8geIAwU/uxjdyi39MF7KP/YCIA+a8U1VRhK3r/ck6QIArSTKZO545MJsIJ3mKxDmtEjqAAAAZgNIZHCEVD+GjsGx+sUQ1J0TwGn2TNLV+QAAABIAAAABMEQCIFJtFniWS1j5pfiozkh7bCYe8LFkHHXuEDK41KQA1gaTAiBspewxJmxGXF/CcaT6jAY3u49/Ye17FCUj2nRktQ3BjAAAAGcDSGRw6f8HgJzP8F2udJkOJYMdC8XL5XUAAAASAAAAATBFAiEAvNKqJZF1SHbJJBhAAP9qRMJih1TR7AeX7wXdpYDVapcCIGuADd7Vfn4Hqx920ZIibLFjxMindrVv2yutzp2B+CWJAAAAaAVIRUdJQ1hLwTx9QRwAwBpi6AGUct5odoQwAAAAEgAAAAEwRAIgJo31ISKo/TXQqcl7Zoqr50UAiAephDnNu0MpLFyyYaECIDIGkCERCF7Y2RXw+7umWzFtXMsK+CfBoltU1M/yLr8qAAAAZgNIQlrjThlE53bzm5JSeQoFJ+vaZHrmaAAAABIAAAABMEQCIHKdkDkPOpfq0+7PqtjcV+MLPoS7dR9+I2Ke/sAA4lFaAiBlvEDDef2J7VB3uHZ/1O430tuHZn4RIA2Zd6vYgd2F7wAAAGcDSExYZutl16uOlWe6D6bjfDBZVsU0FXQAAAAFAAAAATBFAiEAjA4UXc0iB/GkKvEwOow4yrGK8ycvfID0F5p2XfHaufICIEA4ZxklRsJCnEmvnj/xjL+f+rf/i9MvpfuNPPRk0jwTAAAAZgNITlQIq66a9nE6wUHYXgtq2CW7hfOSIAAAABIAAAABMEQCIBZwFWm1IQm42qDWns+eulLSX9bcvpZ5+IwULvZzwLEDAiBBo6AqTqUIB9LoXyZmz+pzDqqeCW2T6O7dArRrYC8+wQAAAGYDSEVNGXR4FqAw/s2jOUxgYs32ubTbDgsAAAAIAAAAATBEAiAqqz8B2No8TDxdqJ/QBP+/nZyXAkqGQZOKBZ+c63VxegIgG24cDWerunKqvZhiy5Dd+pWDkH6XUYI4Wg6qYcmJCsEAAABnBFBMQVnkdykvGzJoaHopN2EWsO0nqcdhcAAAABIAAAABMEQCIAfZqoDScNvWZEf36aZZVMhGs0yHf5Dqx5LERbRCEUBhAiADLds2oV0OTABgYQWLoSpHjUEVLSrUVMn+I+9yRgI40AAAAGcDSEVSSRyaI9uFYj7tRVqO/darqbkRxd8AAAASAAAAATBFAiEAjWIUVdFkoasLLvFsBT9TiWaZR+52+RFok5exHMlRquUCIAwwKaWnVwol+81qaCr+mhmZmZNk76dll+X1WIOhp9zmAAAAZgNIRVgrWR6Zr+nzLqpiFPe3YpdoxA7rOQAAAAgAAAABMEQCIByXuYfHIwQSI4SAoJizSg5IV5l9YO3mSTe6JJ+RPsZjAiBqjaXmMhMsn5fAfBpIPDp8VJtR7gWtKUdBm6LBKejMEAAAAGYDSEVZ6cnn4dq+qDDJWMOdayWWSm9SFDoAAAASAAAAATBEAiBCjZEml42BJONmp2F5uTehyuvTVGLCjf+P71lGtA3FcwIgBSAXENuhnE3z6rz5RM2ZZYF3pLcIs+sQ2mQlDAUhdXIAAABmA0hHVLohhFIKHMSaYVnFfmHhhE4IVhW2AAAACAAAAAEwRAIgIodYcn08CFlPLIlw2lOfJX6c2k4co5dUXCWe5sDTHqICIE9TPQvsrLyrXYM3ikyC9b4x/FU1WSvyF0+4iP+HzLg0AAAAaARISUJUm7HbFEW4MhOlbZDTMYlLPyYhjk4AAAASAAAAATBFAiEAyz+fp5SKb02A+It1f0Lkl6C9RiRKvNTgIztfu5WlLHkCICYz1m82iAvWFjJh6nZ2PQBGZvlzT+hCOmnwkfscfTJ5AAAAZwNIS1mIrJTV0XUTA0f8leEJ13rAnb9atwAAABIAAAABMEUCIQDOz6sbrC3cyEp6JpgD9M/WGu3Fj8LR+rdD800SSWVj7AIgKy27gT9dmMo/wVsEYDvutMyOzxdQDanVwAy+5iCl7DkAAABmAkhWFBq7A/AB3t7ZoCI9T/JtkpEXty4AAAASAAAAATBFAiEA5WoSHyRqd4PH62UsDAiQit2gACRsZe7iJqUQNNKtliwCICCLTl4GBGNHW2TzRoEb8mAjfoGyRz9+At8z5gmKKW+MAAAAZwRISU5UbOIeX1ODyVaR0kOHmoamAl4IcMAAAAASAAAAATBEAiAkODJJsRAtxpC7DKfmNb1PCkJmgJOtKm1MvRPhg0CxKgIgRoXeh8sK3Vsg6hJ9BEXD8MSAjiETW8QqHgbcRtUY+1gAAABnA0hWTsDrhShdgyF818iRcCvLwPxAHi2dAAAACAAAAAEwRQIhAIwDrtg9oas2UvMebUmz9hckQiXmQjcypMwbjZKZ1QZfAiA2Tq2wYor8YrpH9kkkghAo/4wiSZvDo6XkCFDWyjt8IAAAAGcDSEtHFPN7V0JC02ZVjbYfMzUomlA1xQYAAAADAAAAATBFAiEAq9D+3pVQxjhfbjsojUVBpbB4oE16ls6ngFh/FRKQBKkCIGW6WuW3Cqb7ap9CxvjX1V0oAdfn0GRTb9nEDgSf115iAAAAZgNITVHLzA8DbtR4j2P8D+4yhz1qdIe5CAAAAAgAAAABMEQCIFudnPkGhPyCdVIQBERrYLxtVNeFYylUiJ5m/F/bfPP2AiBpMzNiTPvEzwEPwl3IXtx3vPvbUcGg3Rndj7ARNSHIDQAAAGYDSE1DqguxDOwfo3LrOrwXyTP8a6hj3Z4AAAASAAAAATBEAiBgiQNwGJ5CVV9J/sduDdx1aW9eDs7X9YllnzenrFw4SwIgZar6np80yM2pLFC486LqJVr3FJ9IwCL/ObIq8/CVuC8AAABoBEhPREy0XXvEzryrmK0Jur34yBiyKStnLAAAABIAAAABMEUCIQCtOi8zeoh8TJn4ZLvRuLJ05T1eD7MqsbI58qnfM7472AIgVzhJvG+K/PuRaxjI4hASY8kQu+Ld24pavJ2RxkgaTzoAAABnA0hETJXEvoU01pwkjAYjxMmnoqABwXM3AAAAEgAAAAEwRQIhAO9rHz91XwzDR/QCWiIhvGxjziLDxlICzAFdfa14wM0rAiBlE7LoJeUnRKzB1iuz8ax2NSX6Jve0dACMTGRwWlIFbgAAAGcDSE9UbG7l4x2CjeJBKCuWBsjpjqSFJuIAAAASAAAAATBFAiEA/ekbA9fv8lvgJhcgOJmRXuTurgUJSD6oJqoLgUUvgoICICU2SMCnmvw9/5+vDPhYP+511IwClIEyAQFyFiS3/cGnAAAAZwRITlNUnJ/jvWCyKpc1kIuViQEeePICXBEAAAASAAAAATBEAiBfe+3yjhpK1GQyH9vAf6WNAYQdlKzhNDOhPbqnvsKbDwIgcQA9kLKLr/+jPNPH9sqh3ZudQK022XrkFeQsUNVas2EAAABnA0hOUoT2P0j9FERh1ClZmoPOyWXkcAubAAAACAAAAAEwRQIhAO88LwMB/R+ISgvRSyac8EpCHtctPJ5qKPdd2RN4OA9lAiBzWI3/27YOdvP2wacKw+OiUrZtZnfh82FE77BTLCfnRwAAAGgFSE9SU0VbB1FxOyUn1/ACwMTio34SGWEKawAAABIAAAABMEQCIBO5tZ1I9OM+PB3SPZkbla1hYKX5coJzUjxb1pOSpKmaAiAZBUybSC02FtFwWaUiYnsn+N7HVSJs/jdK9nlUxQHxeQAAAGYDSFBCOMamgwTN77m+xIu/qrpcW0eBi7IAAAASAAAAATBEAiBQDdz/PrQ7BwfryMoCSkvu2BRy2OYjFZgu7kTyanpS5AIgP/APnwE/h5zxeTioxtC+Y5XUVi+MqhOsDDiyCi9caKMAAABnA0hTVFVMILfEhr7uQ5J3tFQKQ0Vm3EwCAAAAEgAAAAEwRQIhAK6xKtI8mfplMJZRA/foH5KAGDQHt4KAiSQy74bwZQXvAiAq/oJ2GsHvoKYqyd3aFs1dyKfX9rQgfew3GtnlfBmaPQAAAGoGSFRCRUFShut5FJW+d323YxQqLFR9ERJVT7gAAAASAAAAATBFAiEA1fnB/z/uaS2d67BGhcClUiaGg8Voaap5aJKagVLk2PsCIE82sYtpZlbiVXMzxDw0P9wZczE92FTRJxQ9KZJ/DP57AAAAagZIVEJVTEwNXiaB0qrckffaQUZ0AYCiGQ8MeQAAABIAAAABMEUCIQDrCCZotR5CGFzXchJBe3xk++AIHDWCi9cKnMs23hDv4wIgF/khIIzFW/jxdtAz9MeFAge7tbzIpQSp2NMHZWoEL2YAAABrB0hUSEVER0UwCBhv5uO8ptE2IQWkjsYYZyzlswAAABIAAAABMEUCIQC6Pt+lrMNbVo2eQYcvSmsb0Xo04Ai34c+Ec/omOs6wWgIgOFR3Q64qBB0slLL57kn/IfOyRDCr9Dodza1qZfCLjmYAAABnA0hCVN1saLsyRi4BcFARpOKtGmB0DyF/AAAADwAAAAEwRQIhAILwMf9zhKUjBNrjTm2FHF9PFwBZfIU6V0FXfrZmYUo4AiBcZOt2Da6d8F9z0GGYqYmj4QiAI1olwX0U1TSgTXz11QAAAGUCSFRvJZY33NdMdneB43vGEzzWpoqhYQAAABIAAAABMEQCIGUNlWkjCut8LCkDhw9X4rMYOYgbZotLwfJO/+KzD0F9AiAYIvwGV7EqkuMpb2adJqkVgZ4XRYx9GmjmvbOy8wUhQgAAAGYDSFVSzbfs/TQD7vOILGW3Ye+bUFSJCkcAAAASAAAAATBEAiBj1POWUyMNOtkcWVUpj2njegZW0AWQLHH3qej441ZNjAIgAO1M++UW3568GHrOyKWP/O2LBxEpWU8f45EydjrLNWUAAABnBEhVU0TfV0wkVF5f/suaZZwiklPUER2H4QAAAAgAAAABMEQCID51+m/wI2Y2J9UP6zxX34wACwcc6LI6/akHglS0StkVAiAnheJL9LOoGvhoCGSzX60pAWRj79qUGw6EBl/FJNVxKwAAAGgFRU5UUlBbx+Xwq4suENLQo/IXOfzmJFmu8wAAABIAAAABMEQCIDEUnkWG0NTpGfKQrTcb1ravQkxMOPXU8E+l16Q1lg01AiAwwYDCrAd/ZiFypKK7mhY8z48UoHf5RMkiDtreA6J+RAAAAGgESFhST0vXBVauP4puxsQICgwyeyQyVDjzAAAAEgAAAAEwRQIhAIe9MNV+doDKkc58mh/eGszInwGpYS1K4ePRhfrNYs3gAiBNzLweyfV/q8HF3T3PLj9OD0acnETufuUQBXx9DZpYcQAAAGkFSFlEUk/rvfMCyUDGv9ScaxZfRX/bMkZJvAAAABIAAAABMEUCIQCz1VEco4JD2NxBNRQwutvURyIPwaCkBTwRBOXKQG2KpwIgKnqj/TWBGyn73krgGJNUAPmf7IFDjvVKJ5jAeTCo8jMAAABnA0hPVJr4OWh/bJRUKsXs4uMX2q41VJOhAAAAEgAAAAEwRQIhAKxd+7Ixk3ZpGYk+m7bdU/Q9wPKsq/h0Hlp0MXiJ/h9vAiApmMK9SvDzZ3T1gWC3BM7/gnTijrepWW8VtXrFvTemtwAAAGcDSFlO6ZqJSmnXwuPJLmG2TFBaalfSvAcAAAASAAAAATBFAiEAva+PQIFalYZKJDWLEFp6JzfPgVFFwd9Svk3u0TKs/2YCIFsIug6PdDLUauE0CnLqmfJODdSaJYT+gsUKOSR83IwjAAAAZgNJSFTtqLAW76ixFhIIzwQc2Gly7uDzHgAAABIAAAABMEQCIB+Hs2JGInYtv4QzvAixfD/D8DFIXwxn2ok+vIQC10rUAiAx39nUGyJ8IsfR/yOo5QSW2CSMALroFq+k8WCWSrhWAgAAAGYDSUNFWoSWm7Zj+2T20BXc+fYirtx5Z1AAAAASAAAAATBEAiBnqCtb/tAFjEfqG8yuSIUx/bfUurAxjFiy/Nf+/DItqgIgZ5zkLNMDZAnHz6BeWUyUI/vcDHJAtC8ciKOybWXz0P4AAABrCFJPQ0syUEFZDj3jsOPWF/2NHYCIY5uod/6010IAAAASAAAAATBEAiBVXO+KJyxG+O7GmRuKuABmgUEaCnCqWISaw/ZuN8L7MQIgWyKE1R8OK6BRhD21hZKYWwQaYD5X9730Tdppxn8kbp8AAABpBVJPQ0sywWtUL/SQ4B/MDcWKYOHv3D41fKYAAAAAAAAAATBFAiEAvQq/VGzd4S5As3XGBWKQM5u2Dxyh1oxsazmPJaNaCksCIDsKFslrXLZzOg+CxprJBwl4cceXaMSLoLkouefS1Yx8AAAAZwNJQ0Q8INZ7axrgmF+ROrtzl7q8L7saHwAAABIAAAABMEUCIQCqx7UBBGM9Cw6NMPjdoQ++v0Hg82nx8L6op41iorFwcQIgImvb9q8iPKNn/Rn9oi0Hkz4BDssUg3tDMYbj+WL0A4UAAABmA0lDToiGZspp4PF43tbXW1cmzumah9aYAAAAEgAAAAEwRAIgEJyne9BmcfwW0EEG9olGn9UfBCqtRZbh8tgkT6VDe6MCIBFIAho0EFgFjQSrU0EiAU2rD78MH3Tm5HlsjjJQIyaXAAAAZgNJQ0+jPnKb9P3rhotTTh8gUjRj2cRr7gAAAAoAAAABMEQCIBQtZtuz+Axikn4gP0JOtHOT6Uz0gBJwtrgfENcJ4a7JAiAF0dLtAISbbnSooETHSps1hayWXPTmOQy5meXyudmpUAAAAGYDSUNYtaXyJpQ1LBWwAyOEStVFq7KxECgAAAASAAAAATBEAiAXMXVvceBRJC+Dtgj0WPrNtfKJAk9vawSFxwcgsXCCFwIgYO1KWbe6Sd9mWH5KqLZCCBd2nvzqBG6m/ea+tRscTLIAAABmA0JMWOWnwSly87v+cO0pUhyJSbivaglwAAAAEgAAAAEwRAIgEpYMOSyuB3NTOFodjAgRYUA0kznTLrmOLY+j0ihngMICIAnaaCowCkiKtuxXqcLzhilEJR2s5hBVGdvTqsu0btMQAAAAZwRJQ09TAUtQRmWQNA1BMHzFTc7pkMjViqgAAAAGAAAAATBEAiBMe/MuS9WZ7ogeboEIwk95sKUT9wDXVdDZaKXt/f3ZIAIgY+0mhi5uB0aGEQx2ffo6V0lR30WNVh/fS7bU0VMKhFEAAABnBElERUGBTK/UeC0ucoFw/aaCV5g/AzIcWAAAAAAAAAABMEQCIESww3iglwjCc2AT9/dGfnkHOsEE16dUt5ExHuGPl2gDAiBZz746rsyMcyUxRoAZ3kgtuhykqA3hxUVsS1DKwFDc+QAAAGcESURYTcwT/GJ+/9bjXS0nBuo8TXOWxhDqAAAACAAAAAEwRAIgFULAgfjJt+W0CS0udU6KfiYeePAt1oOSbQr0drKmkiACIBzoswOWYY0s3RGmhR8JElaoA2X5uqac6tYasUKKlcOwAAAAZwRpRVRIhZqcC0TLcGbZVqlYsLguVMnkS0sAAAAIAAAAATBEAiASoeiECqas50UJljjAj5Uvxn8vscT/VYaoAKYfMUiAUwIgfsSAVHUMlntf1U/dQpy2/sc35XT8D1ZSqsYAs5QKxVEAAABnA1JMQ2B/TFu2ciMOhnIIVTL36QFUSnN1AAAACQAAAAEwRQIhAO5Nc02sg0Tyr5hZ9svNPhu5xlZH5y94p6171SxOuKg+AiBjOK//E0l+plsF+rzVGnkfmBJcGZ5FR0Dssqhg171cNAAAAGUCSUeKiPBODJBQVNLzOya7OkbXCRoDmgAAABIAAAABMEQCIF79XaySiPPhsI+ZlmYTHjXG4X4t8ENkkuct7VzKVq8/AiBIgsVDWVdxoDaFYx4WHoRdsNIJNlHYq1kJpBggmJYRjwAAAGYDSUlDFmYvc98+eeVMbFk4tDE/ksUkwSAAAAASAAAAATBEAiAzGJkbpvpXEWPx1U5Z+O/D30opZIU6FhPYhCAWRBhAwwIgdMG1pjQdXJJMbol05SIvOYKgIT32AE48jRg6TsIEYbIAAABmA0lLQoiuloReFXVY71np/5DnZuIuSAOQAAAAAAAAAAEwRAIgT1Iy2mF/LuagrXwBIk2JQWo2OrXw+36ONja5+ykTadkCIGKHaXho7NpJoKNBqsIpAEiWbGjJvuopjIw4mseM+91yAAAAZgNJTVQi5fYtD6GZdHSfqhlOPT722JwI1wAAAAAAAAABMEQCIA5Pw1TqvUGsZZJoCuftMQtEIWVBxfAVrCMsqg+2txkuAiBdwXZRkGXgCgdnbsMEiOnNYfCQ2mz/+LT1TJT+oJUXogAAAGcDSU1D44McWpgrJ5oZhFbVd8+5BCTLY0AAAAAGAAAAATBFAiEA5eX2Nvex8lVwVHF7+ncWEGANRqOgPn7uXdWKzbg2FGcCIEQhvqSPkrclubg35F0hr8JQSxnY650ySr8jaR1OL1kGAAAAagdJTVNNQVJUv+A3B623W0eK3ZoBl4BXgD9IDkQAAAAIAAAAATBEAiBNczsXfa5Jq3sA6x8TnzxfC3l1niKtMcflW7GFDgp7CAIgabaOyAXD3tinr57hB4x4fQ6+aWHqq9+a+j6mluu2jVsAAABoBUluQml0nBLZsSIxMLZBFU2NPbNfkdgcjf0AAAASAAAAATBEAiBe+h55K0BmSZYIeYXqaOob9eb/TpngsXuiSoHZFva1FgIgPV9YRbW3+vEEGWPOE+nj+tz0nkA2E8Y7Oeq4iMiAdSUAAABmA0lESFE2yYqAgRw/Rr3ai1xFVc/Z+BLwAAAABgAAAAEwRAIgGv/6vGQQub1xEiyNmjae/6uMP7zprcOMnXgH8bxe+s4CIFuhwu2dW0vXsb27StnvnrMA7JH+G3F2yGo8wfnFBqCrAAAAaQVJTkRFWAlUkG2gvzLVR54l9GBW0i8IRkyrAAAAEgAAAAEwRQIhAJGeuBTdF1pGI34r+lT911XcV58LAmGM2YBMpxopkOvvAiBFmPrtDYn+jOwpLypHpjA8CYuAjgxffNaYoLNHf/VYBAAAAGcDSU5E+OOG7ahXSE9aEuS12qmYTgbnNwUAAAASAAAAATBFAiEAijqAWGL/pDJCM++v3dER1oWoKK68FQjoiuLGu6lS+VUCIHcdUl2ZbKwQssreWVUvP/RvqVypvm1eAIdjhO6jHAgXAAAAaARJTkZUg9YOeu1ZxoKfslEikGGlXzVDLE0AAAAGAAAAATBFAiEA+FYoGoZc48q5e/tcEulVFqU5/zWMkbYG9urq0/rJUnQCIDVOYxF3Kt8hhKGAgnntohdUNd/+TnL6wznmknG3tLj2AAAAZgNJTkriizsytsNFo0/2RnRgYSTdWs7KMAAAABIAAAABMEQCICpvKW+J+J5MYwK0vIshekGfKM0XaiiY0/47tWJznFhuAiBE2q9ur2zjU6C5o08naMLQlyi0oAGw2IaltZrew74E9wAAAGYDWE5LvIZyfncN5osQYMkfa7aUXHPhA4gAAAASAAAAATBEAiApC/6cSYCV3ZblfHuHLkKvD1OG55+3U7DBnudS0EEz2wIgVw49e6htX5f9mzjH7vY4aCIevpiLi7PfVs+ImE3bVA8AAABnA0lMS/eEaCyCUm4kX1CXUZDvD/9OT8B3AAAACAAAAAEwRQIhANBrt8ujK8JaZZlweT7981au/aYL5FqvKa3z9nCRdq3vAiAsLSBoRR88DaRT7bBXBlJqFettzDS+oNb8W1sUhcCqxwAAAGYDRElU8UkiABovuFQaQzkFQ3rpVEGcJDkAAAAIAAAAATBEAiAL9Q67UnFJL4+Fzf4b6kZtGwkke6rZWyvhpIuuoTsGDAIgcntk/nKYyLqD6jrmhii5jPRdMDZx/b6l++g4nGBVX8IAAABmA0lOU1suSnAN+8VgBh6Vft7I9u7rdKMgAAAACgAAAAEwRAIgRq3cZyqv/SymElXfya/lu5AjE1nEDHW3J8ge3SkzD1YCIEfjJAJC9VEE7P/LQcosKCdOqJmMRh4XG2u+uVOUmgfAAAAAZwNJTkIXqhiktkpVq+1/pUPyuk6R8tzkggAAABIAAAABMEUCIQC9IK06lycPZ7aePsYAqvBx2fO68kU1PreTkS12TCdiqgIgdeqpqdunCxiGYWOjZ/BxTsKiwd5HX3dHqaOEo7MFc6oAAABqBklOU1RBUscv6OPdW+8PnzHyWTmfMBJy7yotAAAAEgAAAAEwRQIhANeNe+li5kyYJYcOIsB+9qav1QV/bLxQ+FtoaIQgWisbAiA2X0OfppNlo5WMWRaH123fGFcrzv3hr8fejStQ/om8fgAAAGcDSVBMZM34GdPnWsjsIXs0ltfOFnvkLoAAAAASAAAAATBFAiEAv+fbF1lc5XFA1fB92WWWlbIBjvbZ3NyTWUCH1y9tRygCIH1f2/adMlzkD6/l6lHDA4PW8M+SlUPShsNQxmtZIBRoAAAAZwNJU1LUopOui7ngvhLpnrGdSCOejIOhNgAAABIAAAABMEUCIQC8/dMBsfHPAancOhjYvL2osrr+F/3GeWKI32K+0yjMMgIgDu/mFbiHr3bKhtzFlnmq/rE+hpR4Mxu88505F1m6LaIAAABoBElOUk1I5UE7c63SQ05HUE4qItFJQNv+eAAAAAMAAAABMEUCIQCzYiaOPjpdo35J5ZRkxmdzcwT89pvyVVqJ16xMCYAAbQIgQHyvV7YZvTTeM8GcXhpUtC4MSAVoL893KrOHDwswas0AAABnA0lOVAt2VE9sQTpVXzCb92Jg0eAjd8AqAAAABgAAAAEwRQIhAPEX8iTMhryVVbcV4Otqr6se37/lnmAfn9nMQ2kZQH2MAiAl4Ov20M35angHT3jC1gTVl4lqO/KVBWHEwGtAEprgogAAAGcESU5YVKgAbEylbyTWg2cn0QY0kyDbf++CAAAACAAAAAEwRAIgZjspTplOI6IYVSz9LtkbAZdsqV505qF3b7m6f3CUYBQCIBws4PLsLADJDehLpU5oRJWmXZMxYmzuQkrlJkBE2v12AAAAZwNJTlbs6DYX2yCK0lWtT0Xa+B4lE3U1uwAAAAgAAAABMEUCIQDqhrzWRytQm6xJ+6jPqaFB/QoHmz+jjTjteNMUB7Qy3wIgcZao777n60P6PElSGPb1Fpzx0GJ4Tws2FQEDuiSTJLMAAABnA0lGVHZUkVobgtbS0K/DfFKvVW6omDx+AAAAEgAAAAEwRQIhALVgTNdcLAc5Tz7b0GMx9iJ1gSZL7dqZGtEtTCL1T26wAiAPiiN8gqIJDol1RIhrPRSe0SAXmtpNNwQGpTfhAhwq8gAAAGcDSUdQjfG+D99xYab/VsgYnX4QNYcnqWwAAAASAAAAATBFAiEA1LY8cO06Ukf1fi3nCa8EjxKEH1c97gU4vlpSAw1D8LMCIAag8qthN5yUr72Yh/lxugaUnrBz/wXkRKWXq+39POy5AAAAZgNJSEavElD6aNfezTT9dd6HQrwDspvVjgAAABIAAAABMEQCIAjU7/s9TeLVHJh+9+qhuSjRDI3OlcICXXUlBOtA7MGMAiBRXS2xABUPTUslfe8dKJOJ3qWQTeoyBKPsASosjei39wAAAGkFSU5WT1hEhVYdt2YU/3J/jgo+qVaQuLFgIgAAABIAAAABMEUCIQD38FtGD6qnBxT1AfuHP12uGOc44oSPiWTcXMb4jFa+HwIgQd/5mFc9Fsx5nPdOYdhISiLNcbOjdazpyQbKcCmDsqsAAABmA05JQVnCS0kDZ2y7s6jxB37wAp5kGc7yAAAAEgAAAAEwRAIgcABSWEAC7/WKCXyLE2GnKbhiXkmOFk+AC+4O4vaWVgwCIE6/Lh79fDjPQidY6lpFSr+FcYapoW2QmbGnpt0teM2/AAAAZwRJT1NU+hqFbPo0Cc+hRfpOIOsnDfPrIasAAAASAAAAATBEAiBaJfszVqQMPQk6etkzaleKWHJTpnEUF5KFofK2DaqDxAIgGp3ex6Ol1tIjWP3nEcxelwO4nPMmgM2YF/wPV+bUQYwAAABmA0lvVMNLIfb45RzJZcI5OzzPo7gr6yQDAAAABgAAAAEwRAIgDif5X8ZlpOoB9c3PJdes0ygH7/Bwkvq4LV0tp1G3w0MCIAMDiegJx64ZCC+C+afpMrvcS8AhFNeQJ0PV1/l7WIVcAAAAZgNJVENea22autkJP9yGHqFgDrobNVzZQAAAABIAAAABMEQCIGm76jX8oKVx9sOZ8wnYoEPJPiT7JluehNbn+gSbC2JmAiB6NKqtnyys8QPzg1hOYjGWMAYhjYAvAEysl1L3T9jrygAAAGgESU9UWG+z4KIXQH7/98oGLUbCbl1goU1pAAAAEgAAAAEwRQIhALzmFl7GWsDebItf3N7vuI2K8aLGedg63BM4fq/A9X1VAiBwyjJ4UJheoLESNmxE+NsGS+DtlnfDbjA7cqIE3FbMfgAAAGgEREVBTMhqOsmkmXkmYx5ljmMjXsi1Jsl/AAAAEgAAAAEwRQIhAKBN9kPPyDxsCFmP61sK+7+dqBZQw3E6bYqY9zjcqToGAiAbPUafvT6TZSWYn5iB1ZlZAz47egniEB9xhcTZbKmUjQAAAGgESVBTWAAfCqXaFVheWyMF26srrEJepxAHAAAAEgAAAAEwRQIhAPqQTKEi+uC2/byQsct9KRQCo3jf5BnxCq6Gva7pglfiAiAGs6W2dqG0dmVWmbeg70DprqlyqfcP8zSPSfMoOihMtQAAAGkFSVNUMzQM9xOxHJuYbsQNZb1Pf71Q9v8tZAAAABIAAAABMEUCIQC2KS6IohDQOhYJqD0Zi58mUZW1HOm3TMrV7GN6wWtN4AIgG9hzlTHRA2z/59oF2pbszOXcLfauXBlNmBgxIcaAIlQAAABmA0lUVArvBtzMxTHlgfBEAFnm/8wgYDnuAAAACAAAAAEwRAIgQ3N/JP5TcB2nOqliVMp/AS0r9yUvzlk7xfF5U3NsGZQCIFTdD4cnAvo5RdRAzljj714Wwg0DaR5k63ORYem+bDPgAAAAZwNJTkck3f9ti4pC2DWvO0QN6R8zhlVKpAAAABIAAAABMEUCIQD+kXL29i5uK+lw70et+3omQ2gkxc40o3avhPVB8/ftTwIgNQROKJKGI68F5IAXyvnQCQOuaI6kl0AqAijL/cr6PXYAAABnA0lWWaTqaHoqfynPLcZrOcaORBHA0AxJAAAAEgAAAAEwRQIhAOjmr0W1+cn+17RVIBeEAQWgs8CMULg5F2g0vjsVq6OWAiAA5W64/wWLUTe/eEJbQH8VPgooLKPtnNvBAJ7n+mEgEQAAAGcDSVhU/KR5YtRa39/Rqy2XIxXbTOfM8JQAAAAIAAAAATBFAiEA8qvwyPq3TtBD7v+5qAdzFP5d0GJcRxyIRhN7CW4S/RgCIAHKLvl+HD20/bEz4onBx16XcuY+5sJP0ejBY2vWMIYEAAAAZwNKOFQNJi5dxKBqDxyQznnHpgwJ38iE5AAAAAgAAAABMEUCIQD6TcbQzSs5wykPjU/yLMevW0vQmKbqkzOPSKng8hp/MwIgRKPxJnncYu9QSShUQa6IdaLg0CIRB6HH9lnBhu741OYAAABmA0pCWIhOOQLE1c+obeSs56lqqR68JcD/AAAAEgAAAAEwRAIgP+ZJlcJQa7UNv3KPXCk9a8hejYYPamY+HGrNWfNst5gCIA5h2dFZGkJJOdUDSLaqSKfBMuoKhvvTqvZ1Eg+Els2+AAAAZgJKQ+LYLcfaDm+ILpaEZFH0+rzI+QUoAAAAEgAAAAEwRQIhAJEfgQZ0vEJI4cefMbzk9btdOE+27/9VQwqa8cLvShsYAiAK12rFKrs5u6f/vRhO8hiR0838YHaGS1h73PG4aLJrbQAAAGYDSkVUhyfBEscSxKAzcayHp03WqxBK92gAAAASAAAAATBEAiAsCG0gdBBoTrTuL842pHQK7isAdoHkyoC+qBzhEAZC5AIgIzLDJP+oh0KFXoABahOk8hSDPEZtGskOMGyZ7qpeNqMAAABsCEpldENvaW5zdzRQM17U7D20WvdPNPLIU0hkXTkAAAASAAAAATBFAiEA0nvDspKcpfQ5zVYZGUN/DsbUv1cJFL4VeRcpHLSqa6MCICy4jjht9W3sLiUNZEYyLNn4pJZZ+baZAWfr9YGWkaqYAAAAZwNKTlSl/Rp5HE38qsyWPU9zxq5YJBSepwAAABIAAAABMEUCIQDYZceuzQnFJNwMhC7cFg6tZrVHWGv2lDFO8RcwxNtr1AIgFYmxwYti5ya/guIbzd65zuGNZgf1eMG95w56b/jcTJEAAABnA0pPQt+8kFD1sB31NRLcw5tPKyu6zVF6AAAACAAAAAEwRQIhALvyCZ1IT+lSVVHCyIGwhPZWmEHIx4asTxISp89hd3OlAiBLNWEKUWLy20QkvRbtZzgFqY1qWUkxuTc+63J6PDKe0QAAAGYDSk9Z3eEqEqb2cVbg2mcr4Fw3ThsKPlcAAAAGAAAAATBEAiA6Zl30jQ0hCtzF2MVURowtA/9pAiSXDi5PG59+pnwFOAIgBSO5YrTnY8Lh1w0zNiWbWF51Q/bVBcQMJOkU/UVLzowAAABnA0pPVNtFXHHBvC3k6AykURhAQe8yBUABAAAAEgAAAAEwRQIhAOwJ1uRn83zXHpb259ZJy9ODP4rMCIdzMEFRebhmpVJKAiBH1N4ZZWEWWQT/oF14chdByHuQwMXfj9iQUa0SxrHT0gAAAGcDS1pOlUH9i5tfqXOBeDeDzr8vX6eTwmIAAAAIAAAAATBFAiEAlwNRR1r2c8rcYk0v6pYzJQL7JSDmG8F+MEwrri6FJoUCIGCLqEYjIF82LK2YQz33i0i++Pz3K40Roq8sH9v7dOBGAAAAZwNLQU342f1J0FGae5PzzoDCwHDxKU6tJgAAABIAAAABMEUCIQDxRaTQEeiGEMVwigPKuprXWtb1G3CVGYBf8AolV/7ETgIgFYcZ/f5ggkG4Z0/S1oF5lc3/kMYQydh383UZe15lvUUAAABnA0tBThQQQ0sDRvW+Z40PtVTlx6tiD49KAAAAEgAAAAEwRQIhANknP62SUrWmeZvYkRKhx0afSOp6jmknft0budZjMLLhAiBqpjMqAYaRbo0VviIZVAkEoRZ8wNuuFkEbXbJnc7YLqQAAAGcES05EQ45WEKteOdJoKBZ2QOopgj/h3VhDAAAACAAAAAEwRAIgeUTIzQSc2sEwZQNGeef4xdJyCuMfXLY4nWevTB+xkGICIA/OdNV52PvHyOOF9R7Y4yMV7x6qVLpLWucJ5isjBosCAAAAZwNLQkPzWGaEEHzghZxEqisuD7jNhzGhWgAAAAcAAAABMEUCIQD5txwmZIdupeRPokwnTO0IUEs+Vu0+JJ59bJiOynB7GAIgUaMkknhVwUGkpqEEVNye3nlpGOOYoj2jFLWNlVH2zUwAAABnA0tBSdnsP/H4vkWbuTabTnnp689xQcCTAAAAEgAAAAEwRQIhAMUfryV42Mz+7y+GHrRGbzgru5TMQLAQ0+SiQUhppUzdAiAa37tP05KlLdDajDSQu1jbUSphnygwlK4Y7G3ogIw/xAAAAGYDS0FJvWRnoxiZWQR0zh6E9wWUxT1ijkYAAAASAAAAATBEAiAzVogCJ05TUSW0rK8L3UUNUS4WhpvnwyF6hmaFgjVXVAIgUgjjOMEEjx6eUuJy9/fbr81GQlpwBXcguKDvq0752u8AAABnBEtQM1Ic61y1fE1OKyQzZBuV3TMKMxhaRAAAABIAAAABMEQCIHxpp6qj+Hg547mPQ6SHN3+56b8psJWuzVWRi1XwcgL1AiBDgywJuo+PCP2wwYHFh9HMsqb9sDBP1af2qMKkG5x8HwAAAGgES0VFUIXu4wxSsLN5sEb7D4X089wwCa/sAAAAEgAAAAEwRQIhAMLQzds9scM8+huzNflZdsv5NOJVQL4pUXEr0weQKOnQAiAsbRTkpuBM8YBTYgyHLzsi/wx8ixpu+ICmDCtU5+kAHAAAAGcES0lDSydpXgkUmtxzipeOmmePmeTDnp65AAAACAAAAAEwRAIgALBr9WP1XaBrFCtoFugkSSpIYmc/KYQqqLRvI6fcvlcCIEkwlGTnEj9531vOrQZqKwr5KZZdPZ3Gg6Mk7aMvlwsHAAAAZwRLSUNLwS0cc+59w2FbpON+Sr/b3fo4kH4AAAAIAAAAATBEAiBoT7FzlWkFHziZK1ruCHSzYLuQSDVvg2nKvT+VHgfsKAIgASYDENi/4vRBR40+/9Jgnifl0EbHpwadjaNPkWWiFsQAAABmA0tJToGPxsLsWYa8biy/AJOdkFVqsSzlAAAAEgAAAAEwRAIgacp0uKw9TLyJN6L4eZatNegETCaPQRXGtPxVgqHVwTUCIDKVnzqxCZFM47hYqsSs2UsbkKxCegki6vC8SpOf9FgUAAAAaARLSU5ERhhRneTDBPNET/p/gS3dwpccxogAAAAIAAAAATBFAiEAx0ac/0HBWra/nyaYNLAiU0P4CAKArdJu2PWYiDq70wcCIFPDzUdV39CWR1WWLvGARUE+MWV5IpLJLrjBJd5bsQvGAAAAZwRLR0xEdt7yESsqVmh4L2dUZAuYJoPqy8sAAAASAAAAATBEAiAm1Rwt7SjyC8qP1K1i24GkEXM8S8LXMMY2phg11oqePwIgcabc76xCX8iSanqzdkmu7q+dxg+ZViVyb1QM69HR7mMAAABlAktDDW3Z9o0k7B1f4hdPPsjatStSuvUAAAASAAAAATBEAiA+ltHfk7aGRyhyz2N+DBlNvTYMD9yvRfm0ePxHbqNhzwIgJpwVUNbAGWifupJuvbKLUmbeVeg2W238JEjtg221bAcAAABnA0ZLWACehkkjtJJjx/ENGbf4q3qaWq0zAAAAEgAAAAEwRQIhAKhKTeBdk0UxLSRI8Icvs7ljUzZJ5IzfNmZx8IR5ftBNAiB/NqVvBQR2XbOB4CPwNBVBV/TUYCgSqW35gbruDhjB1AAAAGYDS05U/1wl0vQLR8Sjf5id6TPiZWLvCsAAAAAQAAAAATBEAiAoovl2TJAz74Psq12YaBIymrrFGL8n9fSZ302fcX3RWgIgbWsl3A3xz888vBBjP+FnrD3oBJW4r7DxLaKUqYkkfXUAAABoBUtNVEJBK91sm/G/OWo3UBquU3UbmUa1A9oAAAASAAAAATBEAiAS4ZHG8HSxyAzMJokDml82reBVs64jgbNUGmDwdtP+9AIgBqOtSJ6VPExxT3fYIjorUqS+LQ9KBr07PbFLiZh3XYkAAABnA0tSUyKaVptnPZCM7okgZYrnvK1o59AdAAAAEgAAAAEwRQIhANJdC+i99fYz3YO7a+VQFDlDDa+G6DW7wGsYbMgxZT09AiAmXMM6aqm8nzMxO8zE/x1UNmg336ZsosPMdQMK1+9b+gAAAGYDS1BStcM/llyImdJVw0zdKj76iry7PeoAAAASAAAAATBEAiAoY1ww7ts06lc+1+TFABHtT00qIZKS7zN1Hp50fGBYZQIgNXvVdjZuxeP3d//FWj66auueKiLO1Q1gG2/Go7mDDiAAAABoBEtSRViViPwkqXlvvYcJUaLNVMbx8ksufAAAAAgAAAABMEUCIQDKhBnGr9EQ35Ql8SDo5JuFUcVS54kZ+y/vPR2fsJYWbAIgHH4tgwZwmxzDOEIjlU+ZIG07aTNNKP21nITqn9eS9tMAAABmA0tSTEZOvnfCk+RztIz+lt3PiPz3v9rAAAAAEgAAAAEwRAIgMW0YDkqYdMR9F3jbkcAxvXNQ67kNUUQKKdObaazz+C8CIGsEWrEu44bJq+BP/4LNHaQ/hpNyyzXnjLnd8rQ5HXlOAAAAZgNLQ1MDm1ZJpZln4+k210cfnDcAEA7hqwAAAAYAAAABMEQCIB0ahhlp5QnMWqqr4o0w7Vc4rNnSRyc33h2bqjkg5FV7AiAF3O+hbP1nvUBslHDDFNuf4TZ+2PFmVIIBNFzWgbLZ8AAAAGcDS0NT80lg2dYL4YzB1a/BpvASpyOiiBEAAAAGAAAAATBFAiEAipsWIuZD7Apa3qJ1fO3blKkcKNcRJU6uHwOK/QzirzQCIEqiYOcLMiJDHdMXSUEQERNMyJesElVwpnu91cvuKjXnAAAAZgNLVUXfEzj7r+evF4kVFie4hngbpVbvmgAAABIAAAABMEQCIH0o5OAZ3/dVWDVSNX1CW8dh/JnDgGJ/2pIiV20V/TnOAiAhnj54d75xma97hbXL4B19pvLfnvILsVBmsAOFnfuH8AAAAGYDS1VW9w0WAQLPeiLB5DLWkoqdYl25EXAAAAASAAAAATBEAiBSKSEcl5LypJtNU1RyaL8igigrlF9yflBj2t0wyLavYAIgQFfdHXWuoTpFJZxyq3nth8qdDbTPhxQWG7FvHBiWpWsAAABnA0tHVPzhDL9RcdwSwhW7zKXddcuupyUGAAAAAAAAAAEwRQIhAOLkAQKRo/bZDsq80HdtnHAVfi8iKgji7ot+RG1ewrdaAiBZPtp5H5bBc5fvYB5UD6phkpxbwXZ2TIyr0cpaCB5ZwAAAAGYDS05D3ZdNXC4pKN6l9xuYJbi2Rmhr0gAAAAASAAAAATBEAiAZ3C2cv/G/5WyafhVjLtEtL7JJsHcXAlMPM1X/uJGfIgIgKtcDqXDgyO8eqwVgNuhdK6wU2o9JDiez34m4xCiJ2VkAAABoBExBTEH9EHtHOrkOj72JhyFEo9ySxA+oyQAAABIAAAABMEUCIQDtxGu67LEzqPigVDct7tQ3sslbyW9RV8A07OvVAr6R/gIga5g1wv62drDOy93LF5fJo9zIhjepNOttty8XPjFCUuAAAABnA1RBVcJ6LwX6V3qDug/bTDhEPAcYNWUBAAAAEgAAAAEwRQIhAMYt9eYqwqkK4GryUb+MeHOL0zNfRK4Gp5izLTkUX44aAiAg7cx7EMJcAt9s7rSMIueFDRYiLOizZK6mRuTV7j8YrgAAAGcDTE5DY+Y0MwogFQ27YbFWSLxzhV1szwcAAAASAAAAATBFAiEAwogQr8tzCjpOMTv4jarFnZbhGLkNMY8xQIV+xiXUSkECIGN6v+teWUBNMTHOlBtMhU2Cm2LZDfMrbJE8+FnYmVTKAAAAZwRMQVRYL4XlAqmIr3b37m2Dt9uNbAqCO/kAAAAIAAAAATBEAiAZE76ZsfkaQeJ3pqjkYkjhSyYdjtHxfXajfnzaY7emzwIgHcs2ASHnBM8M9HFMIJUATBqdXBP9fZKnag3+NX4MCOQAAABlAkxB5QNl9dZ5y5ih3WLW9uWOWTIbzd8AAAASAAAAATBEAiAwEmiqX1bCleML/uxp0/0uQniXnyUH9FEqPsn42aOxPwIgLJotnvAgar0X0XR9yG7igmExeFzzqfgpVvcm6C1FJ+0AAABnA0xDWAN6VKqwYmKMm7rh/bFYPBlVhf5BAAAAEgAAAAEwRQIhAP4Er5lb+Sg80+VOpnYyPS4oHvPHH+g0IWBzlEu8Zv0JAiBDB49xaj7T/zudgmF4V4sKUgFiLjcqjX7SCfAb+pTiUwAAAGYDTERDUQJ5HKAvw1lTmEAL/g4z17bIImcAAAASAAAAATBEAiAU57l4XGzb8PVKKLd5kSpIPAM+pGzgUfxdVNT3B1GhzQIgWewtr2etHEskhpN4CTBnBQkZSn4o+ODiIwxuTwFvNOEAAABoBExFRFVbJsXQdy5busizGCrpoT+bstA3ZQAAAAgAAAABMEUCIQDMK9ErO5WZqQ27BYZxT2mHxa518rRZxb5p7PK7ctR2rgIgLmNemvEfcFxkrW4q10YXL2cGXeUOVNQNH9kJ6OqmH8oAAABnA0xHRFkGG28mu0qc5YKKGdNc/VpLgPBWAAAACAAAAAEwRQIhAIWSsYNH27DDxUc7zWk2/ZmceENL+HSrTvhBilvOOnsMAiAVoZUB17Nhtp1Wuqk9V29q9/2/tHJ97BYcOCNo2HdMpAAAAGgETEVNT2DCRAfQF4LCF10y/nyJIe1zI3HRAAAAEgAAAAEwRQIhALT8QGSR0yvPlQX50+XP2O1IVPR7ubCvulU3Zl3Qxcj/AiBgblEX44+/CefCZGico51o9Fd1APYQB1nFR8CoBgCvEQAAAGcDTENUBccGXWRAlqTkw/4kr4bjbeAhB0sAAAASAAAAATBFAiEA8M1+e9KBiwndM5YUlYxjEuFWjPYs4KecUdhFlw7t5QICIA6HQLlG2nHrEiOPouQVZE811wL23CMqbnBHlv7ofAeSAAAAZgNMTkQJR7Dm2CE3iAXJWYKROFznx5GmsgAAABIAAAABMEQCIAnl3kHBjLQGdUx/HiMhc3OV5ZdwZETO3dJ1ATQkOPa9AiA2r14ILaO1VX/dDAYvmqGE3hxBZEedWSg4Of8PpOWXugAAAGcDTEVPKvXSrXZ0EZHRXf579qyS1L2RLKMAAAASAAAAATBFAiEA0GXKWxADpu77arg9moMomSD7tzNr+YORymd+AQ+PF9wCIC6KDrawqhwenOnHGcfea28cKHnKee8FeE0MJSSNd3Z6AAAAagdMRU9CRUFSPJVeNbbaH/Yj0411DIWzrtiaEMEAAAASAAAAATBEAiBBKPelM/5p09OvzsPHE1O+1SsTYc62EoilMF7w3dac3wIgB4dX/HQ+28rzwsCyj5NizirHuaVLVnVSssnkHDpgrYkAAABrB0xFT0JVTEzCaFMH7yuIQvvz3vQyQIxGvQQg/QAAABIAAAABMEUCIQDZ61SfT3t5N+902OVnuGx2gyZ9LnjR9O894qbdHtVWAgIgUunvP9WOUVZK1lMiBdLPnGa6BLLD6TXUcKIEC7ovDoMAAABnA0xFT/l7XWXaawRouQ1THdripphD5nl9AAAAEgAAAAEwRQIhAMAMw1cRL5cbGIWmg77NPz6WUdCBBBsrWzKze/9KajYDAiA5iK5MqoxTEHayewx0imNMLf04ipMqrV4J57UUHdrSDAAAAGsITEVPSEVER0XYPFw1eWlignLe+H3NtbZjUt/XlAAAABIAAAABMEQCIAItmitwt2gMbfj5IDGIISGxVoUSMyKF9ktlKGFZi08pAiA9g0XgZSyk5p9uKUli2lrOOJAxQ2qubxqYkDUJMGWjHwAAAGYDTEVWD0ypJmDvrZeppwyw/pacdVQ5dywAAAAJAAAAATBEAiAR7SfLxFA2/qNWEX+WiBTn0ekGmc2hOf78KODg1Hr5MQIgSzCvXSTmp/ldbfvPhiagjXOt2Ft+x6rxSqA23dk31PkAAABlAkwyu/805H5VnvaABnprHJgGOe62TSQAAAASAAAAATBEAiBo8zLgDGQFegWBwmvYx8kGOjHprO79xqo5f22S7OwFJgIgO6EuyI2n46wFQkYmlKSmlsupdUz6+3sXe/HDFd7iXOkAAABlAkxHxSDzrDA6EH2PSwizJrbqZqT5Yc0AAAASAAAAATBEAiBl6EYtwAyN6UPvUz0GEHdohqkzuQrEaqcr3CPK64w4OwIgfxLfL7N6ueitTm8wk6DiyBpjbLF5t01wILp2uPfczb4AAABnA0xHTxI6sZXdOLG0BRDUZ6ajWbIBrwVvAAAACAAAAAEwRQIhAJN+fI1PWybDMkMSDBy2hE9Vn2KKEoL7y/Jxzj/R+YaXAiBqkEYa5VAE2RRhI77oPd6dJ5Mi+7ZEghy9OTH9W7IbuAAAAGcDTEdPClDJPHYv3W5W2GIVwkqq1Dq2KaoAAAAIAAAAATBFAiEAyNcAQ+rNy0Vbj1VlsoQgD9IwwHzNS88/GUyWb7M6kpACIGLHr1+mEqgv8retxh3gk2zR0XI4iuBktLE9HmTIt12+AAAAaQVMSUJFUubfvx+sqVA2uOduH7KJM9Alt2zAAAAAEgAAAAEwRQIhALwaEOEqi1+gutRnKX0N/9tpZnnRys53ePkQqIjJy69gAiAkCSFRnS2/Og1UdWavzuUMXRLKx8pebzim8+w7fHdxTQAAAGcDTEJB/l8UG/lP6EvCje0KuWbBaxdJBlcAAAASAAAAATBFAiEA37Y7/3AxJDSBHSq+oN2QotESIj7eCXxlqpCS1CE+Va0CIBn7CtKSEbZhBj8h42py40On4Xh5Q910r/ZVylYok+Z0AAAAaARMSUVOqzfhNYtjn9h38BUCe7YtPdqnVX4AAAAIAAAAATBFAiEA3I0IiL5gOSYkGUUrIdD3ZRRNcOJ7vUzlXc2x4IdY6hoCIHetUAEbw2mFxeCIojtZLP9buJYWsQJezpdowFpn9v3EAAAAZwNMSUbrmVECFpi0LkOZ+cu2JnqjX4LVnQAAABIAAAABMEUCIQDXW1D9EScmUSPnnCaQT7FPVoI19S44RXm7dLfMzBoolgIgSpcr2PWxgdmpmTV/S1mY9HylpuTNLlCk0rqyXohp6HoAAABoBExJRkX/GNvEh7TC4yItEVlSur/ai6UvXwAAABIAAAABMEUCIQCz0HxpsfGY+ZUeOn5dJjQHHbWY5IBKhye8cBC2iDyPtgIge6qT30Vb/ql4is/BVC8LM1+cIUp5Tc5LXeaGWWgOnn8AAABnA0xGUseYzRxJ2w4pcxLkxoJ1JmjOHbKtAAAABQAAAAEwRQIhANUmy8WBs5sx1HMd7igvjJC6eL22Zjnm38CdmHBedqEoAiBja9SD4niLYOUX0GHH0D8f3sP7XRdQe1igxrOgDQsFiQAAAGgETElLRQL2H9Jm2m6LEC1BIfXOe5kmQM+YAAAAEgAAAAEwRQIhALN2dVaf+A1DFV2aqJLsFf2MIDuTNTW88s7CVxcqv6btAiAd3C/TjqLe87ijQR1+AUOjQmZ+/+DVPis0naFqRiMfewAAAGcETElOS1FJEHca+cplavhA3/g+gmTs+YbKAAAAEgAAAAEwRAIgZRve2IO4sYWiYIRQIGrsefmohFQGc19Xsqd8VZ/bUZICICFi03LiCcBLA3QzZ7OQRii9j2SxgPE8+x598WAGBt1yAAAAaARMSU5L4ubUvghsaTi1OyIUSFXu9nQoFjkAAAASAAAAATBFAiEA0zkT1A39MD2eo5q0LmiKBuN/NxPCRWvLXd2EUs5PkhYCIBVP6ukADcY1R0nIDykPCk+/BNhkNcb3MYAFLHSJP2dJAAAAbAhMSU5LQkVBUqIJujTAGicTpEU6ZWYwzJ3oo2K8AAAAEgAAAAEwRQIhAL0rR6IYsr1GbyOPh8PYSMzWh4f4I1xC9LE5pTTzsQzkAiB0UESF526TYPBr9z1NfneOP83u+JutNLJFYbo91l+M7wAAAGsITElOS0JVTEyDrYfJiKwMYnfAxiNMyBCLILtdmwAAABIAAAABMEQCIC4RjHB3J7GLp54p/Rj5lseZhcoKn6Quxdo+l0Kv+ik3AiBK4YDF+MEuQQ8aRFoa0UIkwZWxPoxN1hF8htOdeBUULgAAAGcDTE5Da+tBj8bhlYIErIut3PEJuOlpSWYAAAASAAAAATBFAiEAzKlJdr3eeoZNj7FlKa3vdNuqwtkEWE81OS1Ulu4WpOkCIHb941zfqnJzWfZpGjfF73stE4aWj/lNs9S0Z7toDAmRAAAAZwNMS1lJvS2nWx968eTf1rESX+zeWdvsWAAAABIAAAABMEUCIQDpl4zvoXI6gcMicDlgXdu3cEvhEU6EgadVCUPyLi+UHQIgAsjlBWzJ+Jez6rJH8LFFhQV5yX3MXcBpPYNS1JJYjIYAAABmA0xRRNKfC1s/ULB/6alRH32G9PS6w/jEAAAAEgAAAAEwRAIgZsS4N2Z5xWln8ADYc3FOOGYpWtPj1PQOU/1x8kQLb6MCIFtxJ5WZopLAyVs99oRJD/6/bMmv+5kNrzaxLg78abvyAAAAZgNMQ1RKN6ke7EyX+QkM5m0h07Oq3xrlrQAAABIAAAABMEQCICrdR80OgfwiOtS2pujkcFl+uiQM1BxtG9udR5Q481l+AiAGquHV4kIfWvj4cyU3pzBEDYJEdFG0oh/Hl/EVfnCFSAAAAGYDTElUtZSQqwmg9SbMcwWCKsZfKrEvlyMAAAASAAAAATBEAiBqgLzAEY3ezxS3omAxLVnYHRvjcCDXcCo33B1qmhn3TAIgSHL85vFYbs1ujeQlYZKQjqd/id1zg1CLeWmVhopklXgAAABnA0xJVHY/poBuGs9oEw0tDw33VMk8xUayAAAAEgAAAAEwRQIhAL7QOfBuRz3xTk2AhMjVFrPgThxJCYfCI8/tgHsrakF9AiAzcp2P26rjKD3AU+q7ihhGV8iT62KSmGMT6ysnWNpQIgAAAGgETElWRSSnfB8XxUcQXhSBPlF74GsAQKp2AAAAEgAAAAEwRQIhALE5z4ovSmz/38EH8l4zsWC91HiuJ5ze5C6BoFrGiMPaAiAfmrMjBpylbtVma/T9GRzEB8AHdUeTeVuN2HG8VyEYqwAAAGYDTFBUWLaoozAjadrsODM0ZyQE7nM6sjkAAAASAAAAATBEAiBOT8w2gDXMc6febVy43rYgSgBWcdsXFoRmdnlsubBosAIgacVPC+KtGALjva8U85k0GoXV/lwXub+iMFp91iE1J/IAAABnA0xNTCW2Ml9bscHgPPvD5T9HDh8coCLjAAAAEgAAAAEwRQIhAKJe76KBUyTXowuICc3n989l07UWnpVt18ocOma2jC+GAiAsfqSaDNgSVG0LGdo8i+tiEVdoRvCwwGtz84/fBgvKgAAAAGYDTENTqhmWG2uFjZ8YoRXyWqHZirwf26gAAAASAAAAATBEAiBq06+SU3GnzYbstZxJKNjfLmAR92F21DRrm+Vw3qcmmAIgERztBlkRkWkAG28TNPw/oYZDEdHZx7WVprPd2QbFUSsAAABoBExPQ0mcI9Z66nuV2AlC44NrzffnCKdHwgAAABIAAAABMEUCIQDS1pzE1OkrDYSpU0ZNYBeiW9XJn1lYhl8ZzgWzFpPKTAIgFbUnSd8GpBNd6+FgI7PoEwhDuBWX69VqgGng+KJMx2oAAABmA0xPQ14zRkRAEBNTIiaKRjDS7V+NCURsAAAAEgAAAAEwRAIgHor4KQ+9DMoBE+HLNhkn7FkKNeGewoHYEIUq3aKhD+cCIHhxDgco4/vYGVBkaVrgLDkHa4sMo8FneOI3oT1Dj51QAAAAaAVMT0NVU8ZFAN17DxeUgH5ngC+Ku/X4/7BUAAAAEgAAAAEwRAIgLI2Hc0IHY33t2NOusVVDsilW+nlFO8itfp/61vWW6t4CIDOa6Q2ZsRDhbAQXMkKmQ7tWi2GkNqz3pbtCxJlTQLgeAAAAZgNMR1IuuG6PxSDg9rtdmvCPkk/nBViriQAAAAgAAAABMEQCIBfKucXSb+EENu/vrhg40rylsOWUUkirTxbRdWWByfj+AiBpcxZEGHMvjeJMqHeUYKajVOiEIeXapG98YI4drUvJbwAAAGYDTERYnvoOI4fky6Aqbk5llLj03SCaC5MAAAAAAAAAATBEAiADjbxXHyUQnZqMh7zXnPIe/MBkzSXFoeaZnH1E+88+vQIgW8Z+oQg3papscfw6gVcJzYOZc/ufwDMrwkeUDwjKnwMAAABnBExPT0slPH3QdPS6yzBTh/kiIlpPc3wIvQAAABIAAAABMEQCIHjqGeViSIqTboAbOeLEOxCbX3UfT4fFEJHvXU5/CUkYAiBezvYLR1AoZg58eMlaLfDoNLzJvIVA1tmSQT+vk0I0xgAAAGYDTE9LIa4juIKjQKIighYghryY0+K3MBgAAAASAAAAATBEAiBRzLgCK6fJg4CyiKss0VpmIKTbLLzx/X4evAGSs5lfiAIgar5a6EztEM2U+3C8dF83Ggo/fw0HlhYiEBdVpczr3AIAAABoBExPT02k6MPsRWEH6mfTB1v54986dYI9sAAAABIAAAABMEUCIQCyYQ8OZFzDIYxM5pmyf99bwfL5RJnzoabWrgQCeDo5mQIgC0jMrzdJ43pMla/Hp3oe6BM1BPNoZlKgzR5vRVZkJKwAAABnA0xSQ+9o58aU9AyCAoIe31Jd43gkWGOfAAAAEgAAAAEwRQIhAPM4XcyAeZxaySqfVY71b4BzPa8qwFTVVivpGEJl9tMkAiAW71dJNGlVRXmIdLmW5d0Uc3JmKqmUK4BXeQrXEOhEswAAAGcDTFJDu7vKapAckm8kC4nqy2Qdiux66v0AAAASAAAAATBFAiEAo6Fgbd4wuRpFXyo3cFLIwSpC6KFWzyjuIz/18djXCjcCIAD1V3s3EnxdAYxOkB6+eXlkNLtFFJhIh6cF8nRd/iZpAAAAawdMVENCRUFStCLmBfvXZbgNLEtdgZbC+UFEQ4sAAAASAAAAATBFAiEA9QrJBKnZRKGYpnQAo8iLUUlLQfKQFnZXri/d3PCi+xECIHXA4SWgHEPnETtc7ej7+vNgmAijhHydOm1TWBif+TfGAAAAawdMVENCVUxM22E1TpzyIXopdw6YEYMrNgqNqtMAAAASAAAAATBFAiEAsf7ujRSfpiuJJxzwjSL+IYlVeOkU3m5olIIcM1xWXMwCIFWriRc5HBemvHW62Hg+6Icl+8mWicwCVjZhbl1FLfbOAAAAawhMVENIRURHRdDGTWwOmqU//9i4AxPgNfe4MIPzAAAAEgAAAAEwRAIgGK27mPr177Cz7LIOm4u/Ad4mw6DyqAKGJanKG1EB8boCIBieb5+ItrPst7L43FlEu6a6Zn1jEw9nCkmsrV87w/53AAAAZwNMVE89trpqtvle/tGm55TK1JL6qr8pTQAAAAgAAAABMEUCIQCcm8gMi5SyUbvHuIv+yY378v/ToCXXnve42qUW0m4uKwIgIJlWcZIUT3KhL+latDn0RMSh8zO+kpqIbXk54Vxt13kAAABoBExVQ0v7EuPMqYO59Z2QkS/Rf410WospUwAAAAAAAAABMEUCIQC3eP7Y6uUm6NhxgdvaZgf1W/la5jo5Zkw5LIgZdHgQyAIgFy5hu8NtafFS8+Xx89yQALqeKt1rMvbPjbjz2/WFGSkAAABmA0xVQ12+KW+XsjxKaqYYPXPldNArpccZAAAAEgAAAAEwRAIgPa+qnHWzGENKCE4WFR1jYHYfPhp7WGN1gMVP0hwNlgECIF3GtvMuAvHFDV47Jwe1vtjUN/NBKYKDHm/vlS83aEdHAAAAaARMWVhlqLkZaAJY02kRSRBRHMh1la7Avm0AAAASAAAAATBFAiEA6niTUp/ApNgp4VTHcFa7uLs0Jehd6USnqQLZyOw3ijkCIBuKqiXPYa9/qpl4CUN99fCAaZYYJRA/DAYGe+Nuugg0AAAAZwNMVU2om1k0hjRH9uT8U7MVqT6HO9ppowAAABIAAAABMEUCIQDJP6G2NwOXNHTU9bkCJC/iNk4mn1ykZKIu6prrb5D5LwIgG7TdB+hVGo56nq+0tkkq6TG6atfztiqMld/RBOvJ0WwAAABnA0xVTvoFpz/+eO+PGnOUc+RixUuuZWfZAAAAEgAAAAEwRQIhAKYHczZ5RAnlx6+14dRVYkdylRDWNJTm87lWF3OPkOSEAiANNkcJ+zKeM/IrslbbUe43PQDjKAifWw6eFzX8ab4HSwAAAGcDTE1ZZv2Xp42IVP7ERc0cgKB4lrC0hR8AAAASAAAAATBFAiEA+lsOVFU9pCPmGKY3XeoWkYDTf7Wo9wSeeGa8KlryK6MCIG8KquOdLP+du8hgQ2MOrIl9zFwaY0difUSJ0xz/5tbeAAAAaARMQlhD/+UQqSQ0oN80bF5yo0lLBDzySesAAAASAAAAATBFAiEAlR+hjTZlxu08LSWnkBNrkqPNqmtaLsQv3ZFui6Wl2mgCIF8wXNQsSr0lGxZMXA+4kkK87joqc2fTSAdlffgO/2t/AAAAZgNMWU1XrWes+b8BXkgg+9ZuoaIb7YhS7AAAABIAAAABMEQCIFalFQdeFTF8sCo1xHyCDfercrRMull1HypK7Hd9YBT8AiBw2y7td/BHJEERaoMfWD9VAACBZ2kgFW/BMlN+TlNFhQAAAGcDTFlNxpD3x/z/pqgrefq3UIxGb+/fyMUAAAASAAAAATBFAiEAsXNqsRzZnNLmDFx1Ofngben5LYB2K6OFlZvmBgPDNdQCIAbswFup2ff2Y6SOXyrHGBvKKBE9P20m+GP49d7oxkczAAAAaAVNLUVUSD9LcmZo2kb14OdapdR4rOyfOCEPAAAAEgAAAAEwRAIgLrEMeGx6nE5ePxa3uVR3FNXdSY1L7xKur2rfTvDcgRsCIAP4VGv9nau6FJ7sTqlFp3RnYMT8cebMYGsK1qMR3ed9AAAAZwNNQUNMM0UQX8xs3CnbkQWP+q4zzKW82wAAABIAAAABMEUCIQDqt8Cs5gHJSjIaG0DZtN1UcMFsiqGJJ/LdUNbVpd4WpQIgC37tMuTD4r+9gJY373sLlX2lSOJHBF1oY4IxP2uUiJ8AAABnBE1BQ0ixGc6U0JjBj+OAkEwk41i9iH8AvgAAABIAAAABMEQCIGDgozQOa55Ueu5I/Y2ziWRRqd3JdpBFH10Wy8e7eiwyAiAbW7liZtF8oS/W+VMBjS/v/ym/ObGDlGtOILmrTpKihAAAAGYDTVhDXKOBu/tY8Akt8Um9PSQ7CLmoOG4AAAASAAAAATBEAiBVyn1i8ckN/4e1jXalyqzFdo6+l4qviv0moMMvRjks1AIgURmX1xml4J0lvp4O9E5OJDxs73dMgYAaRmEEsps+CM4AAABnA01BRFsJoDccHaRKjiTTa/XesRQahNh1AAAAEgAAAAEwRQIhAPUxHGHPOD4aoXgzC+Dg698BwJUS0hADQLWvsCxoutXFAiBzKgAYnVRtB1lLWrcQk78LETWEbomLaHK1BOnuZFP5kwAAAGYDTU5Dnw8b4IWRq32ZD6+RCzjtXWDk1b8AAAASAAAAATBEAiAbOya1Lj2BA0Z03ddgNDYAgbJ9nzQ7W4BJbQa1WleWdwIgAmkpS2bnlVmsphehlTGDX9dUPW3A32GDksPq5gMDxywAAABmA01GVN8scjgZitiziWZldPLYvEEaS3QoAAAAEgAAAAEwRAIgPmR6d3Tt9HPhmPlxAD2e/Yt4KbNJMZmNXFliEQaTjW8CICgHqjAj7uEvubIJWrCYOnEWxhcHE9ToZ3L85PU2WKz/AAAAaARNRlRVBdQSzhjyQEC7P6Rc8saeUGWG2OgAAAASAAAAATBFAiEAuumBQAH3CM5bdRv/xhBW7t0He046+LfMUqY67easDm4CIBZels06vHizVuW1IUcTHUHj3318vo17ZjG8pIdwMCTiAAAAZgNNSVTiPNFgdh9j/Doc94qgNLbN+X0+DAAAABIAAAABMEQCIGn8fCABk77xmiEAeib6LVGV9RBszeGDKmHiG1qflRwYAiADijQ+Ryqgs+P35+BWhA/E5gt/JpYTu4c7nmisKbvjXAAAAGYDTUtSn49yqpMEyLWT1VXxLvZYnMOleaIAAAASAAAAATBEAiALykZxVgNVNKT6iur/+WezhF/DzBH27qRG0oMQPY0j9gIgbrLmqQ3WewvEWoZg71AcVglSxnHDL3OUrCOnQZGsTzEAAABqB09MRF9NS1LGbqgCcXv7mDNAAmTdEsK86qNKbQAAABIAAAABMEQCIDFk8I00jrqrk0lDYyMCIz7U2eQqe6VevBvKrEJBnt9TAiAQ4hB/jwvPDQmtPaK45YKg9Cj588Rft/VZ/VH+5qCxtQAAAGcDTUFO4lvOxdOAHOOnlAeb+UrfG4zNgC0AAAASAAAAATBFAiEAtJmOJFONvIP7kewCGylEQNvLbAkDR0/MDBIzgR3wQ4ACIH7g8wHBfhqsyfsEMropWRgAobglcs5avFqsusn/vByqAAAAaARNQVJBVpCoprOiuzlLcJ+2eKYb/DafLE4AAAAAAAAAATBFAiEA7demGond7VByl3un7WHdv9PEfXxF6fS5T0DQNhWBc3MCIEkAzTB/ZnMI3Mg7AuAAvlXJQxoN7SVhs0n03eb4T9EfAAAAZwNNUkyCElr+AYGd/xU10NYnbVcEUpG2wAAAABIAAAABMEUCIQCoXmvsq/9HjEJxCjnvvrEv3YskPmBSFdb9xagO+ybkiQIgfHHGzbHI2xyjIFeAOED1lHlqq7abLknXJTNUhcc1zGkAAABnA01SS/RTtbnU4LXGL/sla7I3jMK8joqJAAAACAAAAAEwRQIhAM34VJvJnislWhHW2q4s0KEgDngN7Qz8egoJBaihcM9+AiAHI9TDRhcqxxwIUKdH5ucjKwl5itF0q1dwQit28jcOHwAAAGcETVRPTuOoepND0mL18RKABYroB7Rao0ZpAAAAEgAAAAEwRAIgJ6ZYjMOzBruy/mwc9AddXCDdtb/a5KuRcmUoUoUKPBECIFn4jMG+VPp4fS2KZmPLALpuc8IIHSnV+288uwa0TF2+AAAAaARQT05EV7lGAIkTuC5N+F9QHLrtkQ5Y0mwAAAASAAAAATBFAiEAgXMiswFaaE9S4hBXU/jbcicJjMWX9Ov8RKCQJAqTEoICIDAoq2FTBU5VevV/2VmWjPH9kbitQsKLg8AgTaNvsk3QAAAAaARNQVJU/cwHq2BmDeUzta0m4UV7VlqdWb0AAAASAAAAATBFAiEAhnvm83ue7l3qSPGQQ/Da00EN9JhTOxDqlLXNvfYQbWcCIDnhM3wt3dVGQrO9yQPRjYR84NjSrm2T+Lq1hh7Pz9TbAAAAZgNNVkyoSequmU+4avpzOC6b2IwraxjccQAAABIAAAABMEQCIHCTkEzGce333jP4u+UG2yldCo7C68L2d26eCqT9YlOPAiAsMn2yQCfa+pDHk0mefJF6VtZ71alf5FrHFFzbFwZdAQAAAGgETVVTRKUjg7ZluR3OQt1LbR4Ps30+/+SJAAAAEgAAAAEwRQIhAMOiK3csXQKUEVKm66/iEalH7TLbqQbyL6MwTIB1QP7qAiAryVV3qpfR5o6K4D5EoGZL5peA+zuAOvhFvbUkpDomuwAAAGgFTUFUSUN9Gvp7cY+4k9swo6vAz8YIqs/rsAAAABIAAAABMEQCIADY+ntuQJoNxVcjupdReefRGB0fx4/Mvs5OWiZIFDZqAiA5J9hKcQyIktAvc4atIBR8dfukvdSGsCVuzQBXcKfKWwAAAG0JTUFUSUNCRUFSvok7TCFNv/wX7x4zj723Bh/wkjcAAAASAAAAATBFAiEAguHbNZv7tkKKs15Jq0MejzZ529YcLFNu+hfUARuZx9MCICTGFtPNwRXjpsTKxbRKIUP1cr5wnB1XI8tCeh9xBr5qAAAAbQlNQVRJQ0JVTEx+A1IbnaiRyj95qHKOLq6ySIbF+QAAABIAAAABMEUCIQCh3411smwHNiyrbNP84uXrdEyN9Xoy/pSUovPjy6DZDAIgIHrwm5LDEkkUblP6Y/AYGrpd8aJ3tgzlrlRxYx+4/mcAAABpBk1CQ0FTSO+7PxBY/Y4MnXIE9TLhfXVyr/w+AAAAEgAAAAEwRAIgMjQFJ5VR8noKpDb4heEw09hOI3HgoPNsWRWEkaX5AfYCIGWyZMRxT0fasLTx05BW6kx40WfpxjZN7NiGiMBzby89AAAAaARNQ0FQk+aCEH0ene+wte5wHHFweksuRrwAAAAIAAAAATBFAiEA+1maWL+RrpA864K6t6oRmn4zBTlvyDJTfryJIJHWSO0CIG7Vsz26lGUlwNmTTh9DIxAlsW0TR+gq9cabCLr4XYzEAAAAZwNNREFR21rTXGcahyB9iPwR1ZOsDIQVvQAAABIAAAABMEUCIQD4dkAIKVQe6rMOZSsgvSQGzx8I43S5QxIHDs7vCMS9ygIgSvxLS4xTAJ3VqocJkhdkibaxJ10oIJn/Mtyq6ceq8Y4AAABoBU1EOTk5QtJd+6WGjDXnITTviG4ISEwxPUgAAAASAAAAATBEAiAa6GNkYtNb+YXWntY4+tX3UoxBtM8hIKU/0wZFt2hKHgIgcHGO2iEWdXLzn8igwMKh/GH4xJgqJqnBioJEG5MU+hIAAABoBU1EQ1RSvikH36zAEhu6B3C8bUIj+efXDmEAAAASAAAAATBEAiAl6A8+tpNNbGWCaSJxEqv9C3nmmcXKTQyACVy+PCWYdAIgEnFk4k9xIN5D61xVkDPVfEmt+r4WMI2irO77XJH5+N8AAABnA01EVIFOCQixKpn+z1vBAbtdC4tc330mAAAAEgAAAAEwRQIhAKb4lLG2qC7fpJnGqdW/YOBQMW/OIihI+xDwMqDjvikTAiAfEQ/XEq8TW9vSNbZJeVrYACkfr1GQ3k0/6ETZ9ozccQAAAGcDTU5UqYd7HgXQNYmRMdvR5AOCUWbQn5IAAAASAAAAATBFAiEAgxTSETYnwDxK8FKzsbXpzHQ9xUON7T84t1xgNicL6mYCIBpIDcgSH2T8C6dTqbBA/KHy0/sBLnzNPjVqc8umiRDxAAAAZgNNVEOQXjN8bIZFJj01ISBao3v00DTnRQAAABIAAAABMEQCIDD3lHQID1KxOOlk01qY+RI0LEhny18sewTzjXUFOr2lAiAdnlQn94wHL2/I+8E4y12uy+bsr1v5TP193/eT/58rYAAAAGYDTURTZhhgCMEFBif5edRk6rsliGBWPb4AAAASAAAAATBEAiARAH5mejvgJZJ8sSvDpB8qN1HNW3d9gLrvNv6Wu5nU9QIgRbMNdP+iq1QSLxHYx5lK+va7gplTFfUJMWGrQDwu3RQAAABmA1RFTOwyqXJcWYVdhBun2NnJnIT/dUaIAAAAEgAAAAEwRAIgEpyd0uoDp/UxlA5R+SDfw5AIjZhfN6bnh6U5hU3h470CID855XKIpuKLhJNr1f6GmXs7l4DJFiyuGzXWg7MJHwUpAAAAZgNNVE5B2+zBzcVRfG929qboNq2+4nVN4wAAABIAAAABMEQCIGxlj2fxZFsP9saVayxJtZFKFydpcX/mZQVG5Hjy83TOAiA9j5G7YCl55d+9xBMtyTrqdGnvITSScOE/DNaj4NZ6CgAAAGcETUVEWP0egFCPJD5kziNOqIpf0oJ8cdS3AAAACAAAAAEwRAIgdxwYynbSlZPiirjKJGFBGf/k78gSnIdBXrxjy4FlTScCIHc20eMvWCViaMqYo8Rbl5YND+0hTKv9LWUIWO0syA+fAAAAZwNNTE7sZwBcTkmOx/VeCSvR01y8R8kYkgAAABIAAAABMEUCIQCIKMt1M3fISdVtM0uLBIAR8Y9GDZzTfKVvVOze/XYDMgIgUT0d6BBP2AXA2R0EDDQ+2aSIhvHOqV7w4qN3j25rTa4AAABmA01MTr6571FKN5uZfgeY/cyQHuR0ttmhAAAAEgAAAAEwRAIgG4eM2xakBq102gEXx4HgMdF+TJeChd3IRGW7lqZJuxYCIEvi97DKtIMj96VEQpSYr3ekFEFVQBlHgbp7lKoTfUaCAAAAZwNNQk5O7qe0i5w6yPcKnJMqix6KXLYkxwAAABIAAAABMEUCIQCqDDAM1qDnMB4YjSYRCL5Xj0913Ppado1XKj2f26ErKAIgHoG75ks2kg3LsGiURSfUxzCiB6PH+4qw5KZWzeNKTykAAABoBE1FTUXVUl05eJjlUCB16l6DDYkU9vCv/gAAAAgAAAABMEUCIQDq+sh9OAa60oyuRKaDiGSUs0P49/oycokTVK/LK4/h+AIgIR5SN22aMisQJlVBW1o5WILLOCU9D4Kn9Q6MIFS+TW0AAABmA09ORU2AdQmuziTA+loQK2o7BZ7G4UOSAAAAEgAAAAEwRAIgaI6Qc1RsACeu/0kROlZmffXjwClmUWLaF6dYfoB23E0CIBcj2T5ayH8Whcai1jK2voUpdlXqft1zJzllI8a7U1MfAAAAZwNNVlCKd+QJNrvCfoDpo/UmNoyWeGnIbQAAABIAAAABMEUCIQCu3FO70PkScWg0BxYipuvzQWy4ih8+ZQcWJ2nrbil4EwIgdt7w14H4tIuhdMZ69BA+k8Wo2o+D6ji1svSZo59PmOEAAABnBE1FU0dCAWfYfTXDokmzLvYiWHL72auF0gAAABIAAAABMEQCIF1FBkpfYa+oXQRjmHVf0Xb5qM6utXlTv9FMsWX1nfdOAiBezqITm4k4NGprLFYL5+7CwADayeUBIYgztMKJeopttQAAAGcETUVTSAHyrPKRSGAzHByxqazs2nR14Gr4AAAAEgAAAAEwRAIgHKUTRrZeng2V46ZjNpYm0bWMODyjsCDZ2HdAJjxEr7MCIBvzHkv0wuM6ym9V05SCZ/twd1nHJP0TfumNJblao7AOAAAAZwNNVEz0MwiTZomdg6nyanc9Wex+zzA1XgAAAAgAAAABMEUCIQCDKN1Z29Mm+BFDANZniU4Nj34vAr1xNyxSQfM5xuSA0QIgRii4Fw+FC5njMbKXVN1dWi4yatsS5je+QX3f6pSRaU0AAABnBE1FVE3+84hLYDwz747UGDNG4JOhc8lNpgAAABIAAAABMEQCIBxyDYsGRRn0LlSr1cTpSfbS1rzG3VtSByrfuUmSDOd9AiAiwfMT5WYl6rnIqDrppO9mYY+U/MTJviFfwx4rCkxH3AAAAGcETk9JQSLjw6O9o5yJekgle8gi50ZvFxcpAAAAEgAAAAEwRAIgeNaH16S3MT0Y5Y7OBaONllpdR4Wseg/pLX+HeKJqQ2cCIEzgd6G4DR8EVJK8ZzyEQpt/zseCGJfMOsFxxeCKHZJEAAAAaARVU0RN12Ct37JNnAH+S/6nR1xeNjZoQFgAAAACAAAAATBFAiEApn+K92BQqwxa5RaWNdi3eS9aoqg0zaAKIQLpLA8UeoECIBc1k8f+WeI9mUVubC6aGYqdxApMf8zkoMSnwoLrSon4AAAAZwNNRVSj1YxOVv7crjp8Q6clrumnHw7OTgAAABIAAAABMEUCIQCauIiJZsZbwIAwYdMFnVFZVxsYzEL1DOdGpuqU2Dr3fwIgODyfOPoG9jtfhJeNuFbHyH4WWUN2/ZOmuYtBFF3bVU0AAABnBE1UTFguHhXET/5N9qDLc3HNANUCjlcdFAAAABIAAAABMEQCIHXkzhjUDuU2lvi3huQPW6Rdcs5gC3HadmrIf2QknFnGAiA2McNtvYgCr0hZVoOGzGnId+KOh2GaI+ME8ggwNC368gAAAGYDTUdPQDlQRKw8DFcFGQbak4tUvWVX8hIAAAAIAAAAATBEAiAIqG9CjS4voCkh4iXk9jGcQ7RsqZ5oNYRKuBZEezSAhAIgHdQcxAnnrEWf7N+3AqLxezC3HEtVhPfh6e7+fAx2pKEAAABoBE1JTEPXF7dUBAIvschYKt8cZrmlU4EXVAAAABIAAAABMEUCIQDO2eYeEIvA3aLkRqw+Mu4s0FUgNP+jQWUehWSjwV+POQIgEMQSo4dGLZv8n5FESIBdGn445XcoBhvrxvofoUA/fLsAAABnA01BUyPMxDNl2d04guq4j0PVFSCPgyQwAAAAEgAAAAEwRQIhAMKbF3nqIucxqm0ziadnynRMfjGWl3V91Qr5A7PmNb+VAiA1ULa3Hg0Aj4YA3vpMtJmAloQge4VbBv5Fli5KIHixeQAAAGoHTUlEQkVBUsgqu1JCV8juR5C/3vtFKy1qOV4hAAAAEgAAAAEwRAIgA90cTMOSfspnHeCRgtpYHEcfqTAumRS7xAErO1v9FzwCIFAnzf1aqpBcAKQNdKcpdkanIUXjiZ3Gtx1BmKXxNgxoAAAAagdNSURCVUxMWdtgvUG7yMpMHv7m6iqX6uHjDPUAAAASAAAAATBEAiAxODr5+ZILwql8eaVB61R5tTZXFlwYWfifC6LzDrxxQQIgGynNNPPjA9qErFgiMr1IGFfQ/HvPGxIX8FDHgIUhn8oAAABsCE1JREhFREdFvtBNW6NR+yqTRwvuBLq7Mtf2gXwAAAASAAAAATBFAiEAodtQetMIZyiKK3sgYZhUnhFfcg/ac4gAPC1gCg2Mk20CIA+cziCyr6Ly/VSLM39+G4wPrZeWkZplGQXwYoHX53cdAAAAZwNNS1R5OYgrVPzwvK5rU97DmtboBhdkQgAAAAgAAAABMEUCIQD1lF/M4WzEaKINH1FM51zWo6RsNxZzCFNgzvQDWx8u6QIgJ0tRkgx/wKeu/aUAGDjkXb7LX9Hd3ERwpoDinNqXOy4AAABnA01JQzoSN9OND7lFE/hdYWecrX84UHJCAAAAEgAAAAEwRQIhAIsTSK62qRLa8L8YUPgeUh395N2GU00I2KDgVnWz+iUVAiBAUO1eZfFHJELOC7OiyjI/BRoAhBJXgf7eWfadRsRhUgAAAGkFTUlORFOyZjHG3aBq2JuTxxQA0laS3onAaAAAABIAAAABMEUCIQDWUwJdXIFgL/tgSqL/ommvxWESayagzep0/z82GCfkUQIgVA5hp5BvMaY+kT5+CenNVPo7+d9RCThaOwkelfsD20AAAABmA09SRTWsSIt3PaxQbuhXiV7p3DSyUPMTAAAAEgAAAAEwRAIgXJCuS+UgAm4+QClkO3xk7/FWkexQ2qCDoN+2+nHH0EACIGP1OfZ7OYoxCi7m1eolFmTukMZX7k0No14HHcZJsL0mAAAAZwRNT1JFUBJiKBsroEPi+/FJBJgGic3bDHgAAAACAAAAATBEAiA/1hxYHMieny0sg8ZIr209cAYX1iDsGidmGvxytyXKiAIgFl7Vsu3GdzP48d4d9ISRHQveeSQQ4RAnKsGdw5I/ndkAAABnA01UUn/ECAERZXYO4xvivyDa9FA1ZpKvAAAACAAAAAEwRQIhAJlgKvVx8M9gZF8A0/+tVkXsXKHW8mml4DqpY/6iKE4DAiAXi2kAv6FgT8ushplUB9KDll+UGsZLalktVojpbrQ49gAAAGYDTU5FGpWycbBTXRX6SZMtq6MbphK1KUYAAAAIAAAAATBEAiAofBnAW34xAAYumHHXJ0pQ9MF3qbxLYqZcAltSsV3ntwIgDnfOT1FgmiFCtWsPDEdyL3hdsJgheNC/MSmejIW/4eQAAABmA01PRJV8MKsEJuDJPNgkHixgOS0IxqyOAAAAAAAAAAEwRAIgAULN0lffWlD8Q2Wlqm2iDJptPRMsY6WbBrZeesWB/4sCIHy7o3recPx2RluTckIvcwyp4NKjWtoJ92FFv12VVLlWAAAAZwRNRVNUW41D/95KKYK5pTh83yHVTq1krI0AAAASAAAAATBEAiBnT/UaWe+5lMsNtZRvdn4e7j/pTzQ2UiCzLFEvXkDOIQIgObcnVGjI8spp0DVqifqm5WTZ+tsK0Dfhi2sh7XXaBLoAAABmA01USK9NzhbaKHf4yeAFRMk7YqxAYx8WAAAABQAAAAEwRAIgL86350Gg9QiDfcvb9qxFc++xr+GtIPnxSK3fmt8YwLICIBJMBfJAkBa+gGzPV/nlKKhdpkU0Jrb4DptdJtJqFxaeAAAAZwNNUlAh8PD9MUHunhGz1/E6ECjNUV9FnAAAABIAAAABMEUCIQD7msiS2c18OyNH6Z/OdamSYnRgR4h2xZffCLCMbEndQgIgKAlocDZKRnR621dFHKFX3RWubltayaq+IVahyTxt6m4AAABnA0lNVBMRnjThQAl6UHsHpVZL3hvDddnmAAAAEgAAAAEwRQIhAJY+QV/qP2i/bzT8xpoLwTdGTl+G7qeT3gjIBmS387OkAiAWyRt/myXbMSvEl9NXHJDRZieO5Tt8ZDI84ZdngUSZiAAAAGYDTVBIY2nD2t/AAFSkK6iywJxIEx3UqjgAAAASAAAAATBEAiAuSn7Zzv94puDgSzBHYCDqn6EwLE5gC96lRKlGveY/8gIgeVniGMC7Y0js8ffqR9CmMEAwyqr9J4JMNFsedvZv7BQAAABnBE1SUEh7DAYENGhGmWfboi0a8z131EBWyAAAAAQAAAABMEQCIAuuYDpnzm6HDxbfCHJRwwkVf6A+EPJhEsUhg8sKAgMQAiA2fE+Zj2+Y/EDIuDmo9Xsu4UEQdA14ulcTmgtxx2bIhAAAAGgETUlUeEpSfY/BPFIDqyS6CUT0yxRljR22AAAAEgAAAAEwRQIhAJo1HjVaT6xWRz1rHp4tbCuI3YvDPxYU3FlSG4cPufgSAiBmiXebDFUw7vE94ifi4KWEXYjK5h22NcTsennkza1gBQAAAGcDTU9Dhl7Fiwa/YwW4hnk6ogotox0DTmgAAAASAAAAATBFAiEAwOqjTId8l8Bmr1tRyVRbALEc1Di/1kIzZSdlmvnZ8oQCIBTdgcMRZ5hlAaCOpgSd5RRaAOow4oRexXRatVwmkntmAAAAZgNNT1QmPGGEgNvjXDANjV7NoZu7mGrK7QAAABIAAAABMEQCIFgAi3TFjWxMlrcrEmEJQAUmULMkAHTJm6ne+uPpDF5OAiA+wIWLxT7wxr+YcHzu1tVYxVmbgtmvrrdty6MuYI6iWQAAAGYDTVNQaKo/Iy2pvcI0NGVUV5TvPupSCb0AAAASAAAAATBEAiAraCERxj6hbJOL4Q1o05jiJpcHkttMpUbVfMP5i+0IXgIgEzS+g9Il+ZRZeiN0+lHOCZjfpkftzilSJ2BTyIFQEu4AAABoBE1PWk9EvyKUn5zIS2G5MoqdiF0bXIBrQQAAAAIAAAABMEUCIQCzBYrpjKbVexhfOIboE3fT8u75Tr0zT/yAXltgiTVgfAIgHA5AVpcJVuKFkspp7hOpoLDShUseLZhm0KGZ9QirC9YAAABoBE1QQVk4EKTd9B5Yb6DboUY6eVG3SM7PygAAABIAAAABMEUCIQD4q5ec4/n/uN9bj7KzZobz0aat0Ad4tuuqRT1mbRpPmQIgL+t3zCwq4uULtAJgAhcFpUXInEOwno5vJD578armzdUAAABmA01SVqts+HpQ8X1/Xh/q+Btv6f++jr+EAAAAEgAAAAEwRAIgfAWqPvrq7vgquv81ZZvGSXbwee1CHcWluwUxAaXhtoMCIHNBfYIPxOwGvWofZjH4ZyFKHwdMvl+YRO2VRdYkk11rAAAAaARtVVNE4vKlwoeZM0WoQNs7CEX7xw9ZNaUAAAASAAAAATBFAiEA1NPAWXIHYMhe5bLbWiKyNIRGGgOvdN/did1aLH3XXOkCIE6Q7lgv74+o5/0rjvTUJiiamk3ENq0Bb6k84cXSxx14AAAAZwNNVEPf3A2C2W+P1Aygz7SiiJVb7OwgiAAAABIAAAABMEUCIQCHy4+nA7Ck65VDho5ftx4xQhGIdHLseST+KjnZhVsUlQIgF58U3VBfHmRuNyMJgtv3M/NYrXV3tXTHgxVoq3Tg0XQAAABoBE1UUmMeSf93w1Wj441mUc6EBK8OSMU5XwAAABIAAAABMEUCIQD1BMz2/hOcZJZRuSRLmYsh/37/E32TR4NFVt0uww39CwIgZ47cLRP1jJFjMIVuhHRsTIdoWJ698+G3zQCP17mB+8IAAABmA01UWAr0TieEY3IY3R0yoyLUTmA6jwxqAAAAEgAAAAEwRAIgc28v8GMm5TsXQFaPXhUHN8EZki2dyM9bUmIkOyp8KF4CIAW38lj+MqLbUQB9phWpSGjgWkeEvCSnUOio0J4++PUHAAAAZgNNVFZiJuALysaLD+VVg7kKHXJ8FPq3fwAAABIAAAABMEQCIHbQceymLxOcLxSq4NQ3B3/gZ5lJiV7HV4rFK8y75XDAAiAnD5O9A8jCtOFG3d9S+HuANe8e/Ui9LTEakeCWwx1xFQAAAGYDTVRWiqaIq3idGEjRMcZdmM6qiHXZfvEAAAASAAAAATBEAiB9pDv4eDtMyhJQlhEsbsWeD7JKTcL92WBWtm298qnP6gIgb/PwEe0JXJ9IhoRCZVsDWmTbW0IIp0YqBJyl0eUKNucAAABmA01DSROKh1IJP0+aeart9I1Lkkj6uTycAAAAEgAAAAEwRAIgKN7PjNlCXl3EDX5X5UQSClzCDqP61uMjgioSPard210CIB54sn6LnuNpH32dDNBUeFwENq+bLVi/8riSTvYKF3aiAAAAZwRNVVNUnHjuRm1stXpNAf2IfStd+y1GKI8AAAASAAAAATBEAiBbxpH1QCAse5YUhA2Haoihj5Pfa6VboV+JREjsWFGN4QIgcIK6M0tK1f7z9RzptRvRxNTpt8xl2/gvCULwNP7CR88AAABoBE1VWEVRVmnTCPiH/YOkccd2T10ISIbTTQAAABIAAAABMEUCIQDSsAvRSpJdBrif0bhH/a4+M8Q3FBvesyqDnU+GTqdxowIgHaa1sKdMGvzSRG7ydI3jtcTm6Bs0uwFNQgdbdslyBE8AAABnA01JVK2N1Mcl3h0xuej40UYInp3GiCCTAAAABgAAAAEwRQIhANZpOVVqIjC7t4UF9rsM1aoebglJQMd97d9+OAbDxmnOAiAMcr6zxMq1mDyD++y3g/APhjT5ynX6rHhDo1/JUqvvKwAAAGcDTVlE9+mDeBYJASMH8lFPY9Um2D0k9GYAAAAQAAAAATBFAiEA1aSptGIWxMICAohBdj2fO2EnGflQDuEVPwEs49yQwJ0CIFNx0ozBJp06t0PtrIohcnATUHv7hD+OnTUtpUKDGm4DAAAAaARNWVNUTPicoGrZl7xzLch27Sp/Jqnn82EAAAASAAAAATBFAiEA9+N3/PZVvKs0TXq7wMqnWlqlC8TKNpt9WTLs3rC/DusCIE/xh0+BfT7YB2/7OMc8OoakHyW/9ty7Cq3MguWuxwRrAAAAaARNWVNUpkUmTFYD6Ww7CweM2raHM3lLCnEAAAAIAAAAATBFAiEAjHnApDG/b6KDTHeB7uWI+1gOGL6/f9vwewST3emrgigCIC7magl2ywIAv6xUhSmuxf4yIU5agnvCjnmFUzBUx5vUAAAAaARXSVNIGyLDLNk2y5fCjFaQoGlagqv2iOYAAAASAAAAATBFAiEAq4Y0dRRutzsieHmMBIqdOp/8hsrjtJKhcv3QEuEGBeoCIE+DJWboPUdCgdizfF5A3yAcrtPVvAGtHwWkSxpolGLlAAAAZwNOR0Ny3Utr2FKjqhcr5NbFptvsWIzxMQAAABIAAAABMEUCIQCr67q4ukS5rGioWZ9FnUvDuuUuh7Nu/L4Qih1x8MrxEQIgO4pZoG3uUvxFsjsUeY9FvJVoaR33kkTDL14AYIkWzvMAAABoBE5BS0HfKC8XDzwyrJxJ8/W+HWjlrm63QgAAAAgAAAABMEUCIQC+5YuieZj7voPHknz9AegNRqxvZDOd2loNgSfOTbIL0QIgCIjx6hjj59KqDyEV7sMWNklZia22NfuN3FIRQT2z1hwAAABmA05BTQWYQAZwdYX2ZGXoplBTQfRrZPp6AAAAEgAAAAEwRAIgXYKjnM2T5FoC8fb2ASIdOJItTD0Al6YRpHYemRzntPACIALbUVbdeblDHQnREHb0RSfZ9p9CItmvC41DmqsgV06CAAAAZwNOQUONgN6KeBmDljKd+naa1U0kv5DnqgAAABIAAAABMEUCIQD5o+6hl9WmZFLXH4g5/lSZDe79gSJuQ73FpKR+SG8JUwIgLssLh7YG2CuGectXSWUtNBsYygA39PehJV56siXIfSQAAABnBE5BTkr/4C7kxp7fGzQPytZPvWs3p7niZQAAAAgAAAABMEQCICxFZrIDRHEBoPxCFjr6lHldBn0Tk7F9MwWqGlpDeigOAiAxv68BvCdulKJrfjaNko/eV4Eqasl1tHLD6eIZdH8oxwAAAGcDTlBYKLXhLM5R8VWUsLkdW1rapw9oSgIAAAACAAAAATBFAiEA36zuF1jUKTwI60Qbu5qPzYR/7QoyD22qEv4vjJUuh7kCICIAtMBLu5rI0q2WRY/FStjNoWJLFKDdCl68yM0BpyenAAAAaAROQVZJWIBHNl31ulifkjYEqsI9ZzVVxiMAAAASAAAAATBFAiEAxI1Vy+qj2LhwzHDIDXS+UoJhPFi+q27t5Zqu75fyGVQCIAoXbOHJNGveP5Z4sKvZJJlr1RpKnzI5SIorT6CkmmhGAAAAaAROQ0RU4MiymNtM/+BdG+oLsbpBRSKzPBsAAAASAAAAATBFAiEAwLuVGAF/Y1/w2KClMrU2yC+roHYAkBv9VE2jSrAcH0ICIEl5Hw4zPkIljK5zwa+bUrYUdTMLajJdy1l2LJOfZwWqAAAAZwNORFgZZtcYpWVWbo4gJ5JljXtf9OzkaQAAABIAAAABMEUCIQCwGsCtN6+FaP2EsNjo89RytKXtXWM5VCeGUoKqDjHT0QIgTVwVonsyebsxYg0J9anuBhQ4s+/gGd1+aL/+PKIUNRYAAABnA05BU11l2XGJXtxDj0ZcF9tpkmmKUjGNAAAAEgAAAAEwRQIhAPBuo2wuHgfq+GSD5uStz/DLT8IDdjc3Xobp3kQrUtGoAiAvdwHCQBWPfKR94eAHVTZW23c2K/afgN2nutCwxJpz1wAAAGgETkJBSRf4r7Y9/NzJDr5uhPBgzDBqmCV9AAAAEgAAAAEwRQIhAOSqd2kHzITAnwAqwYclwqCmwdetOSHqUhwd4+gmSGmkAiANP32bIrJB+3aXJxfJ8FlU/Ohw6KkgtVJ7h01vwhReCwAAAGYDTkNUnkajj12qvoaD4QeTsGdJ7vfXM9EAAAASAAAAATBEAiBxOG54Nl07Fe5wO8Zgl03W9oCDEwZqPXe/cRPLhjc9HwIgCVHHpODmE7OmWB97RffWUR+u4tf2VUa7M6IxbOr7UYwAAABnA05DQ5NEs4Ox1Ztc40aLI02rQ8cZC6c1AAAAEgAAAAEwRQIhAKq8pJd4lJ0bdSo8MBqqHWcARm5jpH1wja9kzkEqSZy/AiBgXPjJkqGUghyvdXaDYl/HuXHO11xpfHUfo0ghUATpCwAAAGgETkVFT9hEYjb6lbm1+f0Pjn3xqUSCPGg9AAAAEgAAAAEwRQIhAMqA1bDZcT8svLdKwQ65+CzPlksvzq8aAMVwTpuhk+EKAiAX+uNXdXXlzTQK4fq5XXLa4A3Av2J7TlWSDS2iZ8uADQAAAGcDRUdHZczXLAgTzm8nA1k7YzICoPPKagwAAAASAAAAATBFAiEA9MWjzCqKeFme55/7MNdmUMoyARKtV6LKc+QsTA+MvTwCIBEFkVZQNdDMW39SbmcL3w6Ax+T3lGNI5RLpCdTJYHj2AAAAZwNOVEtdTVfNBvp/6Z4m/cSBtGj3fwUHPAAAABIAAAABMEUCIQDSHpnvBnC8tdHfZQDYK+cd9m0aK1OV2Zby7B0p7Ijj1AIgVlQ0k7kfmJQRcnnhH53naPoNeHa4o9nnM2dJOEKolKIAAABoBE5UV0siM3me4mg9dd/vrLzSomx400tHDQAAABIAAAABMEUCIQDHd+HYUrWhHr3El1wOlekH79yqjaXK0rf4NqKo21n4lAIgGqBbO4pzfjR9jXr03fmSvD37iW8tuWwiVSDaR02PVwIAAABmA05FVagj5nIgBq/pnpHDD/UpUFL+a44yAAAAEgAAAAEwRAIgQkguIOK11TQPbmpHjohR6lmcoOgSOFIfH3+0aDxY3wMCIGAc7DI7lhawVU28lqOO3/r6EuKz4zRwrvN/vyplC3u2AAAAZgNOQ0NdSPKTuu0kei0BiQWLo3qiOL1HJQAAABIAAAABMEQCIHpuDcIIJoJIunqNStGav0+DKyEyHaqpzVyzDQebBhs2AiAPb0udTkNA4GJmxP6+KIkKWO7PRJyo7R32GQu7jS5SCAAAAGcDTlRLab6rQDQ4JT8TtuktuR9/uEklgmMAAAASAAAAATBFAiEAziejGXPXTC6sfIJ6n64OoYl7y2hZ4pVV+9a5o8IHse0CIHP6rZv1hUjl+5VME0qWhmtYUHVMZX1qhgF8FlNrEY4dAAAAZwRVU0ROZ0xq2S/QgOQASyMStF95ahktJ6AAAAASAAAAATBEAiBGMmROJp4+hH3oog8S/LLx99nO3tRkVaXE6xUZOrlrwQIgWr5HYXJj1raTILyvhS8jarMGFElzfXoe2HonC2e3iMMAAABnA05EQ6VN3Hs8zn/IseP6AlbQ24DSwQlwAAAAEgAAAAEwRQIhAKfuUpca2yhCT3gWY7xJvZSB+ql47VOpyNW6WKgA8C2aAiA2w668BbBKm88x08dtbJFsTg+BYbEg+nF2rB5xWU7igQAAAGcETkVXQoFJZLG86vJOJiltAx6t8TSiykEFAAAAAAAAAAEwRAIgS5ZBqIfyyFYUm2fxYNzeA5SKcemCFtnuQnGx0INkEHoCICqmFiITudZ5kW0/wbY1D6byAIH3nyPtFouQ9fzLBvBuAAAAZgNOeENF5C1lnZ+UZs1d9iJQYDMUWpuJvAAAAAMAAAABMEQCIFpUoVVvGdhjFaw7ppyaMoFdfaOuTF/X8neDjG+AUgXrAiBvajIzz6M9x70zCucr4Ux+Ei3c3wMew3q6Z16G+oG7ugAAAGcETkVYT7YhMuNabBPuHuD4TcXUC62NgVIGAAAAEgAAAAEwRAIgdJBtIxwc6diS/bG1eV+eOKJ9ddIFQhs9XOgDp6IIhNQCIAQ2lj9Xm5FDGu1XOepiZlDe5AVO3ieYD3TPS2KlrdB9AAAAZgNOWE3XxJzufpGIzKatj/JkwdouadTPOwAAABIAAAABMEQCIBZ17cWwLw52kMJqCoNKXvVSOEQg/1KXlk9xOJ867NMCAiA5pAlbxfOqKyyG5/fvj3NfsYLxHcmdD5+eFvetCEkcdgAAAGgFTkVYWE8nioO2TD4+ETn46KUtljYMo8aaPQAAABIAAAABMEQCIG9fZxXDwtzmJCSzOhn0MnMOupupgxH562XU7SCCCP5dAiAuWdXQK/cMCCULo+1l6ekVgTbt2W7CPHA2YWPc9XPjIgAAAGYDTkZUy40SYPnJKjpUXUCUZigP/devcEIAAAASAAAAATBEAiBtV1taqQCfBZU1483jbaLQ7Yv0lu8jh6kvHJO2RhkEPgIgdFMnx9/xmHQYb6KHmxs0UbpF88xoYAIOOYXiNWCB9tMAAABoBE5GVFiH1z6RbXBXlFybzYzdlOQqb0f3dgAAABIAAAABMEUCIQDZvmUt4Gde/BF524W4mt/IlCC0XDi3P8zirc+IuzuyxQIgXwoiGq1iUqXhxRXCGIp7TtXL6rpXQ96IEZ7mD7f7uaUAAABnBE5JQVj3GYJ2LRQfhnnrlE+uyM7EFfteIwAAABIAAAABMEQCIBaDn7OtkcZRRxYOrwyauy6mpgP5nqwxNX/+hwR9L93HAiACvw5M7K8TXrbMw03qX4yqCTSyNqgR3U5qmtZt8O33MQAAAGcDTkVUz7mGN7yuQ8EzI+qhcxztK3FpYv0AAAASAAAAATBFAiEAjG9Mha8qhlh049EYrbnyi650o/vs3F9txtRU9/q7NcECIHxBVVCVmfFU3x/lWtZz4Orqmvbch2PPaVItXUMQODEhAAAAaQVOSU1GQeJlF6mWcplFPT8bSKoAXmEn5nIQAAAAEgAAAAEwRQIhAI8deQr6I7ljrrkRQ8pGLIEJryeqZ3GdwfAnn0qknAOgAiAfUyPm5QgPDVIjhWQXqKJ/uDigiGpK580LST+tY8rYVwAAAGYDTkJDnxlWF/qPutlUDF0ROpmgoBcqrtwAAAASAAAAATBEAiByAAE0MVBWEuIV5M3+8y34VbpwvDrcrAUTohRJhFzV2AIgTS+5GMtO+k6rlZNH+5gdrBaL267wUObi8DDNzoRfV8cAAABnA05LTlzwRxa6IBJ/HiKXrdz0tQNQAMnrAAAAEgAAAAEwRQIhAL2vwGIO19gUuxaHS3HWCFPv3W8Cq35rwnCdww5l80S9AiBesEULNRI2W47GHiBe5Pv+hhLmJNskL/d8Koct9lScJwAAAGcDTk1SF3bh8m+YsaXfnNNHlTom3Ty0ZnEAAAASAAAAATBFAiEAwYqAfXz/ON4H/gRKyhM+67RvC5fVvsqK7SWpQjDqS3ICIH5WoYNNUNRUir60nKj3H7/GAdzMBxUleo8GLd9zio/YAAAAZwROT0JT9PrqRVV1NU0mmbwgmwplypn2mYIAAAASAAAAATBEAiBddErYODtewV2VPlE7bJKWz0Dj5ZEJH08bxBsfc5UDwQIge/SVlwqR+dsITW36bYs8vi0xQSbNKvnQyO+sRXJVm+sAAABoBE5PQUhYpIhBgtnoNVl/QF5fJYKQ5GrnwgAAABIAAAABMEUCIQC7lBPoEYeP7kHMyEx7+89Z3etynBxfRYRzRi5TIZETWQIgV3n7Voz5+g6/qZQtTqiuq5ZOJqNORMjbUOGDYt662yoAAABnBE5PSUGoyM+xQaO7Wf6h4uprebXsvNe2ygAAABIAAAABMEQCIDUslLX9DonLpr0bCO7DAldVuGPeQdNlxZ4pLrebmOfpAiAhtlmdYQJcZqdT7n+3sVojSLKx7GJgBW8YTKNc8BRKzwAAAGgETk9JQfyFgVTAssSjMjBG+1BYEfEQ69pXAAAAEgAAAAEwRQIhAIGDduI1ool6M653y5W5whrRgr+ALLHnhoXJmSYv3TT9AiASsrJWn01o7c3xfZtIXyybfl7kFE/lQSr97KhUomu0FwAAAGcETkxZQc7kAZ/UHs3Iuunv3SBRD0tvqmGXAAAAEgAAAAEwRAIgM0W0XCYQ4YriPanTMa/+5hPGbRqCK2+tWLvljlCk6g4CICU2eLNg/5VGuLeBZOFaj6UC3yiejWmwKnn7sZbsYdhrAAAAZwNOT1jsRvggfXZgEkVMQI3iELy8IkPnHAAAABIAAAABMEUCIQDOSW/+orM6GG88UaSa7LIbj27QcnUS4zlQm6w+Agl3ngIgShi6udEX27PBc56rUQ4zyM/EJQOJVZMLcZrgSlimxLIAAABoBE5QRVJM5rNivHeiSWbdqQePnO+Bs7iGpwAAABIAAAABMEUCIQDqvbzYc2x+0JJ6J3L5b5GFdSB2gl7ZtiNcTU+ibWYQmwIgWL/d0tz9E4RXFNXF+v5j2A8kITLXE7wetpdkvcmXsI4AAABpBW5DYXNogJgmzOq2jDh3Jq+WJxO2TLXLPMoAAAASAAAAATBFAiEA4bAHhtX29h4O+5TiWX5UCKtBfgnoV1YcAl8OgbL2K+8CIAT9pE+S3b1z4mbqqwuTpKSczs4wifzIW0MFKwPFVH0gAAAAZQJOVU/oMhPVYwgzDsMCqL1kHx0BE6TMAAAAEgAAAAEwRAIgXQlzgV+ym3dCvgW/qyGGLos9QxvKdWhDNPWwHVpfnsYCIH1bMN+Qx63xOL1wZnh4icHIND2q4JzwuCLkukqkccALAAAAZgNOVUckXvR9TQUF7POsRj9NgfQa3o8f0QAAABIAAAABMEQCIDJAXYWglLOiak1Z36XF5rCQWT/dqvUXqYb85uCorGzhAiAklZzQ/MtZfUcIJYP7Irw//q07Yy4BSlV/1W65UKovUAAAAGcETlVMU7kTGPNb2yYulCO8fHwqOpPdk8ksAAAAEgAAAAEwRAIgCBaRP0ye5JWpfP46jrGzsi9nTpBNkdhj/SqpoUmU2toCICnwsPT606ikxJ9c/wFo3oz/AIgsIZ1D2WGeJcuunWTaAAAAZgNOWFh2J95LkyY6anVwuNr6ZLroEuXDlAAAAAgAAAABMEQCIHUvZJuxD4cgmSek5OGmyOOo9PrgZQtYKJEcpbdq9GxJAiBThQyLSC4dJGhSSiBPjrpOR8tDZ/mS8FEj1hzVpe6mEAAAAGcDTlhYXGGD0QoAzXR6bbtfZYrVFDg+lBkAAAAIAAAAATBFAiEAphaEbHr8vMtRLkHifOhTn2xhMVMLe392TaAKsX12TQ4CIBXxXUpGeCc9eatQVU9vmPFQqF4UpHiw3pyhyitALGu9AAAAZgNPMk/tAKLLoGZxSZnscDNQ4KW2t6tmywAAABIAAAABMEQCIHyxguEebNximNLPTbu1/8Xa+r6ypFT+rgdrif8dDlAsAiAJ0hezQVuv3EGXqNj3TdWtPd7CVB0Cf3pPVMItO3c42gAAAGYDT0FLXoiLg7cofu1Pt9p7fQoNTHNdlLMAAAASAAAAATBEAiB2eYIJejNnwiDdsCZ6ljpFhGnQOaaCMmAjJyj/M7aIWQIgdRYgERa5nL0b0ZRaiohvHAONXIwsR4KgEp9HalKCXYsAAABnBFJPU0WI6ovG4aIrggH0S+CgaxhM4V+nLQAAABIAAAABMEQCIFRICGyvYeGcxBX8KjADn46LgqzpK0+uV9tO2LwsAQp1AiAQ3ghb5kNg8qj3OEpM0U+/UuwNnWtCsx9H0K1Tcv+BlQAAAGYDT0FYcBwkS5iKUTyUWXPe+gXekzsj/h0AAAASAAAAATBEAiBNYs0J/95Tv7GO4RterZE5v3DRXx0WAK1yKPs/H/AAWgIgebul2fpdTK093UIpK1m67ZuTsiMnB+8ebawCn7xcE7AAAABpBU9DRUFOln2kBIzQerN4VcCQqvNm5M4bn0gAAAASAAAAATBFAiEAqG3msPfF6JgU106V8KzbQCfSL7q611KCwyA20kwHw6wCIBqSCrlD8FGQy6zWvAvN9qHvekhZezaaLjOjVUpOn9rHAAAAaQVPQ0VBTnr+u7Rv20ftF7Iu0HXN4kR2lPueAAAAEgAAAAEwRQIhAOA0fv2vnYnL+JiKoj1//pxzsTjqB3JeDezTSQRNBeAXAiBL8UEr6Ctel7LGVY5gvPn0EScWMny6CYLlYP4hW1S31gAAAGkFT0NFQU6YXdPULeHiVtCeHBDxErzLgBWtQQAAABIAAAABMEUCIQCtisL7bWLoGWpQwIBLWCubutijvwaEJcpcOGnSYN0dHAIgOO3AxDvnsLmScAvEi8Rt9isKv7FTTUsJ3AcnpI9DR8MAAABnA09DTkCSZ45OeCMPRqFTTA+8j6OXgIkrAAAAEgAAAAEwRQIhAONHfU0Utg1M3nLXLhUzGo3b9RVNGogWN8qqFdQZ0/4bAiBSNvLJf7Y2Rb0+i3e+Azajy3JYFYLNfiLGtbSvFLo3MAAAAGcDT0RFv1LyqznibglR0qArSbdwKr4wQGoAAAASAAAAATBFAiEA/fammp0L2k6nysWZfolgBxwftKnps9Hkt5rrLse/OHACIHQkflNp4A35zyLYDLkvpKg9JiSsGLugs2nDjPXg1H46AAAAZgNYRlSr5YDn7hWNpGS1HuGoOsAoliLmvgAAABIAAAABMEQCIH1eBR7IWeSqoaIHwNLSzIYvt8nCh9Rxjbtw3EdqGiR1AiAMKRFNbb7VsJVH/yrp1kt6g0iL663ke60TNp3HYpdvCgAAAGgET0hOSW9TmpRWpby2M0oaQSB8N4j1glIHAAAAEgAAAAEwRQIhAKg8rrmF9XRmTWtqHsDCnZz5xBamjM4T9N6usq8Ar9THAiAyLlFj37sGINmecQbqYAOYAOGv7UYWOtO+5o2GbW2y8QAAAGcDT0tCdSMfWLQyQMlxjdWLSWfFEUNCqGwAAAASAAAAATBFAiEA/n/gHsFjTHow3VYmkfZ019IYIMK45eSBfBcB6WSNSicCIB3Csk4o9YQHpaou/ie035IlUc9GrEMi9JyVCnXKavmhAAAAawdPS0JCRUFSBT5bp8uWadzC/rLQ4dPUoK1qrjkAAAASAAAAATBFAiEAwTuL/UlXO5FPueu49WVgck5XdugKnPKbfZMVjPiAYPMCIHQpdypA1z0vf70JewUmZc2/+X9bYrMh8l/SToiYmm6rAAAAagdPS0JCVUxMiveFaH7o11EUsCiZfJyja1zGe8QAAAASAAAAATBEAiAKjGtkpvwvR1RFjJy4EOtGprUBNxKrBA5aSfQRY6ewHwIgNErFcyQ+h/Ryflztjq6u+zn4yWU3iskB3fm0m6wWNoYAAABrCE9LQkhFREdFiJvGLpS7aQLQIruCs49/zWN98owAAAASAAAAATBEAiAxg8UDaqoNrD1Yffn+lReaWKGrE1lKnQGrGmoDhC81qQIgPMWtA+GgixuhUmIqdM0hHIdOgmB0Nrsiw7vvOQCTnjgAAABnA09MRZ2SI0Nt3UZvwkfp270gIH5kD+9YAAAAEgAAAAEwRQIhAO3CDkiN4gE3lWTTHoP6TRCM05Z4yFY5uznSMOdhH2RlAiBTiW+fO+Ev2KJvnyGnurdql2m6jAdJ5fSdgqANzgpJhgAAAGYCT00rrs30NzTyL9XBUtsI48JyM/DH0gAAABIAAAABMEUCIQDRMwunE4N20NLURNs55j8d6318EQkcOUSTWAs1DLfdgAIgUokZhquaTKpBAMVc0yILG1xrPMvwKMUZRFMzGXwIfk4AAABmA09NR9JhFM1u4omsz4I1DI2Eh/7bigwHAAAAEgAAAAEwRAIgfyKZQ6BRBCW13Ktc/+D2BGnT0FxVV6G76cCgfUtwTmYCIBHNEJNjyHXty9tdels6tc43JtmjzAgWj2krSGLItPT3AAAAZgNPTVi128bTzzgAed87JxNWZLa89F0YaQAAAAgAAAABMEQCIGu3TvyGzDCVJkanbP5iJUvofpQMIJ8yfMKPO4C6EHVqAiA0ECh3SXvNK/NxOJMdnfCwZOH5C1F/g/GbGL41VV2dTgAAAGcERUNPTRcddQ1C1mG2LCd6a0hq24I0jD7KAAAAEgAAAAEwRAIgVs2pz6az/5QwyWPvgnvF+G5YsJ7k7lfikihn2o4bvrMCIAls9iAbHVS2c7Ah3nhk9QO/MVI/2F+ZeqOyn+WrFmWPAAAAZwNPTkxoY74OfPfOhgpXR2DpAg1RmovcRwAAABIAAAABMEUCIQCd24JjGtkn7UJtz4vNT/7qvvCM7yldpmklphtTtj7ClAIgYFujAdjQUjehIQNfFHtI7x+uzz5zLcuxLsNZWGFbJ/QAAABnBE9ORUuyO+c1c7x+A9tuXfxiQFNocW0oqAAAABIAAAABMEQCIGEPY4wWsBlIJmWsw83BdqxhnROGEuZ7Ghb0WhuHfISvAiAQwA/tJIkgcIA3dkTUClFg5tgzoWZ0GXD7SkJgjXOjjwAAAGcDT0xUZKYEk9iIcoz0JhbgNKDf6uOO/PAAAAASAAAAATBFAiEA8d0wRo3bwVj0DvauSIoSD8KXo0HrhK8dnVZoEUWjnyACIG9l0jaSg0qLCozeFy45/F2YLte2lcrplre/eB6WdRBJAAAAZgNSTlT/YD9DlGo6KN9eanMXJVXYyLAjhgAAABIAAAABMEQCIFoLTM5aRYE0STqaAplSS4U23+iOwy/BNErvyK/ANKCSAiAW0HW3upLE4uRqGFhUW6yQPjCV9LtLY6lTjKwBheaz4wAAAGYDb25H00HRaA7u4yVbjEx1vM5+tX8UTa4AAAASAAAAATBEAiATukOTCR97LG9RvBcSKyWQC/naPf0rfccdevNdn49kbgIgBeE8I12dBb8KTns+I/GZfV2tu+QiZXzk9z4R2yJMR24AAABoBE9OT1SzHCGZWeBvmvvrNrOIpLrRPoAnJQAAABIAAAABMEUCIQCL2aXspNxg1+rl4HDxoWmhjS16f1q2yuxYMmjeHPQf+gIgEYzTFZC9oq0/fthq/3zB0iAzVXfkmi03HTzGLXUIjJ0AAABnBE9QQ1TbBeoId6JiKIOUG5OfC7EdGsfEAAAAABIAAAABMEQCIBZnWJKxdxn1oweG3cBomwXJ6f2btAOWxwlAgFSGRbWxAiA2CBj/XN5sNoBglE/Y+iXSUgVKwPLcFMdBWX9cE2bhbwAAAGYDT1BRd1mdLG2xcCJCQ+JV5maSgPEfFHMAAAASAAAAATBEAiAzL3Js20IHHZmdMjJ0NAjpv9MsUWshoFmJp2YU7Ri1lQIgSP8XVci0k1EiOgcvKILe2f2DwyDBVnMk3UShqEVS7H4AAABoBE9QRU5pxLskDPBdUe6raYW6s1Un0EqMZAAAAAgAAAABMEUCIQD+ycDwfXLGwQzr0VPu97uNuDVgQLZWDKh5794dBZX42gIgCMbg/bCqxFWAo8JIw4kj85caa71gg1uY+3N9Ge3vrYMAAABpBU9QRU5DnYaxslVOxBDsz/vxEaaZSRARE0AAAAAIAAAAATBFAiEA0SSetsImt8EmLvaNFmBJhbFjd1mJY1jqSivjO8oJ288CIEtaJTcIoOmBLAXnESgrfShrAjS1xau0mw7sScNBuFiYAAAAZQJQVE/lhRya8H355a2CF6+uHqcnN+vaAAAAEgAAAAEwRAIgC1unDdaU0+zMEk0RbJGGrZTto01Wy34KE5yVgtn3uLcCIEUbDzRsN/22v06HB0JeQnFSeZnzUA1vWHnoUtsk05bjAAAAZgNPVE6IHvSCEZgtAeLLcJLJFeZHzUDYXAAAABIAAAABMEQCIC64xCqAbsdiwMv1de6Apc0k6IcTXyltfZvoevb7b+oXAiBTogdtt5sHqYA2VjVYqWqsVk9kQJdBTQk9O8W6nGSAnwAAAGgET1BUSYMpBIY5eLlIAhIxBubrSRvfDfkoAAAAEgAAAAEwRQIhAJ5H3w6rafDAfgnNqIm5TmkYMmDf+MxleEQavlz2R/FsAiAjS7poQmt6jfboVpTXUOZLVPtUtpczeg4fIaBaG7AY5wAAAGcDT1BUQ1X8Fg90Mo+bOD3y7Fibs9/YK6AAAAASAAAAATBFAiEAncYMtsvtgsWGOL8hxV4JFdJKvCA/XYeTswTU5rS8rMECICeBZpu2G3IoTzsLx7hoheLS9OKlFqOxEpykm4VuNZAxAAAAaARPUkJT/1bMax5t7TR6oLdnbIWrCz0IsPoAAAASAAAAATBFAiEAvVobqCPgeswpBpDxRQ4usKnrbjtl+bspFIMhI7NmD/ECIHjGlqPCOrL4gqQYGYBJXX2PG2RVDgy1N/paEUG4VszWAAAAZwRPUkNBb1ngRhrl4nmfH7OEfwWmOxbQ2/gAAAASAAAAATBEAiBD5/MGnvLSY+QZXzlqMCrckKtC6e0VN551/co0FeCf2AIgfEYNvurVlaHwYvhj0kN+tafbsJQKEFX3Hde7LzMCnhcAAABmA09YVEV19BMI7BSD89OZqpooJtdNoT3rAAAAEgAAAAEwRAIgDrvivdhDFxl4ocY/Ty7YWdA0yLNi5J/ih1Cf5T6Dg5UCIFIlSRgarKmMboAlyw5GzaETE4lQvdOVJoyXTgxQI9ryAAAAZwRPUlRQbuEMTFZhZhNcjeV0zmP1g6/G0rIAAAASAAAAATBEAiB2vsUBgGwN4AeAoFsLtgDNwKuQK++DD21yIPSzezj19QIgN8ZEPmXazucMdzwNQlNGw9ysj504ySwEXgvRqdT8jVgAAABnA09SSdL6j5LqcquzXb1t7KVxc9ItsrpJAAAAEgAAAAEwRQIhAPXR8UxeWjQFp51HZG0IpgwMC7dgBmCfB6OGfct4y1uOAiB7Cy3biugArOqV4aA4C7E60+igSR6NHhW5R09DAVr8LAAAAGcET1VTRCqOHmduwjjYqZIwe0lbRbP+ql6GAAAAEgAAAAEwRAIgJ6U7Z8kNSLvcy0rkpUgNL/05T55KaMYT8EduolZ6pt8CIFzmWP/3ub9xepx+6Z0fBi4l+hKVN8/ZTggqlhUIh1qIAAAAZgNPQ0MCNf5iTgRKBe7XpD4W4wg7yKQoegAAABIAAAABMEQCIAQ/H+pRzKjZzY8mew+kicVC7EzD5e/kiJCr0fXdGWqyAiBaf6iu6ZN9MpNEK72twLqrv+Rb09MowvTe3HWUseiF8QAAAGcDT1JT65pLGFgWw1TbktsJzDtQvmC5AbYAAAASAAAAATBFAiEAhYoOK302ZjOmtxytoPGWD3N71TuiT4ORh9bR2DlIYzYCIF9boXHnLlsTDU7/y9/UUt1SyAwCCfFQprVGhT2q8W84AAAAZgNPR06CB8H/xbaAT2AkMizPNPKcNUGuJgAAABIAAAABMEQCIHsTPnr93jpUValJLv/FUUGJ4j7qLNvOjnIGJ3Xr/MqYAiAU+chEtBNjMQESCdz+N//2JJI2P4g9/tXvnuvjJT3PLQAAAGcDT1JOAlj0dHht39N6vObfa7sd1d/EQ0oAAAAIAAAAATBFAiEA40YdBG7ZOH/5fhN1lFRbS147KgRwZ2JfzZLJuPAieWECIHMLHRgKDb3UvRK7xQ3Phf1bvMyGzg8AdDjdIju8tct1AAAAZgNPTUPWvZeiYjK6Ahcv+GsFXV1754kzWwAAABIAAAABMEQCIHS7QWG8tSR9crd4tvyxWCsrXd71dmWo8h/SER4d7LAsAiA2/hP+8TwzMFIdi2JDGWcQVEXOTnEiqIhpUvovMqhRJAAAAGgET1JNRVFuVDa6/cEQg2VN57ublTgtCNXeAAAACAAAAAEwRQIhAIX25esBsqVefPGQMynsPrvhqQ/FDZhTnHmd9eWLRLvZAiAWYMIFrZCY5W7GWXizZTlRHV5oog8eRHrvxdLbCLe2sgAAAGcET1JNRclt+SEAm3kN/8pBI3UlHtGit1xgAAAACAAAAAEwRAIgB2UqIAQIwKz19SDWI6dCKp+6C8785k23mAsAq8VRBEsCIG4FX70cYA94UGeWkN48Hu53wFojzokXlExcvAstlT/uAAAAZgNPV04XCydc7Qif/66/6Sf0RaNQ7ZFg3AAAAAgAAAABMEQCIBFB3zL+tHl2GxpPBKZecxwMSzlLbQb6nXkYrbhnhByiAiA9D5ahL2DF58nm9QnRgyrCOF4nhbCQ4qEEFamBMGMWXwAAAGUCT3hloVAUlk8hAv9YZH4WoWprnhS89gAAAAMAAAABMEQCIB3qdGyR//kZQ+ZVq2vE0uWIz3QPsAF7H/MrSHMCn9qxAiBInJ/9E8FvpJuGqw4Jc27hG+EXfh+YeRrp7eITAAmBuAAAAGYDUFJMGESyFZMmJmi3JI0PV6IgyqukarkAAAASAAAAATBEAiAkUL7lZTtSky3MZhjjMtZjfOhvNeK2HueK1sHnYou+zwIgZC1Au6AQ8LkzeEUShGauH9MrxwzB+cz5Lbu+BfkEOukAAABnA1NITIVCMltyxtn8CtLKllp4Q1QTqRWgAAAAEgAAAAEwRQIhAOEVvclNMDbONTKuX4nYhJDVrhbdJpcO9tSi+pXzeSjDAiBQO11ZfQQlNbQdOSxIZiK+OvwOGf6V7Vashz1hH/yMSAAAAGcEUEFJRIyGh/yWVZPfsvC06u/VXp2N80jfAAAAEgAAAAEwRAIgQGwY/omrs4XfUA/Cv/WxjP3xwRW+/9zxMrbreNVQNJgCICxnmQ1OxuwmyNb1EOnMak03NHWgTVgtgCoEY3LdeOjVAAAAaARYUEFUux+k/es0WXM79n68b4kwA/qXaoIAAAASAAAAATBFAiEAmx0R8JnD2mQMeunMuYNvVpJS5iGvz8EpCTw3kaKtQbUCIG5oyQp9ZnRyt950VssW3FuSvLHGkS6Qd/AlW7/DvIUsAAAAZwNYUE47nglNVhA2EfCs79q0MYI0e6YN9AAAABIAAAABMEUCIQDlILNlrlRgUyVmt+/ZMjP8GJgR9608ShKAEawXislikQIgdcit38sULxxB905wtkvhxncjzESE4WUL09dMgOoblMEAAABmA1BBTtVtrHOk1nZkZLOOxtketFznRXxEAAAAEgAAAAEwRAIgS4CE6uI/xgAI6aVxuO04iykp/EdliwV5i03uV5l4nEYCIC5Gfi9I+K2Gp+lxfE9aYj1Cg5NcqjLiYgJGO+iyHqUoAAAAagZQQVJFVE/qX4jlTZgsuwxEHN5OebwwXltDvAAAABIAAAABMEUCIQCrM8HqFMhm8bVgx8EknRTUm1q+GmqhqOPskPeHT3xP5gIgAxu/0fg+iooGPt3XdaiAKM5exXA/5dwcWea94uywe2QAAABmA1BUQyqOmOJW8yJZteXLVd1jyOiRlQZmAAAAEgAAAAEwRAIgRFs4gVyCREL0jb3EhYTjTJ66Qrzpp2Mug21ymvTbCqUCIEuzYuD72qBv0br61DlVtyouKpc5SEE6Gov7Ktq14yrxAAAAZgNQUlE2K8hHo6ljfTr2Yk7shTYYpD7X0gAAABIAAAABMEQCIDtMxE16V7hpex27a7ifL71/215jbp06ZeHZcOCXnAz7AiAey8ZPhSUtZ9A4ABfl+1e/sOZe2vjAiQtd7U6S4RhYswAAAGcEUEFTU+5EWOBStTOxqr1JO1+MTYXXsmPcAAAABgAAAAEwRAIgFHMcbYYcFxFB4ToPn2Odtb/z/a3jTMdzJolkCAZfWmACIAsHT2gym4rceWwN3zKrAatB9P7r1MKwR/WsTA+NJsK0AAAAaARQQVNTd3YeY8Ba7mZI/a6qm5Qkg1Gvm80AAAASAAAAATBFAiEA1pSq751tO1pUn/VoIkrraT6wLsupfjqrRcOLBZSPwkgCIHOc2hB5D8mHlrUTUFUUnCwpIRrsDJni/uPOd+GNLk9wAAAAagdQQVRFTlRTaUQEWV4wdalCOX9GaqzUYv8ae9AAAAASAAAAATBEAiBBAtnuBnxOQk3w5eGvN4YUmseKKGebDDVxSCHbURNYWAIgH3etUDtYFjU0BB9ao4EBC9pMkQt3cqOVVmn1xHgLRRAAAABnBFBBVEj4E/OQK7wAptzjeGNNO3nYT5gD1wAAABIAAAABMEQCIEBCLN6BW8NAuY2Nhtgd8I5y3JbqbYozL0CKR1TNTuj6AiANwd0ei0eNcaMSarXrERL8nLeAC5OFAud6WOXvahivqAAAAGcEUEFUUp+6aE130tahQIwktgofVTTnH1t1AAAAEgAAAAEwRAIgFMhsUABx5yOPHh2sfMAjO4X5CDY0shnVSX0HD/0luxkCIG4QkAWIZpgkjbjgKUdFyZkQ7df3yhn84Z5YNk2lRQQXAAAAZwNQQVTzs8rQlLiTkvzl+v1AvAO4DyvGJAAAABIAAAABMEUCIQCtO9nxHr9I4l1COut82MO6Rjt84RnJ/5VioT6Bz7bLmQIgYTvSAnLITXDJoAl/Q10rgjdYAlI1g/M9rBQcKZZEr6UAAABrCFBBWEdCRUFSPEpG8MB1p/GRp0WbtR6x+BrDb4oAAAASAAAAATBEAiB/t7WDCgJwFfjHoqitwYHexlEGnMaejAT+b9jVayn+GwIgIcHI5sE6ZuSwJKpGpBy6mnXeHefHbE1cTl7tYSKbCpAAAABrCFBBWEdCVUxMgfCe1LmLHI6ZsfqDi3KsuEKv6UwAAAASAAAAATBEAiAjgvpj68Wm5492D+7V9OajC9ToWKsiq9ULROaGrMnjUwIgZftSFnV9jh7Q8aOsSx7JuLe2Q7li6yMcLqFMUogX3MwAAABnBFBBWEdFgEiA3iKRPa/gn0mAhI7ObsuveAAAABIAAAABMEQCIADw5XZ1tjZzhPyC6M0jB7NF2DHTHXlZ/ZuDddXOM/1mAiB8GnmehtTfMDeEqILuryMf0KigoATqKzxJNIpbB/18wAAAAGcDUEFYjocNZ/Zg2V1b5TA4DQ7AvTiCieEAAAASAAAAATBFAiEAl9GZ/1/PiUvEMMepZGqtD4EOVOFuPQAxL/aFPXH+m4YCICf2qRYYnKCa8OLKp60ovbbHVKoEXw1DJlX0TEDwUvp8AAAAZgNQRlIvoyo5/Bw5ngzHspNYaPUWXefOlwAAAAgAAAABMEQCIEa6w57dDJ4gyb+H5gOwPOSSHz/PfeuPeBj+ZXiRUBh7AiBFh3ISGSIzQc2mfY1aoXM+8j1kM75NfjSBk0HybZCeXAAAAGcDUEZSY1Pq340dRCEAIzK7kHQiKxTVSIEAAAAIAAAAATBFAiEAu3mR+a75pY3NqtrGM5MBAvvonI7PiUqMXq1P0WLgu3QCIGwc/6YKVsJPzAehwwXiMH50nTT1TbylPb8ZYw8+Dv/mAAAAZwRQTU5UgbTQhkXaETdKA3SasXCDbk5Tl2cAAAAJAAAAATBEAiBDjoEyNdKIbIo6wfOqr/QQ+m3e8BfmnoLGmqC+NAzchwIgFiKxckrRZoTICkxdcRXbyQgTpLFVd52SC5iseHCGDy8AAABmA1BQUMQiCazMFAKcEBL7VoDZX71gNuKgAAAAEgAAAAEwRAIgBQUpx43gXT7VY4gn01RMl4zmI72LzQX6PYx3S2+Wa5oCIAXJzOkqH+JFm7sMU1LadGiXik91BNHzU+d2r9mQu2OWAAAAZgNQSVQP8WEHHmJ6Dm3hOBBcc5cPhsp5IgAAABIAAAABMEQCIBNKptgh1JQj1wlhlSfmFK53EEgJHv3Gs3Gg/w5YfIP8AiAuJY/wJj+t7p2YZLb0sUj+4lpHGQxeyI0Cb49NtEvYCAAAAGcDUEJMVWSN4Zg2M4VJEwsa9Yfxa+pG9msAAAASAAAAATBFAiEAm5QvfDmNLgMfiNBd41jjjGtVXfvu+7h9aoJq27EP78ACID5D5V37S1pTKb6fCqgm7t4r5X2P66wOfa0uQa597OMZAAAAZwNQQUm5uwirfp+goTVr1KOewMomfgOwswAAABIAAAABMEUCIQCiF7hlkO4ntp/LxItBBSSj1N0+GiPpatrPdzMEyPfDmgIgfyUyLLO9zNpdXtWIN2of+basX8h32ib9438X6V40LL0AAABmA1BDTDYYUW9FzTyRP4H5mHr0EHeTK8QNAAAACAAAAAEwRAIgG0vxaXJUp9s0E1Vw6rEeSsb/pUAffY21fupH/Iic/H0CIHR43t/Zt6B8m4vWjMCaMJEHOBwHPYjokmkMFngCvoqZAAAAaQZQQ0xPTERTFIu0VRcH7fUaHo16k2mNGJMSJQAAAAgAAAABMEQCIBKC9uXoYsLtmQQoqmf9DAjWaZu2dzUKqK52iH27+8v9AiBPDhM36KVPJSdo9kNkygdMKJu7cf5o++vfpuzNNkCEDAAAAGkFUERBVEENsDts3gstQnxkoE/q/YJZODaPHwAAABIAAAABMEUCIQCyUAfMSXcLzWJ0LlsyJhsdiz8EtRpwjOd6ZW8M0+TxQgIgXBVhBxlFjzE+vdTcy5jBPVnYtWKl1kNNseEndv+rC0sAAABnA1BDTA8C4ndF47bp4TENGUaeK117XsmaAAAACAAAAAEwRQIhANLXSRUkL4/5vaZ+6DQyZJwPx8BrBB5IxCy7ySYoPF6TAiBFMXGNHbCgCz+s4wUjFFjEVRU8P7HWTjvlE9+CLigizAAAAGcDUEVHiuVqaFCny+rDw6sssxHnYgFn6sgAAAASAAAAATBFAiEAg63GhueQMOWfDCWpxB/uziDuX3h5b2RaLNnq3Eto/XACIA2mc2IXJPV5ZvAVClymZYUZa9AnMUCAbP8Ufv7oZ3QMAAAAZgNQRVC7DvnmF/rd9UuNFuKQRvcrTT7HfwAAABIAAAABMEQCIDqisiPob4DO2aTki4O81h93HMG6DBrw3WqQQA+8tyL9AiBHrKgRCVSRSO+xbsCdRdoaaXhgJ7xnC1H45AaOZ2nqpAAAAGgEUEVSULw5ZomJPQZfQbwsbsvuXgCFIzRHAAAAEgAAAAEwRQIhAM23GPxC7SkJkoYkrPP1VWlQLf8myrTfIKgEVfVQLE+5AiB8Dgq4of/xwmkOMkBXQF99ayT+RmcTLsQ73Awo8fDxHQAAAGcDUFJTFjczvMKNvya0Goz6g+NptbOvdBsAAAASAAAAATBFAiEA98Vob2HExd0hdgDIA3E11jYOVTszfp5GgW2SwuCcXGECIFk/Gr7hyB3dxq3i0NNozYxg8i+KQhbzTQmGkMlpAdGAAAAAaARQTUdUr/zdllMbzWb67ZX8YeRD0I957+8AAAAFAAAAATBFAiEAm29x7dn2cxX9nWVUJ+byokNMA0HD0BaHiICsATTkpPcCICrJq+OOeIYtewNWFFq9OqG7gn/1K1EqAjbllGXfym/xAAAAaARQRVRD0dO2YtkfqqSl2AnYBPpwVQsrPpwAAAASAAAAATBFAiEA1MaYqBeMIXAZ2i47Tx6lSVTS2nmqBXo2xxYhtn53nXoCIHeEiQ6abz0q4Vbz1LXRbIG3hs4E0U+ZNN0bk0a/huGTAAAAZwNQRVRYhJaewEgFVuEdEZmAE2pMF+3e0QAAABIAAAABMEUCIQD3tYdwMUV0xGbcUyaBMNraYFJI5f/ahCWTriKswpfipQIgaDKPwmavR3M/T99IjspBPX3K8XkLKOrvRzhWFYMC368AAABpBVBFVFJP7Bj4mLQHaj4Y8QidMzdsw4C95h0AAAASAAAAATBFAiEA8jq7skAB16zMhgN2P3clI7Q3+Mt9B4WY7QZPD7dCohQCIH5xaSM6yzeNCfpLJjLWJJy1l+BOgESv/MOP5k2VihnTAAAAaARQRVhUVcKgwXHZIIQ1YFlN49buzAnvwJgAAAAEAAAAATBFAiEA0CvY0lp7jgaNN6F001Vg8iP6mTNu00bGh8uV7a6aPEECICn1ai881YwcV+Mq+izZNWNJRU1Fbi1YpFp+RW7xMwO5AAAAZwNQSEFsW6kWQvECgrV22RkirmRIydUvTgAAABIAAAABMEUCIQC3lFS2Q76dqKM+1/SVtUQs1uMcDpoDH3pHrOQkN72dwwIgRiGxyq8Ktr3917XWEM39bYSr5ytu3rftFtci5FldYpQAAABnA1BISRPC+rY1TTeQ2Ozk8PGjKAtKJa2WAAAAEgAAAAEwRQIhAJCp9+mltq9rn9ZLGbCU48ONACmskmCpPV96Ia6M8ZnpAiAMnItQEbuV9YYil2al/93gnyfaoXWiGdU7zEv6HxhrigAAAGcDUExS44GFBMGzK/FVexbCOLLgH9MUnBcAAAASAAAAATBFAiEA6554gAQUkLnqm0LHPsWh/qcMHXrtMg9nyF1svxt14CICIDO0IKajSYQJQGnHsH+QAKnm9qTfZJ57bY91KRzscQHdAAAAZgNQTkuT7T++ISB+wujy08PebgWMtzvATQAAABIAAAABMEQCIDQqV3ZstHbVlSPYl4vGUM+Wi0Clza9Jq+GZVI/zsutqAiANm7aaycycj/5OgTGhjOU0PxSbWcpyRYpnf30FADhcYwAAAGgEUElQTOZFCfC/B84tKafvGaipvAZUd8G0AAAACAAAAAEwRQIhANeQaCcQm2ChUReR1Isn8cFiWMuSHjRrhZjbyvgmcRBfAiAUr4Zqteacl7dpQBnHpidSq6YZDcuAdiKyMtVOHQFoDgAAAGYDUENI/Kx6dRXpqddhn6d6H6c4ER9mcn4AAAASAAAAATBEAiAG48GwKHlJB/4vWfUnIuxe9vmOqpibHXKokX9crWqVUQIgKri6o8SA+HsYHOpDWr5vpZnAe3rZH4FGnqcnzWOEMJYAAABmA1BJWI7/1JTraYzDma9iMfzNOeCP0gsVAAAAAAAAAAEwRAIgefgyPzx/pGj5p4ptpCMYAfnK62ZSTdqrGvkbTEcf4AECIBMLEOddeOq8cxiDxP2QxY0Ds9CSmfaDJQ6RPKF8EirBAAAAaAVQSVhJRZMYEFRgYm5/pYMI+kvOQORhbzVlAAAAEgAAAAEwRAIgaNaTQhRnQYpmQhpeyUY4EvZ4BbtYXVGUs+VLsANv+scCIFZabQk4tMKaJyibXs1j983ZJE/vJRLu2psp0lxAMiZGAAAAZwNQS0cC8tSgTm4BrOiL0s1jKHVUOy71dwAAABIAAAABMEUCIQDpMz0UmGshbAncp5GZTCCd4dhQCayUSzwEy6vHPlt6UQIgA0B41oAhgeRDziTVQYJOVPrNyTWHgrX3P1BR1ZteVhQAAABmA1BMQV9bF2VT5RFxgm0aYuVAvDBCLHcXAAAAEgAAAAEwRAIgRDTJ916DXjry7z081p4EwiteEYHfWzAZLZDcndzbyKECIAUm5aXgLAxviKli58Hhf47cms2mxk9QOXR+bEOkAFJtAAAAaARQUEFZBU1ktz09iiGvPXZO/Xa8qndPO7IAAAASAAAAATBFAiEA+hugPH2hM9nDhDhtyNMx8reQX93z0lTB+j5/cmBD/HwCIA38ydXzfghy+qPZ6FW2tp1wz6Jpc6798EhnU2xpQOeNAAAAagZQTEFTTUFZQWolYop2tHMOxRSGEUwy4LWCoQAAAAYAAAABMEUCIQCELHwrJbbovV1dcbHLU/OMq23hnMc5nvURKJWskc5BugIgcrj7t0rLSNuJ5s5w9pObe+yiCWL0XSuXMPbOe/6lVGwAAABmA1BMQTpPQGMaT5BsK601PtBt56XT/LQwAAAAEgAAAAEwRAIgZ4O9eGB5CdlCSVA/CsOqd1dkeMxFxhAq83Zh5b0FcbcCICarl6vhrDIN6AImNxTa38WZZpMPj6XhNAjrA0dFkT2GAAAAZgNQWEdH5numawaZUA8YpT+U4rnbPUdDfgAAABIAAAABMEQCIFwolMFMORVWz5/bOswtgLy868gnekXwE86Fej4XbHV+AiB4YA6yV9Yby4JELvPjhlz+PuRJhm+shEBFJ7Pk7qRHrwAAAGYDUEtUJgT6QGvpV+VCvrieZ1T83mgV6D8AAAASAAAAATBEAiAwoJPQJiDqnfY+XyBedesTbQ+m6gN36sDjl2IcT2ndrQIgGXZ20qe+hKDJhKplMLV6hMRNnEP49cuIQJY+72h70gsAAABnA1BMR9s6B0JRIvLJyql6j3MY/Mgxjk2UAAAAEgAAAAEwRQIhANPr3hNtNGLP1FgnOY3ce/pmAo8CFITNKMm8CsGEcAcOAiAicNDFgdkPKmkI7newGt71EiuLtUHu8894iUEp5lmA4QAAAGYDUExV2JEsEGgdiyH9N0IkT0RljboSJk4AAAASAAAAATBEAiB3Cx9VArlHDK4T6KZgZHcND7jKELqfYT3sli1uDKU2cQIgExUJJYeRlv7emyC+3BRkN0z6dgc0KIztAyqCK9Z8tsMAAABmA1BOVImrMhVuRvRtAq3j/svl/EJDuartAAAAEgAAAAEwRAIgME3uSqLI9kZ5FK9Bd3Ur8JnNd+Mr4Vo3NcJsccfgf8sCICoKZSsIAO4FE2jlJ+qODUQcm2SsWZxa3ppourDlg+2dAAAAZwNQT0UOCYmx+bijiYPCuoBTJpymLsmxlQAAAAgAAAABMEUCIQDXA41MdwowLQugBmTBc0X8Bl+XLI4AT79Df+9rtgQVkQIgPU5fQ8xEoIsrnBSdcoluxePu6A9Av4rOR5JRP+afyGkAAABpBVBPQTIwZ1i31EGpc5uYVSs3NwPY09FPnmIAAAASAAAAATBFAiEA+aKXHbtBjA0kKLpOOH4XdbOnSgUIxO8TGbRjxf6+LL8CIAg0gvZbVXWFlVks+syrfl7HOvS7INdzxyaYFlA+4zOyAAAAZwNDSFDz23Vg6CCDRli1kMliNMMzzT1eXgAAABIAAAABMEUCIQDPM9T1LSU81EcPrUvxZZBEn6d7VNYqPLJk9XlBhir0kwIgdNYJGT+oGlVW/rtsg605MuTFVl/C3Wj4pEGZLY0aAdwAAABmA1BBTP7a5WQmaPhjahGYf/OGv9IV+ULuAAAAEgAAAAEwRAIgY0MBt/LGpwWnnNJ2O8lAVTxA7miQ5OtgdZnY7XOjeXgCIC+2YNxTSoWrrfQBnmTyIvcteCTwBP2842HXSgT+C0j2AAAAaARQT0xTg+bx5BzdKOrOsgy2SRVQSfrD1aoAAAASAAAAATBFAiEAuoBnzD9TCvHKisgE+CLZfvOCUGnla/jkcJTQDEJ1GBkCICgYTaVAKXEmYJBkgQ4Pe0v14NvVrepBz9eAmpfMdU8/AAAAZgJBSVEh40jol9rvHu8jlZqykOVVfPJ0AAAAEgAAAAEwRQIhAK7hqi74JpxLLq1qOGNAj2PWXt/yWPIRb0v989kNU1xxAiBB97LynVtMWwpMRUAeqv2AgpDtUpYsC6/hsJUdRS0DTAAAAGcEUExCVAr/oG5/vlvJp2TJeapm6CVqYx8CAAAABgAAAAEwRAIgK7P2oF/72KZDpeg1sMziz0Eo4zYcxzQwKJ6ycXWzP34CICkFgvmoPmsNIBUPsbzzRlqNGPY1rm01qh9nfoa+annEAAAAZwRQT0xZmZLsPPalWwCXjN3ysnvGiC2I0ewAAAASAAAAATBEAiAncXEYQRDNrRJ9kCrCglBD2/4TDOYbn4ErinA283qfoAIgXVrzfBXnB9rEfxRYJFnrP07crtoCYeRR4v9MHfLLYCAAAABmA1BDSOP0tKXZHly5Q1uUfwkKMZc3A2MSAAAAEgAAAAEwRAIgLqrC2yct5fo4F2Ejn8+vl0B9vwb84DQ8wCncm5hgSIACIA5ew9Yh0UaIkJHmRaXzBB5U6IXD3KKPEwU4QLDuCv9sAAAAZgNQUFTU+hRg9Te7kIXSLHvMtd1FDvKOOgAAAAgAAAABMEQCICQjhZCdhtfHcYbyrtZ1MhgY5Qp/5QAAJbIX83LpZe3NAiAIhxUOnHsBErB1uLY2bHLoAzxRyGlk2pFXf3xCbuaFxQAAAGcDUFhUwUgw5TqjROjBRgOpEimguSWwsmIAAAAIAAAAATBFAiEArx4wMo33sgQNRjV+lExTd4QqwMA305x2dDXT2mJWKboCIDBnRLM7CFc64RMPOKkt8dQs5aoOux9kVWNKNvxzXkBiAAAAZQJQVGZJeig+CgB7o5dOg3eExq4yNEfeAAAAEgAAAAEwRAIgGEGw0tP4l8997ttPZ+p3fruy+aemUIK9JEEIEXPHMs4CIGipBRFoaTAfkrI+rSQgDE2IZC6kj+GGp1Bridd2eiIhAAAAaARQVFdPVRLh1qe+QktDIxJrT56G0CP5V2QAAAASAAAAATBFAiEA+syytQSEbdy6BZVYhCF1C8G2q4TGCrPpz5+db/8R5QUCIB9XNvxN5O25fUNCG7Xt5ptwUctcg3q3yTF6YPnjxhwtAAAAZwNQT1PuYJ/ikhKMrQO3htu5vCY0zNvn/AAAABIAAAABMEUCIQCPosQygH7BSDBHY71D4itrYYhmKlOoXimMAvmdzp9iOgIgHf8pZ/UkIQKm4AVI5J5YGJfqOgNJ1O/TN3UUoEIHqkMAAABoBFBPSU5D9qG+mS3uQIchdISQdysVFDzgpwAAAAAAAAABMEUCIQDginkRcBr3qYFMeMFOFJaXEU9mn1W+mxdKRzvk4+mvDwIgT6yIMMxSVpE/ltPDc2yBtyA0jjoJB4mVpo1m1otZfMcAAABnA1BVQ+9rTOjJvIN0T7zeJlezLsGHkEWKAAAAAAAAAAEwRQIhAJ5xaMcUjjBo6SicTlPrThSOTP2ounWp9gsWOW0TP+dWAiAGk+Vm9v2/Y5ahhRHN9pgN1C9lCNem0Wz4QyClUBFLygAAAGgEUE9XUllYMvj8a/WchcUn/sN0Cht6NhJpAAAABgAAAAEwRQIhAOkMDMkJ5UdJzqnFPfPAajWOlE+y+ZU/VWrfAwiveRbCAiB28QdBN4nmfk9In81tlX0yWLZyZ5fAOcdXHlo7cMbcXwAAAGcDUFJF7CE/g977WDrzoACxwK2mYLGQKg8AAAASAAAAATBFAiEAkUZzBMXCdPhU7MN/upED0XfW58hSdjjOK8TnmHpZeCUCIE5qZv/lWjEfeujNm439WzMOIXb0k9Dg5KYelRfKF/93AAAAZwNQUkWIo+TzXWSq1BptQDCsmv5DVsuE+gAAABIAAAABMEUCIQDWNSqlWP/wK3t1CCvRdKuJgRlbmAHjpbkkj92zQl2F7wIgEBh6sGqoAffPMqHQVTvmbYK8k0D/jnHeQSltTKkPJxoAAABnA1BSR3co3+9avUaGaet/m0in9wpQHtKdAAAABgAAAAEwRQIhALZGNdA+ix9dHfoHuuu7aa+ehH/krhUM76YWpaF56tGRAiBaQh9g08vlG2xUASeb3HloN3VC+1BvrpGsZ7VDuK+mygAAAGcDUEJU9MB7GGW8Mmo8ATOUksp1OP0DjMAAAAAEAAAAATBFAiEAgeDTbtwS/aadvTeYe/I5Af1XPZr8/ly8c9sD1fDbnx8CIGW8E7jdyM1+8+aALXuvMEKSL/G0ZcAqZlgpIAMAC3DWAAAAZwNQU1RdSrx3uEBa0XfYrGaC1YTsv9Rs7AAAABIAAAABMEUCIQCzHvqD3pwCAInYdQ56bJCYBK/7KmP1SFX9xhDt1O1TVgIgJevi9/9yElfuknUlzREcXEU63mbmBM1BZgssB8ubZEAAAABnBFBSSVg638SZn3fQTINBusXzp29Y3/WzegAAAAgAAAABMEQCIHMXONSF5dE/xb32IVl2DblS6lfmyVvFU7TehYg3on/aAiAUW3mQ1N7Ov8PU9E9QVa16bqLGD+c98fs/ScW2Kz7pvAAAAGYDUFJPkEH+Wz/eoPXkr9wX51GAc42HegEAAAASAAAAATBEAiB4ThEB1aLPEG2zsPGGdFnZEbWtHqGz44/sgkMsB5P40gIgT8vQaFDMouE+8gxz8r06ui+Y2bQeQDxWPJQ/m63TnzsAAABnBFBST06jFJ4PoAYakAf68wcHTNzSkPDi/QAAAAgAAAABMEQCIHkcWyn+w3obaTzS3H5LaMOJEpkQhBD5ahOD+ZLmstNtAiBFmlfaqCqAn0VQLI+472zzHw+FNWjn4sQgXgVBVVTedwAAAGgFUFJPUFNv5WwLzdRxNZAZ/LxIhj1sPp1PQQAAABIAAAABMEQCIE9iaT/bXuSVHDetOqq1cAYAAnmMGy+8LQF7D7VTelh7AiAHpIIoUhQaU223CLOontBCBLOnuoDWml7a8/+mut9yuAAAAGcDUFJPImu1maEsgmR246dxRUaX6lLp4iAAAAAIAAAAATBFAiEAgPY3a1nxNCMtbMu2KZTkzwlS/5agTWQLhCV+w8YGVQwCIFk6Uq9mBt+fCkWizvApnzXEW4zB9+gFACaDM2ogCDe5AAAAZwNQVFRGiaThaes5zJB4wJQOIf8aqKObnAAAABIAAAABMEUCIQD1Xpz03tZ3tDrsw1Lq2QNBuL4RlZ2j25Jg7qNt3Nz6lAIgBuCN41HBHEz84vhxtff8HbeZ5vL24S90Mzel6QNhU2AAAABmA1hQUtfvsA0SwsExMf0xkzb9+VJSXaKvAAAABAAAAAEwRAIgb1B4Mmft8CcjjNoqrIpW2ASWN6y04ubFhJ9F1yX2qQACIDH6UzoSd47H2cpHRz6Ez1cga0Qy2QZUCq052nKcyjbOAAAAZwNYRVOgF6xfrFlB+VAQsSVwuBLJdEacLAAAABIAAAABMEUCIQDG2xxnOM86q5GvuAdwWGq+1PoDmseP/VWNgJJk7BQYwAIgNv0vCNWVvHulm4HN+c2eA1qmjVyOPapGRplimUQsxMkAAABoBFBSU1AMBNTzMdqN91+eLicePz8UlMZsNgAAAAkAAAABMEUCIQCfjUVDnnHw68MSsFdoJXPHiZzh3Q1QaGaVP3Hn4N+2NQIgU6EhxEWQgApO0rciS9L03vf476woLUuZmp0n7X2RLb0AAABoBHBCVENSKKIucszFLUFez9GZ+Z0GZedzOwAAABIAAAABMEUCIQDG79YKaBTRZfYCyuTgyblAaI9+IyQMmYJF25evupE12QIgaNazNOxuxWjuOILpXNTwovLCcIF4oKtWmohJwRRYEYYAAABoBHBMVENZefUPHUwI+aU4Y8LzmnsEksONDwAAABIAAAABMEUCIQCsGwpdlWV6KowL/3tMc6ei2UnLkGz2aC10DBggXTVacgIgS2i5u9P6JzZUHttMW/WF+jhqYjX3ZEc0fp7PK7TCG1MAAABnBFBUT05JRlg8W4bgHM0wxxoFYX0G4+cwYAAAABIAAAABMEQCIASAN+iydqaYhjcrX2C95u7U6vPAX2TB48n0tpW0SL8uAiBEiEHdLAzDrgeBXRaOvh4v3FrlgsTUew07IVXoLCmYSAAAAGcEUFRPWYrkvywzqOZn3jS1STiwzNA+uMwGAAAACAAAAAEwRAIgSfhzYTSBHBQaHJb7oPHLP7OugbUb3lXjaU7v8sHRx3sCIBqFIpgZZRT+bn4DE6r9oZrTMNbA5DbQQgmwm18tLTekAAAAZgNQTUGEbGbPccQ/gEA7Uf45BrNZnWMzbwAAABIAAAABMEQCIH0oMF29ZDVkwq64+gE6u0q07f0CH0Xnb5iCtrv2fy18AiBwOTJvCILUO/xZ2q9Bpk3HKJEnsBsdhn+HreuwO/NLogAAAGgETlBYU6Fcfr4fB8r2v/CX2KWJ+4rEmuWzAAAAEgAAAAEwRQIhANgkdipTYmq5QSSggLb0uZkjDhKwSVsEif1/+dhnH1ocAiB3M3XA2KV80iSI2OJAbmYOKbBCGb6ZHDi6V/dVDV3l3gAAAGcEUFJQU+QMN02IBbHdWM3O/5mKL2kgy1L9AAAAEgAAAAEwRAIgP86aL+Vh54NXdmMrtQZtyySKBlsYHXfhu+wF+LOHdJ0CIErKF5D+qqoa6skI0Ak6kunv7MCHs7M0hOrXdbziRGSiAAAAaAVQWUxPTte308C9pXcj+1Srlf2PnqAzrzfyAAAAEgAAAAEwRAIgF8QBg/tiNhzreNH0eH/lOkgsD0r4JGSkzNHrZoniP7gCIAKS/Ntu+fcGt+AeoxWdudv+eP9BIgV17Lfb3b9u3lm/AAAAaQVQWUxOVHcDw1z/3FzajSeqPfL5umlkVEtuAAAAEgAAAAEwRQIhAKzKNwektgDj6/zG+ZqN43WbiGCilI8/k7FmB8OUa2r0AiAOmIfscpHp6bmbsIVGynwxSyJfKibUYC+9jM4fMZ+FsAAAAGgEUUFSS2MSDM17QVdD6HU6/RZ/WtShcyxDAAAAEgAAAAEwRQIhAIrIVRVv+lKS6jvD5u7Q79kr1bkO2YxmQgREIy/P6WxjAiBaF2SGRLyYlC/O09YG0PkRgVNSNXZILBb3QRfku9GoHgAAAGgEUUFTSGGOdayQsSxgSbo7J/XV+GUbADf2AAAABgAAAAEwRQIhANqcvRJhk0N9F/WXFe0u5ghkWfXNPo5j9eaN9C+yKCrOAiAiJ+HQ2z5G8NH4slsVP8FrHUESV+pxK1cfq5kSMeXKzQAAAGYDUUFVZxq75c5lJJGYU0LoVCjrGwe8bGQAAAAIAAAAATBEAiB8SAK1WQy/LN54Fo4KrV+8IuWSYm9rR9a8yfGFSoBm+AIgQ87acoJFaDxNneXOPq3q0s7Oxoz4HzDQ5Cfv1mkdkNQAAABmA1FCWji8ic8fY0xxiWYgvNgHryNcvezRAAAAEgAAAAEwRAIgd/+4k7Z91BqLHdCHD2rURDrjZlLbpCzgQOpDJo95UOYCIChccksR/VUUuKfF38wBkzQLKJ4XoPWevWhmfnO8qGrTAAAAaARRQ0FESha69BS45jftEgGfrV3XBXNdsuAAAAACAAAAATBFAiEAnNIUaf5ePrdjsZ3l6SK+vD1Zq5CCVwoJC7Sddpbi8aUCICxa+JhGqbSlDmiBAXyhW4wqPKk4M1cCAvgt5EzaDf9pAAAAZQJRQ+dLNUJf5+M+oZCxSYBbrzETmoKQAAAAEgAAAAEwRAIgIcCQ0R7AXET4w32MVbn2HDTz7EzuKUGPn+33gWX3nVQCIAqLcjn1Rh+HitV6jh21fhcsoO8th9zANPqJtI1a5JVJAAAAZwNRQlgkZ6prWiNRQW/Uw974Ri2EH+7s7AAAABIAAAABMEUCIQDAQJ8AGKzAXfmPXO6mkmAgmcAmHIXm9gvGB5UvpXvPYgIgbZY5hBr94LyT3Ud2W3thxQpDkP+DlSLkinhMoqfkOh4AAABnA1FSR/+qX/xFXZEx+KJxOnQf0ZYDMFCLAAAAEgAAAAEwRQIhAJjPS2VaBsArEkajvDV4G0hPNZ+QNkCNZG4czI0KBSK4AiBJ6sybMXVYVnGw7KFiJ1oGj6Oi5HvQrVI0Dg4ylUq4WQAAAGYDUVJMaXvqwosJ4SLEMy0WOYXopzEhuX8AAAAIAAAAATBEAiByWyrBUSLDiPhPJYVW4te/RLxofDisma2zHiOpdnlIPAIgOBVrJp4Znxpug4ysQZ5L0CjJNrSaqpSYyMwZtP+4jLUAAABnBFFUVU2aZC1rM2jdxmLKJEut8yzacWAFvAAAABIAAAABMEQCIDOQIltGeBOBXjtsduHoOjXO+bEyD4cLlLjQipKcRpJHAiAY/TEFKw6c4cs0Ysw0JV4n9H6dJrCQoHVnX8cGjcybZAAAAGkFUVVBS0U1r5k+8+icB25B5GP71M0A0xBc0QAAABIAAAABMEUCIQDVXflQDKYp110xE8gItCphJ+65SuGcGX18xQN+kdtH3wIgZQLLLbtUGLoxn0N1L+I2YmyO4z4AuaJNYmrWI4IciukAAABnA1FOVEoiDmCWsl6tuINYy0QGijJIJUZ1AAAAEgAAAAEwRQIhAP/factcpfLeWAoHltBAB7r6TbSgpt9z1rofP9sVA/guAiAR+UrFSSXuocazOGHLhbo+I397FoujKlL1Mpy8TArrQQAAAGcDUVNQmepNue53rNQLEZvR3E4z4cBwuA0AAAASAAAAATBFAiEAm0n3D2ri+gyqVsyHEIsnSTEb80ujMSnfiKPARcMgaZgCIAErl359BS1J3oUbCyaa0v3JD00Oc4Y8snmCJOjMQoQxAAAAZgMzRkFCY6LwRWMF19EPikVV+MO1k7O4lQAAAAQAAAABMEQCICvEXIsyqmJv5xNvEcaTXc1ftI2Te16d0bIm/p2iL9IWAiBEhy9Z3FSwn52LMfp5Uxl3VI/0u6t8YzQHYvL1q9LiCgAAAGcDUUtD6ibErBbUpaEGggvIruhf0LeytmQAAAASAAAAATBFAiEA2tMCDQRL3j3Nt5KhF0EN8WNQ7pxyaRui87eYea9DnCoCIBJFYHPeTx5OLzeubf4u1vGglxXwPEEGGA30MsO4i/p1AAAAZwRRQklUy16jwZDY+C3q33zlr4Vd2/M+OWIAAAAGAAAAATBEAiAh+XRUJ66RCK17BvN6MDb7pn/cVquDFEhwpd+7/Dv7RQIgMnLsmumhExI+OdBsWvroxf/uA7aDYMEIC0Cs4mQfnxYAAABnBFFCSVQWAq8seCzAP5JBmS4kMpD8z3O7EwAAABIAAAABMEQCIAPD/ZaJFlRhe0hoIRlp0JgawW/CCusVW/xWF++wY7OxAiA9wsrq/yUB857jLU6mQqLvh4bwCXbphb04R2cw/ayx0gAAAGcDUUNY+eWve0LTHVFnfHW7vTfBmG7Hmu4AAAAIAAAAATBFAiEAoIfTJ7yB415oU6Mcoz3QsMj3Rz754zBBdeYSndZBIP0CIGea6Pzm3waeYhpxrlcvqHRAfdCmmiLVbKe9UxLCnsQpAAAAZgNRVU4mTcLe3Ny7iXVhpXy6UIXKQW+3tAAAABIAAAABMEQCIBAQXdkwvVCooxOnTLQRQSO5DQ/bK59CXdmeZxqdymN5AiAPExDPr7JhrjyEGqWojc0kR5+B931leenuiAwc+oL0PwAAAGcDWFFDcNpI9LfoPDhu+YPUzvTljCwJ2KwAAAAIAAAAATBFAiEA1fVtDy+EOkSjAIOH2EPaf5hs+iS7N7JuyUDi3GhMKCYCIAF52jrmKuHRcimpkkXHtCyK0AQS8m75y3H+a/PE24lzAAAAZwNRVlQRg/kqViTWjoX/uRcPFr8EQ7TCQgAAABIAAAABMEUCIQDlXnJnKhzMyBrfC6IaUcKPga2DT5oFxFO/bxBrLV+QCAIgJ33lERon8UJGPYlMqvAs/paUQM3XCUcX3nMvDdbRgtsAAABnA1JBT0XttTWUKoyE2fS1034bJfkepIBMAAAAEgAAAAEwRQIhALAj8izoCj1RBW9YkKl6L68v3iFYEchKWkUzAwxsCrDsAiA3ZyWO85PRGU50vAmZKeDjfBaqvNtmkU41+VvZ2kbWpgAAAGcDUkROJVqm3wdUDLXT0pfw0NTYTLUryOYAAAASAAAAATBFAiEAhct3o++Wn2opukJhkvPRjrSPUYrRnLnF+kIbaOrKFuwCIHPJcnGt61u2la2ckSnRE4CuSRVg6lkYs16BfEN1GcqeAAAAaARSQU1QM9BWiUHAxk/34PtPugsRvTfe7Z8AAAASAAAAATBFAiEArCm2hEHF4Vqn34rcNiJripiNWoIwLsH8rZNGRqwZsQMCIBDLUzDh/8g0pQbOs5Wg1xsR4PEVhimOZMe5QfuKQxnIAAAAZgNSR1TSkeegMoNkD9xRsSGsQBODpGzGIwAAABIAAAABMEQCIDkKZR/Kk+oPur/qQP9KUWX0WymKyTQFaBv+y+PVM2aBAiAgPiUT6a6tMBxl/bueGSc/rthoquDPFdOFT0mUeap5PgAAAGcEUkFSSfylnNgWqx6tZlNNgrwh51Fc5EHPAAAAEgAAAAEwRAIgGzLdmhDinJNNplLlpTooji/pztmKjksE48fDWo786xQCICPwOe+pwuVEKirWNCMJZWaHZqOSEyj7dGsIriwWp/BZAAAAagZSYXRpbmfoZjpkqWFp/02VtCmeeumna5BbMQAAAAgAAAABMEUCIQCncP9rDh2ybf+HpTwp+gxjMhgpMko3JbjjivLkzDFZDQIgFewObvrZLsBLzhYT/DJByi2nx02fdGgIMh083HzDepwAAABnBFJFQUySFOwCy3HLoK2miWuNomBzamerEAAAABIAAAABMEQCIBlEaFQILsAog6FpagAwchp0KcdSAC5Df2hcW/QvOsSFAiAQD/ZciMjzutuSe0RwT9uGANG6ZoiZTe5xMQJT+tuyNQAAAGYDUkNUE/Jc1SshZQyqgiXJlCM32RTJsDAAAAASAAAAATBEAiBIxeskPOPcZTdGLSHoFuzJftdAAH3NOmtNl94UeIgtQwIgbLDQAl61THR/igcjkMi1DStf1+hWB4Fh0Y2Ss+yrijgAAABmA1JFQXZ7opFew0QBWnk44+7f7CeFGV0FAAAAEgAAAAEwRAIgXquCQVHMmY+r9uJkDT9GOLYNjYezVn9xvRpCXU+O7RYCIFjgVAzvkO9lPVvmxAanUaAaWUDaxxw1hfipfLsxxeYsAAAAZwNSRVTXOUCH4du+R3/k8c83O5rJRZVl/wAAAAgAAAABMEUCIQDlzy8iG0dY6180KYH6rOqIvsQfGtxty6KSxZmDFzI5LwIgWa80ZFQJUksHTu9jzKxPUZQlPQyJx0DO+wIcsH6vWJ4AAABnBFJFQkxfU/eoB1YUtpm6rQvCyJn0utj7vwAAABIAAAABMEQCIFiw8oiNYr5Q/ij1v0b9tzqqJIjOtChrt36YNmUU2hXDAiAhWiZ8b1xZtQ69X/4Ne+zsPLZU+3xKZWoJq+kikhkRTQAAAGgES0VZVM4Tq84NtagiRhbvJNOXnUZvGc+QAAAAEgAAAAEwRQIhANRHZ/kGzFPq6hJ7RFH5Qydflo23IQCFtbs6JZVfMMXpAiAbtOnv02SMXnBHKpwJJQOCeTGD2omedN9aqGdWXiOSeQAAAGcDUkVEdpYNzNWh/nmffCm+nxnOtGJ66y8AAAASAAAAATBFAiEA8SjlAfHQAfuDEK/emFnSvZKtKhYKEJx3MffCk8RctJUCIEoUeEuln8Fzu7hlFQvvWjNjjz7zsx6faiRRkD0l7vabAAAAZwRNV0FUZCXGvpAtaSri23UrPCaK+tsJnTsAAAASAAAAATBEAiA5jWrxpEE1b/7VyE+ZkrhlZgnRvuQ9iu3v80jceHF65gIgU5spSX19gkajtZgdS/47F5AWOgwN9kNMG2v9n6hMOosAAABoBFJFREO1YzAKO6x5/Am5O2+Ezg1EZaKsJwAAABIAAAABMEUCIQDzTV8+VIj+PtrvzaKUTBdbhvYmmofJRpQ7cPhlDOhErQIgEmxqFcBNdEuE7FEmxcivmYAuS4LT+NMdc/9aHLEWP/oAAABnBFJFRUb+Pmol5rGSpCpE7N3NE3lkcXNazwAAABIAAAABMEQCIFltmutE0N5viIo37y0PZylzbvemYnfVMFzz90W0kzRRAiBTT/bj5vUcIVXpqLXP7MfDeTyT8RhSlGME5JL0vGvYEgAAAGYDUkZS0JKdQRlUxHQ43B2HHdYIH1xeFJwAAAAEAAAAATBEAiB5uxRk4cGX9P3sSYthQbqqQ7f0KbEFCrXVHNcCTwGfngIgJQuYaj3l0ejkjOEFPYEKNDysBoy3RTE2Oqiv9V8PPEMAAABnA1JFRokwNQCnq/sXiydP2J8kacJklR4fAAAACAAAAAEwRQIhALqWA1qRFjk5wFxPyFFZDw9EF18N4SH1DPBulce2gU5gAiBMxZMIbyU4ONlnepqNPpMtpe3tP39ZZ2YV7e30vICNpAAAAGcDUkxYSkLSxYD4Pc5ASsrRjasm2xGhdQ4AAAASAAAAATBFAiEAxb75TQRA47sBmC4PTaLATSDJw4mbXxGDBzNTyPxiM6ECIHVXha3DhSDpz8PTtV7myeG6/FCeCB33fthvSOTRBb+CAAAAaARSRU1JE8uFgj94z/OPCw6Q0+l1uMs6rWQAAAASAAAAATBFAiEAmEwfO0rGkxRmcXJlEy2gNfpEQvGVjnfUioehswJs3UACIHYj22Cf72wWP4Qoqj6SLsPpt2ez0d1ChV81tnA6lSyaAAAAZgNSTUN9xPQSlGl6eQPEAn9qxSjF0UzX6wAAAAgAAAABMEQCIC3gkK+3TsWxmr4eggMqJSP/KWot8U9W0HvngUmUN8SUAiBc3L6eW7SUY7tFLmDecW0Q2sPRL/46UDAhEy/qNBry7wAAAGcDUkVNg5hNYUKTS7U1eTqCrbCkbvD2a20AAAAEAAAAATBFAiEA1vD50PM5XhCnbQDCr8zXH0dlaQ+92ZL4+JuColeL4CACIEKXq4PYdDSeUawdpqpNXl96LlVar8nN/eUYlcjJMvDaAAAAagZyZW5CVEPrTCeB5OuoBM6amAPGfQiTQ2uyfQAAAAgAAAABMEUCIQCO30zFpTaD2yNy7vlbrW9sGtI/QPpfVs/s7VzP0P5ShwIgfP/8DjXRq7HSdw5Af8NTXaaoVqZzKIdyOhbjuMpRIdEAAABoBFJORFJt4DfvmtJyXrQBGLsXAuuyfkrrJAAAABIAAAABMEUCIQCFdITAizT8xQ187LdhpmUq78FXU/ubrEZtXeJdioB5aAIgXo44rYuHMtpmFWM/9H/4xwpPAtoN48F3tfbSIY3PfCUAAABoBFJORFIJlr+10Ff6ojdkDiUGvntPnEbeCwAAABIAAAABMEUCIQCe+ifYdELzxwbnoE6akiHvsLSaWeyBW2T/tVJKeu1PGQIgTfClmJFzFE/PQyvW0lcHJeBTvz+GFdV/ndIcMSjTjw0AAABmA0JSULIsJ4alSbAIUXtnYl9Sluj6+VieAAAAEgAAAAEwRAIgYprZYoC4CqFBqwXy88TZzbOhydTn9fqs7pMxNIh5kDICIGci+rQJprPTPRcSTSVm5IIHemTajNS03SLbOBCrkKqXAAAAZwNSRU5AjkGHbMzcD5IhBgDvUDcmVgUqOAAAABIAAAABMEUCIQCpFrJ0vbx0A0uvdeeGPGcxjXAzapn8Wie8bYQ+YQgc7gIgdLo/IjAV99WcAHdx/HZ0rZdDj/5s6FdVmZ60gFs7e/MAAABoBVJFUHYyIhZXd2hGiQmJp1m6KXPkJ9/1ybsAAAASAAAAATBEAiBHusGJCIc+F4SKc7jGuaq+YHZqH1KlfRaTSJa7e2TURwIgIMP9rfhcaFStNBhhl2uRoBJS7F5renpy2MRdGvJKVkoAAABnA1JFUY+CIa+7M5mNhYSisFdJunPDepOKAAAAEgAAAAEwRQIhAMQY9OHJJzIYxEM2LJcm3U+D4iC89+uDEVjw64ZfAfCrAiBvNuL0SdCGiTmwpdBLl4WdYB3zrZqKRMX3UZdaFL8hzAAAAGYDUlNWGW9HJ1Jup/seF7IHGz2OqjhIaYgAAAASAAAAATBEAiAUnBxRUYwIrSWbRG6h5j3j8jbm4mOpEMNUUajOFReCbAIgWufPfaMnF9BezCIlicMwKmax3CFP9znHs8x/42elHacAAABnA1JTVhxYV+EQzYQRBUZg9gtd5qaVjPriAAAAEgAAAAEwRQIhALAQ5QixbYgxg6La86K4IerMFA9exsjI5sLEF7G89F/lAiAb2RbD/rRuQTNNkX/q1wmhrLS04+rbyzH0dHr2T157WQAAAGcDUlNSh2LbEGssKgvMs6gNHtQSc1UmFugAAAASAAAAATBFAiEArSNR8Ld1LmGKLrctewxTywm6AqqeaBL1TPnEYTlq1rwCIH4c7GaImIlIaTS6HbkfHsSI8oyWrRzbQPJUtPoncOo7AAAAZgNSRVYu9S7X3oxc4DpO8O++m3RQ8tftyQAAAAYAAAABMEQCIFIk3gI9pf2yeo0KlrW1tvJcTGrRZjuRPnRyqirCtsuTAiBL66FEVZTqGVZKwrnsOBUF8/zvdrkIrxA6tshoJ425igAAAGQBUkj3de++T17Obg3y97WTLfVoI7mQAAAAAAAAAAEwRAIgNVNXycmEbp0XpNoYaO3t/SCHlsNcJnJFGpdNKvadBL4CIDHaLRJbe+1Mwa4B3TLqDxE8ku0WRuIVLHMFEQEpgG4YAAAAZgNSRVjwWpOCpMPynieEUCdUKT2IuDUQnAAAABIAAAABMEQCICFkfbx6lxWy2O3Yg9jku++dC9HCobU9/x59yu3odA7lAiA2qnXRqNixCFyBjeMeCT+qOix91NmnV9sTG3HyRb0xMgAAAGgEUkZPWKHW33FPkd6/TggCpULhMGfzG4JiAAAAEgAAAAEwRQIhAPsKAKcGjyOzoBmq7LVW7C3IUP1MlKXrh34rPmOe6EOQAiASCJlg2iByMZzrKoTjj57ZAoQR+aEczsDPAxzKWdCbdwAAAGgEUkhPQxaClrsJ4kqIgFy5wzNWU2uYDT/FAAAACAAAAAEwRQIhALY6hJt5PBVrp0QNUTc1tlgslb2fkuzz5cx7wwhCyNV9AiALhkvBuATWmPIV2kzz0VkpcpfVneV6KcnCplFaaRE1RgAAAGYDUlROVLKTImAAzL/ATfkC7sVny0w1qQMAAAASAAAAATBEAiANm9A5TzOe8AtCYFJHQyNXlc9doE10FxsCCS5+bSAatgIgHYRH6Q0e3Dw6XAwxmMU0SCn/ld12svMQWu79PdqIK5AAAABoBVJNRVNIjVaClBzkVpALEtR6wGqItHx2TOEAAAASAAAAATBEAiB1W6FQvBgjzjq99qyCfDl9CZnehasJqoUn0rQ08G4aAAIgA4SGYW5Bf8LqXhAyvRuVn9ydFlDo57MJaBemJ+T0vlAAAABpBVJJTkdYf4bHguyAKsQC4DadLm1QAlb3q8UAAAASAAAAATBFAiEA9sSPeNdnN3x2Bp50SDTE5CeUr8BbO9Tuww5/XLTGE8kCIBa2yKKaCGQTc/ceExCim9vUdgAjZavt2KtJYtr21kp5AAAAaAVSRlVlbK+fVJd07O29CWbFLyUKzFSNPzblAAAAEgAAAAEwRAIgOhj8angb0nft8jm0S6JPzqhnnEfuO/C4rqy4NdNcqu0CIHlzIZl/JLwHLOiGVzfhvBQTVrNEQBdI8UiU15hrwiYFAAAAZwNSQ075cLjjbiP3/D/XUu6ob4vo2DN1pgAAABIAAAABMEUCIQDyXNKB3qSW6XIt/Nk1iZnO+AiyQ3PHyOVZwMoBe8lKnQIgMaUQDOeGr24tkxXMS0Bb4KAOsz30HNVgU9pWfk8ja34AAABoBFJJUFTdAHJ4tmf2vvUv0KTCNgSqH5YDmgAAAAgAAAABMEUCIQDKg3mViF5kcBWFLFMiaKFn7bdaKg14TukFW8VaMCCUSwIgMUXCp6vXxZa3VVjfGl0VuqJm7fTI8VFEG31Ro3qp4fMAAABmA1JWVD0bqb6fZrjuEBkRvDbT+1YurCJEAAAAEgAAAAEwRAIgMWsMvzFTCRd9t1/NC5AnRGMrRfLA3rmsZF1u1QUlATgCIFw1YyKJxSvKYJBNFvclsDFocssvIhk4qQ4ULg7tWFnjAAAAZgNSTFTM7VuCiAhr6MOOI1Z+aEw3QL5NSAAAAAoAAAABMEQCIDqqX0CaE+5YmmlGaGBAHhz25nmxXc7g/ypwwx+3G1+VAiAPz70ZzZtIl87wi6vWdt2XGCd0U2eAzyWdHPmE7/eBrgAAAGgEUk5UQh/nC+c05HPlch6lfItbAebKpSaGAAAAEgAAAAEwRQIhAMnUbfXbStI3+1yLb8NCXKlLL2+Jz3cAqbwjeXgqFrAbAiBpzgrmbGFGjR1PGYmch4fP316A6KWlsOlMi0tZQiPO2QAAAGcDWFJUfekbIEwcc3vO5vAAqqZWnPcGHLcAAAAJAAAAATBFAiEAqRKx8KzEo3tuIL4J6bOcYxYnVDTfQUqcysnK2IgSPP8CIGRi/sNJQVZI1mLDcZOJNkSZJkVxk8VLS9Wamqtj5QlJAAAAZgNST0Mby8VBZva6FJk0hwtgUGGZtsnbbQAAAAoAAAABMEQCIDRIrbu9WaSuYO10hnwpyXLqNi9deQKUD0ExdbTsoThYAiAsVo0xYXbMyR3JL9IRM97nOboTAvifxJDcfg6FvNU6MAAAAGcDUktUEGqkkpW1Jfz5Wap17D99y/U1LxwAAAASAAAAATBFAiEA1lTGBDVbovye+QsemIO37Uq2f5Aq4m7USuQuZOT6XnoCIBZCRedsnoqgvhGvbmkHoQfiqVsOS0K6qcoDGybrlQRlAAAAZwNSUEy079hcGZmdhCUTBL2pnpC5IwC9kwAAABIAAAABMEUCIQCYY/GsGw/1VsJvqzBix7j7wcBRDf7CmsrBmOBnw95A8AIgDU8Qu1H0K4vvoQRLXV8IhsxKRkCbgEAEoO4BDtjYpCIAAABoBFJPQ0ukAQYTTFv0xBQRVU5tuZuVoV7Z2AAAABIAAAABMEUCIQDNX/3l3ROPQWLF3iv7gQy2/G4OhsDOf6AMGm4yQSoX5wIgJGtodT6qCXPmaubqVK/ro/xPK1iNcTeMAYf5x42Wq88AAABnA1JPS8neS38MPZkelnFY5NS/pLUewLEUAAAAEgAAAAEwRQIhAJsFo9UmdoFxR9MQVWt7WhMZ0m7EJod71W3PRNssAdrAAiBuMeUpmg1vowg3uU+epjiL8q5FxRzgvNADth+rQc85SAAAAGcDUk9NrKyluIBWNmCOFMZLC//8LessbOwAAAASAAAAATBFAiEAzRMFqUpUy3f+K2WoOhRECjRSLn9IOxh6kLbhotjcXRMCIH3ZffqSAng+wEc+NzF+iLC8Zd3hSXK99PAU+NrqismlAAAAaQZST09CRUWjGxdn4J+ELs/UvEcf5E+DDjiRqgAAABIAAAABMEQCICiKVvQ5/x/GQCeSWDIwFZ7rS3PPZD1+/tvuhgAK21+oAiBfmAlt3FMLDZ3ouwi6Gq2EPbjE8YhyG4QbMhuWyCkOuQAAAGgEUk9PS/pQR8nHi4h3r5e9y4XbdD/XMT1KAAAAEgAAAAEwRQIhAP7AHnOIOX6B0P02VGrZ6+hJYIMw1geyL4OamJKnO/LSAiAoKioqjIfXlYgBqSBZozVNbOz5T1kCoJB4ZmeoHewHrgAAAGYDUlRIP9jzmpYu/aBJVpgcMauJ+rX7i8gAAAASAAAAATBEAiBPxDfMhAy4JhV87X5ydgvbPSOFLUQjSsdljAtKZQcDrQIgJ/gsmereaaJwuErj9OD3RMl9KT5wzcOakEDgSszw2s0AAABpBVJPVU5ESZPLlcdEO9wGFVxfVoi+nY9pmaUAAAASAAAAATBFAiEAxpgUExgVg632pd/5Pp9V6uFORrOA6mMAkEmJ9DWBK90CICfbMlGwUl9avYJynrh9bVDQSnRzVTy+IabFCVHHkMCQAAAAaARSWUxU0wouk0etSOogjuVjqc39gOlipycAAAASAAAAATBFAiEAz+y13PrdhA2zWiUvtSwd1ObZcqtZgx4N0ySY4l682TsCICEaaoAWZ4+sbaqhWEd8iF1jr2uCFSFm4AClHpJjqo5fAAAAaARSQkxY/CxNj5UALBTtCnqmUQLKyeWVO14AAAASAAAAATBFAiEAlEFXclylczEbGvaI5haXDo09Xy0P/NbQ+Efan9GBvu4CIFgNdrlNPltBKdvpJvtn+p8p6K6vN94uzUpOGNMRaNNPAAAAZwRSVUZG8njBypaQlf/d3tAgKQz4tcQkrOIAAAASAAAAATBEAiA47fVgK4+LVJjLTIUAm1DvzvB/Ilxe6Qq76H6s9e8BGwIgA3cHPtfBCW3zA96ahoG6DvLV8nTD9u7K1Ic722ywxtUAAABnBFJVTkXe4C2Uvkkp0m9ntkraes8ZFAB/EAAAABIAAAABMEQCIC7lx/b8IpHs0HfQwsp8m55juSMeZXIemqn4bXX/S32bAiBz8a+Vn+Q6Pqo+MXsyehZb6+dD0vmNHlaTx3vifFcGsgAAAGYDUkdTTDg73K5SpuHLgQx2xw1vMaJJ7JsAAAAIAAAAATBEAiACfP8z66NAKfRi3l/I4U18xkvuc15CpfuZkB1DC4iC7QIgPyWdn9i4v4NoE3+0+2EEPpYv4w/U03mQejjukVefvvkAAABpBVMtRVRIPrkdI35JHg3uhYLEAthctED7a1QAAAASAAAAATBFAiEAjnJm1KlC+iQ/hsTyKPZorbYfgoSi+FA65+FwqDWfmWsCIDJKaUqmtaAWoqCtXlKNb4+yAvay8djdusJht/Tk9kQTAAAAZwNTQUOrwSgKAYeiAgzGdUN67UABhfhttgAAABIAAAABMEUCIQD9nuEwmMoCf/uR5RoYzplHDiPr8B88kcHgJlsHtLVZyQIgIiK3t8iyNQdAh7FLv8jCJXUUv8dPOPqBQmsZux586EIAAABmA1NLQkrzKMUpIXBty3OfJXhiEEmRaa/mAAAACAAAAAEwRAIgdIVEuoY3qoHz9AEtNrW940CUOQYrcGjhPU0STM1hF1YCIF6v/hGPmD1sLmTqFIW//ORAdP9evK6YKOGCDfiySk15AAAAZwRTQUxUQVbTNC1cOFqH0mT5BlNzNZIABYEAAAAIAAAAATBEAiBm7fGSBNlvE6aFDF5La4IfnPA4tpv9W8PI+nIamRC0PgIgJDulf1FGBK2JWQlOg7P7tQ1bVeoweENcXAwlXCPiKEcAAABoBFNBTkQ4Rbra3o5t/wSYIGgNHxS9OQOl0AAAABIAAAABMEUCIQCrnesPy1UCM6GGHIOAQrRkn+SfG5zwYjm0SD80z2Ir1wIgAhXeA2XdAoGcwWU0df5fdBYaXcyK1cGSQs+NKA8zCN4AAABnA1NORPMzsqzpkqwrvYeYv1e8ZaBhhK+6AAAAAAAAAAEwRQIhAMZ3q7uau8ZMQ3DdL/kxZmKDF1RurcGgTh+zlkBgfm9VAiBbykmbgWDsqlUxUmR1m1WU6H8CR9gnl0vJhTFelUCTlAAAAGYDU0FOfFoM6SZ+0Zsi+MrmU/GY4+ja8JgAAAASAAAAATBEAiAl9OAUhZDko4FcdvsFCbrjRtNwvZWHSX3nV7MTF2K/wAIgW4bm4zUYYojN7hfCqslyVphGRRIoEoc46nxhqwGI5VMAAABmA1NQTiD3o93yRNySmZdbTaHDn41ddfBaAAAABgAAAAEwRAIgJ2ebKJQr6ox+oHzpy2BxzdvIKz3TvrzpMIovugXpWGUCIG14lWCz+31bv7bCMrMRd1WLanN24/sRIpEOjXf+2W9rAAAAZgNTVE5Zk0Z3npD8P1+Ze16nFTSYIPkVcQAAAAQAAAABMEQCIDLy92TDBObYMxU6z14uCtpddO3AUfD/avbTVaIwjU4nAiB7ZrFG5qhsM3H+sGWuZ+oCJi6CWCQNW0dkfBZ/xVcrkwAAAGYDU1ZEvetLgyUfsUZof6GdHGYPmUEe7+MAAAASAAAAATBEAiA2HGTrp9OcHD3AP+4uWYOyI2th+TS/0FIMw693ZPvubAIgaVQfFF+kAK25sTX6wckyHfVytEdB6Fj0fX9MCR1Pv9EAAABqBlNDQU5ESXj+GOQfQ24ZgaOmDRVXyKepNwRhAAAAAgAAAAEwRQIhALk3DqZz1/weAf/g1Iue2ktYw0A73Ldea2Tq2Ifgr6tRAiBUOh2l3PQiokhe0cVl/CKzC/zg2yR0QLKDtxZYZvBuOwAAAGgEU0NPVCjtT9be2yJrFrks5pl/fN/fDFGbAAAABgAAAAEwRQIhAI+VeOko+RttExD4CD5rPmfauQkTzpM6Hgh2I0G93kguAiAXcRG34eKrbplrmRh3+8gigI88EX2P1b+BhWlkzA1pyQAAAGcEU0NSTCTcyIHn3XMFRoNEUvIYctXLS1KTAAAAEgAAAAEwRAIgUXn1IIwgOX81oxUMJFxczzvfqm/w6HlorS7rAAgDQ8sCIDoMJnFzVA5TpJLt2+gRM5r6j1HoebikO7ER6RGqWo0jAAAAaAVTZWVsZbHpMjarYHP9rFitpVZIlxd9S8xDAAAAEgAAAAEwRAIgNcUWXNTGOO0EWLUmnpX1nahcFxJqnd+lbeK76tEO5CgCIGlelDKIEgLx/4/5njNyFMfovDbZlSsXutXoTsEsO99EAAAAaQVTZWVsZbHu8UcCjp9IDbxcyqMnfUF9G4XwAAAAEgAAAAEwRQIhAMJmhFCKVJOBKnTDhbA6ujdbGRUOnG2uEiRgSH3yZkspAiApq4A2StKl2hMSRcZzNJY+mGQjr+GbloimHRpU8MdKxwAAAGcEU0VMRmerEQWO8j0KGRePYaBQ08OPga4hAAAAEgAAAAEwRAIgY9dsOvWKWFF+2El8NsSl2sO5U29CZ8wSA5QXgZl9y6QCIAh/S9rltreT4MXiWydGklkXA6DEwd3uQIQAXsIjftthAAAAZwNTR1Q3QnV2Mk/h82JckQJnR3LXz3E3fQAAABIAAAABMEUCIQCPNuUAvuYP8XExZZIVjNyeO7CwGdTpsEwUyDHHqv5yowIgL+CjC2jeMemT9JULEaAfnlmY2yTrevr6SH6egtVX6dQAAABmA0tFWUzBk1by03M4uYAqqOj8WLA3MpbnAAAAEgAAAAEwRAIgdwTG7BduYctMDkdfbpr4VY5W3JsTPgQd7lfo4GrdhDoCID1tLBu2CoS/fm4Ax6a7uNFyvL6kaTw1MQy3uMElctEgAAAAZwNTTFl5KMir8fdO+fltTQpE47QgnTYHhQAAABIAAAABMEUCIQCdzzX7EMPBiGrNDWfIcMZA4ukavk4lKOQdJz/q3zi+2AIgMdNupGunXHMo7KePiNjKFBguRapbO/PWb9HXWYIBUk8AAABsCVNlblNhdG9ySUynQYVTLcF4lScZTluchm3TP06CAAAAEgAAAAEwRAIgbfjq3re0U+doXGnhGpKWQmVj3WDboRxUc0jSutdOQkkCIGBy47fm8FAvS1FuFLUaMYarAlZ2f0ckNAR/+nsUihJfAAAAaAVTRU5TRWdF+raAHjds0k8DVyucmw1O3dzPAAAACAAAAAEwRAIgS+UHBdnsmaQrHKOd4TIvHRap0HilXwEktFugzxnVOEsCIHafAm8bgMHKBrcYE/UEWrZ6W+LLzjfwyi4W0eijzuQ+AAAAZwRTRVRTBOCvCvG38AI8axKvWpTfWbDoz1kAAAASAAAAATBEAiBQZf9T/QVHbQjBNoGkJ/MC2fRd9v6QrD/jvR7un/jymQIgfraBN3GQAFS7uNBCRDysVkLQMjX8s4T/JZmjpAKxc4AAAABoBFNFTlSkTlE3KT6FWxt7x+LG+M15b/ywNwAAAAgAAAABMEUCIQCruDDls6n+uPbsMBhx8TQI83jn0AmokXfSw5fWRoSOEAIgSIYWlNUZh2Osx2AxCA8Q27cJRTGhwDSnbFvzwJ5F02cAAABnBFNFTkOhPwdDlRtPbj46oDn2guFyefUrwwAAABIAAAABMEQCICqjwRFufJNIVQ1/KRV836Bdr+qean4dew1vxWsXugQaAiBF7WBF2MkugqdMkAvgIGnxrc65Na36vxYbXSOscPHaOgAAAGYDVVBQyG0FSAliNDIhDBB68uP2Gdz79lIAAAASAAAAATBEAiAsDWPmwQe23qAvjFcWUj9CbVQh4IEV/07kgl1ssnLmJwIga7igrPfINVpdErOuW7JFtZCOGK0MgDzMgEoVbSgdyG4AAABpBVNOVFZUeGWvcc8LKItOf2VPT3hR60ait/gAAAASAAAAATBFAiEAtjyvJ6CI+dP0xntKn8TQUikwge3FkmT1ooGLfuTCLW4CIFMxXSjrVNS24ualISRFoJ65aYlXMIMstC4ruJLZUZ87AAAAZwNTUk1HbF4mp1vSAqloP/00NZwMwVvg/wAAAAYAAAABMEUCIQDCKaUGVmEzO3QqQiOEiQqMz5UVjcbn5L/OWFIX4oRXnAIgO493y1dp9SFnx3G3m/4WvPUbO1P4TW0Bb23GTK+2yXYAAABnA1NFVOBu2nQ1unSbBHOAztSRId3pMzSuAAAAAAAAAAEwRQIhAOh7/XXPDz/x2SwKXUWWioyK1vQBcx/7eBAOcBKqqBTHAiAqliafnhMCPv9Wn4OeH3V1amTmtms4XMCSpfTEojfcGAAAAGgEU0VYWZj16bfw4zlWwEQ+gb9964tbHtVFAAAAEgAAAAEwRQIhAOVINKcra+BJ7DVB/+r2i1ttwXGEBejO+4pe9UmFbO4hAiBg00pu99CMg+ekaA5RTGIjS44lQX/Tgml/104QsTtDiwAAAGcEU0dFTKHMwWb68OmYs+MyJaGgMBschhGdAAAAEgAAAAEwRAIgSuRDfXELpgFBmLCsHQglZHKl86oWn/3xBvc6/z30AhACIHADU+qpNHQq0uWer8nMboxSVCrhMriIMBRgu/Y/Klx5AAAAZwNTR1AzxiOiuq/rjRXfrzzkQJXv7IPXLAAAABIAAAABMEUCIQCRwewei/vhAhX7KBiOLv+YBFODraejWGaW0MpC58pxdQIgcNFN4ngZ9P/n1wjiSa2PXyLL3OBAprAX4TwphTAxKuYAAABmA0hBS5OnF02v0x0TQAzZ+gH05bW6oA05AAAAEgAAAAEwRAIgW6pc4YgHtEgEy2cPAP7sgJjWx5hMuCf2nnQQQoJbf3oCIFqX87HFqYmEgLVl1DCwx+E9Ros+MhUMsgL1iJpF3Sn3AAAAZQJTU7v/hi2QbjSOmUa/shMuyxV9o9S0AAAAEgAAAAEwRAIgGF4OUznlf4mUqykExmVeCaIhHIPwocimNtBAczsloAUCIDmqA9/T+ft/OSKG5hwtTqIGaJI1hPa5XHOIzMkbzwnLAAAAZwNTSFLZj3WxoyYdq57tSVbJPzN0kCepZAAAAAIAAAABMEUCIQCIFm1T09011UuCTBQ185uDP/61Yeo1R2ufiUASsJth0AIgEBe0+2fYPfTY+TfvSS3IHzg6Bm/SpvGFox5pOxpYsmsAAABmA1NIUu5f4kRAbzXZtN20iKZNUUVmML78AAAAAgAAAAEwRAIgdRGBV3Cr3cpEBWBuplTpP0oXIpJo8vJSgqwU3+ZsnUwCICvjnh2BzQGQab61VEg0EN2VzJVoO6MYgb/k5ebxEWXzAAAAZQFTlrC/k52UYAlcFSUfcf2hHkHcvdsAAAASAAAAATBFAiEA2/jNGGyff7+qRd250dTskhUL1fjhUbmIW6ltnZUCA5sCIASwadYkn+wieuigoxiSUW27Zsj+4SaBBeQkzarTlCCsAAAAZwNTSFDvJGMJk2CghfHxCwdu1y72JUl6BgAAABIAAAABMEUCIQDKBRdgbRssYGA+HthtER3fQc7yMREufbyHDeXsZdYkvwIgJhiHfflPMVf0IHBKFYBMh7xZhoh3E3gtZNT+kdD40NUAAABoBFNISVDiWwu6AdxWMDEraiGSfleAYaE/VQAAABIAAAABMEUCIQCJFDK5rFCUWFNUDxgDxn1o5UATATkmijQSz0l0oMsaMQIgJTMXvP2A1Q3f+iwHHbjkJC43z2E/k61YeqhzcdMiFggAAABnBFNISVTvLplm62G7SU5TddXfjWe324p4DQAAAAAAAAABMEQCIBk3888wajAax8efJkkcOVG/UhsEP2er6l2NaRGskcf/AiAMuGSyHq4vELjFrI752tntD7y0JsVm1P0KNKHBwn9lLwAAAGcESEFOREjBsvPvqF+6+yq5Ub9LqGCgjNu3AAAAAAAAAAEwRAIgPBfSMV5Vev09S9mDWPVJcixc21iM76kXeq/MLh/mk3sCIE4F2j2Ji1II8jqX+Ve2anl1cL9F38EG8Zikb7N+X3JEAAAAaARTSUZUihh9UoXTFry8mtr8CLUdcKDY4AAAAAAAAAAAATBFAiEAl8O41qPMfZGMzqRLWgy3Zhmo5VibEpZ1DcJzIz8MonoCIBMHItonp2QLW0BvwUN6m1OnlSi60RpozILsMd8b5GYdAAAAZwNTSUdoiKFuqXksFaTc8vbGI9BVyO3nkgAAABIAAAABMEUCIQDcJXOei4bLviGjjO1dJVxcvIZOSvN1YFQ2ui3h1R/N0AIgUo+itcJOvaPxrQwD8vW8iDQ7BE+GVtLzKEEs54wCeQEAAABnA1NHTrITWrlpWnZ43VkLGplssPN7ywcYAAAACQAAAAEwRQIhALBvbfnwjLkYcLX9QuolY8R5Lfd6WkwoFtxOy2lyvdAGAiBqIgTHiIENjCLg6LC9U4ycEUq8/EPSX+8FwS99Ghm1bgAAAGgEU0tPMUmU6BiXqSDA/qI164zt7tPG//aXAAAAEgAAAAEwRQIhAJoVrDtMjibGS/WlPsAoToJFypUz4IbiGF/e02ve44Z3AiB3Xr1HLEmxdO4rER2vX+M6TCvaNFxzD6efyc33nzzvHQAAAGgEU05UUihZAh7n8ssQFi5n8zry0idksxr/AAAABAAAAAEwRQIhAOXEm6XfTOndUkbl2HbKfwUgGCDKFZ4SJwXGt+KL7DOFAiBRdmzuFuB+VyoDDZZUl7Lz2PoMC6+OwjWZ1nYaaQ+LdgAAAGYDT1NULE6PLXRhE9BpbOibNfDYv4jgrsoAAAASAAAAATBEAiBf2ODQccDldDwkyW5v1blrDNi00GHDrBLPtgO7Y9++HAIgKLuAo92O5HNA5Y0WR4P/iRYyQSIY1RX7i/KEpNIBEYoAAABmA1NCQey49Yjq9ajOnZZLCs7OXZVOEw4vAAAAEgAAAAEwRAIge+i00JWwH8CLpEzYgppMVAcwB01F6bWwwCEaTvlour0CIGbTiN4X+/dEAe5U+TN8rx0iqmUG99U0evtnNHmBNkpPAAAAZwNTTkfP1q6L8T9C3hSGc1Hq/3qKO5+75wAAAAgAAAABMEUCIQDJuVz+QcG1UjTgigh7ePNaR8DclyuTyUs2ygizRW+WxAIgNMoKuoEPo37adK0/o2z54XtgEkRrhkxPzxgIaA7o9dQAAABoBVNOR0xTrsLofgojUmbZxa3J3rSy4ptU0AkAAAAAAAAAATBEAiAbNpr2yiCSCxFyvZTMvXt+t9LpjqLgWdETyamr5NbPlgIgCMixaPlw9i5XSAGVRo6lur1AbJp470YvQRKIUxDfyN0AAABnA0FHSY6yQxk5NxZmjXaNzsKTVq6c/+KFAAAACAAAAAEwRQIhAKTSxWrmjg0ljPUflffCuC3F1rLOx595N79+f25JL8IPAiB3bOSIbY00y8V9rAA1KVDfdxMBVhHmhyMMSqKco7GejAAAAGYDU1JOaNV8mhw19j4sg+6OSaZOnXBSjSUAAAASAAAAATBEAiBj8Cq5izArqyymr0LUSpP8Ksm4XWPwdF6+qm4IbApTDAIgePCWXSA+hAC9SgD7S0q+l0oBbauU8ebIbJMEBFpjV0oAAABoBFNJQ1SU01kY9rANbP/p/glzw30C9OhU3gAAABIAAAABMEUCIQDYfLxVyN/s+wCAsdo9oS7AVLHtNTAJlPNs9F1hnhcTrwIgbBial5fgTeo+2AFbw/CG+0sXUB6CVqckmJQ+ZRpzlxcAAABmA1NLTADIOuzHkOikRT5d07C0s2gFAaenAAAAEgAAAAEwRAIgZYq1++NCBQUfaBJZecUkupKI3nMyPtQ5phOM1arGckkCIEkaE0rY4ClkmMIFD0hIwYc3n+lyRmxxt6oQbDPa+P96AAAAaARTS0lOK9wNQplgF/ziFLIWB6UV2kGp4MUAAAAGAAAAATBFAiEA3+deJo0wM5Vm/vAmFIXvLCiRa0lcQT+sCY8+JOwNB4UCIDFliZgRpadmtpY1JNJuqyYyvahvodV5jXUYe5FJXOIWAAAAZgNTS1JMOC+OCWFayG4IzlgmbMIn59TZEwAAAAYAAAABMEQCIDpAck/mVJLcTjNXWWpdieWZVJ0VjjWKcBQXP+6exJ31AiBsdxpQJvs2XN7DS+0H4p7eeJ0EBuULgo1sL/yDwnVkjwAAAGcEU0tSUG402NhHZNQPbXs5zVaf0Be/Uxd9AAAAEgAAAAEwRAIgBhjfy5Ztaid4UJRPKkjy8cLAhv0zXYtgC6YY+AVjLa4CIH3+9sSS1M4Wx+ELT5Nx+oTkJDX3V84eNInsmv39ych4AAAAZwRTS1JQ/f6LerbPG9Hj0UU470BoYpbEIFIAAAASAAAAATBEAiBoXwd+c3PRMHEFvMxZjRrjGe6ONOZPLXeiU34ysNPpeAIgJtFnfacrIJisyJ+gDD3Cmv2Ey0B1j1II2c/7Vl/3zXcAAABnBFNLUlAySkjry7RuYZk5Me+dNfZpfNKQGwAAABIAAAABMEQCIF4zNDv5genCp9Ow2ivN3AMTKxHr3C5SqfMMIYXCc8bYAiBGYNLnKwfaLP92TcLN0MXVdCVjpwDxkuagGLSmxV4RIwAAAGYDU0tN2ZuKf6SOJczoO4GBIiCj4Dv2Tl8AAAASAAAAATBEAiA7PBa3TLj2gARvwhv+aT76q04tyFfxxZA/aVYeOG4RXAIgTlptJXqejJnHniibdU/kY81B28a94qtqi0aZ8LAq+14AAABnBFNLWU1yl4YrlnD/AVGSeZzISXJsiL8ddwAAABIAAAABMEQCIBDgC+hxb91ZVes8TGuifnMWoNom9A0aOpSZ9DhJRtcqAiB/KjVCiPogzaYuvzRF0rt1wYmCyPSoI1vq9mq7B0G6IgAAAGYDU0xQNyNs0Fs0zHnTcVryOD6W3XRD3PEAAAAAAAAAATBEAiB+tMjkFkIDTR2e9QRov/4a2Frqhuu0kJsxYXHFVRCVGAIgcYoKkIp//xt3ogAAx1GmSZGFBqi7DQttWtWeq8Wi1MYAAABoBFNBVFTfScn1maCpBJ2Xz/NNDDDkaJhziQAAABIAAAABMEUCIQD0NnWGLE/5CMoxZxBwfln5ChhAwI6RQUm49MLoMfHVqQIgaJRyphlEdqP2wgga+mCzAqcJZ2uH2IE4ZruqmoC5r9MAAABoBVNNQVJUb23rXbDEmUqCg6AdbP7rJ/w7vpwAAAAAAAAAATBEAiBEGMx/rzwKvP1nm4MJ20MhVT8J4yMrtB6c3+L8SRKB5gIgD1hm5rcE/rjB1J2Lx4hPzAhRsgrMuxyT74BnquOuXVkAAABmA1NNVC3PqsEcnuvYxsQhA/6eKmrSN68nAAAAEgAAAAEwRAIgIQXJIn7yg6tEowHoAk6+4cfp+yBqW1yrZc1hedn/94ACIE4MPTN5NPbpNe/d87rOBCDjOEGCBmeSac8d8GFwQtnqAAAAZgNTTFR6X/KV3II51cI3Tk2JQgKq8CnKtgAAAAMAAAABMEQCIC6OPAtSayPkoWthc9q/JfRXFn5GuMuagoGRLa5JmcMiAiBSfr/7nbxitoUpDj4r6b6OtOfhBvjWGNsZwnCLBZHIRwAAAGcDU01UVfk5hUMfyTBAd2h6NaG6ED3B4IEAAAASAAAAATBFAiEA+balE4Kglycx8ewdT2Gf5VYLp3PYWYTmB/FAQlrwhSkCIDyOrl5/DgnbPKHGUx4KeswQqeLOmFYbZmedyhZpBpR7AAAAZwRSTFRZvpmwlwn8dTsJvPVXqZL2YF1Zl7AAAAAIAAAAATBEAiApdisLrdiv1tH+Os7VfQmXkE2i81x7ItEiWe+OPpmIfQIgOEenZNduSO8DflFyXWDHqveQ+cU5HEGbebXJirgPrV8AAABnA1NTUGJNUgurLkrYOTX6UD+xMGFDdOhQAAAABAAAAAEwRQIhAOainSQQ+W+AUOyOmzbovBC9tT1E1Gi/IpnaK9NgaAo+AiAn8O/APxryDBAL4hT8FnKSSdqGMjfaNB/lq8foi71nbwAAAGYDU05D9BNBRq8tUR3V6ozbHErIjFfWBAQAAAASAAAAATBEAiBaHlvT3XbcNxDamzTqJ/0T7moi9+NXrYous+CDQ45FdAIgHrLSdFq8nhK07BXsV6GcUuNQsF7Iax3YgYfV/2cOidAAAABoBFNOSVBE9Yiu64xERxQ50ScLNgPGapJi8QAAABIAAAABMEUCIQCs31cgdoZmDP/Chc6/067yK7/7AAGXexOca3rCK34mjwIgF8OWrrBwYInTrvad0blfawoz6zGvp6ZvF+azBLjVP68AAABnA1NOTZg/bWDbeeqMpOuZaMav+M+gSzxjAAAAEgAAAAEwRQIhAKNtQYofg0dQyS7knyDzx9jCKzMC19LklT4yC3td/zZFAiAggf/cfrVm+qwdMModmpskbgk57lWjrgRFJyTvUf5yIwAAAGgEU05PVr3FusOdvhMrHgMOiYrjgwAX19lpAAAAEgAAAAEwRQIhAJSX4bZANM1hHjsSGkOFy7Hc0TukpwVTDx1UdQLk0/7BAiBhRnM11dODo6wU7/Hmhtc20LEoYlRbgUZNC8Rwfz6lcAAAAGgEU05CTBmKh7MRQUORPUIp+w9tS8tEqor/AAAACAAAAAEwRQIhAP4Twa9Q//3oU6CwoPTvF76dnpqxLc1QwjazDUeEeNOfAiB7cTiXBEL6yOnvOZdsvVm0e9clMpINYy+AkJ5qUIHBkgAAAGgEU29hctZZYPrLjkot/LLCISyy5EoC4qV+AAAABgAAAAEwRQIhAPCDEunF6Io9HSmAo7Y4eL9zVHbd25wPmso0OBkxhIFzAiBhcpjHqXoaM/WX6eCvk15559y3yeGOcqj4w9TBtJ3bLQAAAGcDU01UeOuNxkEHfwSfkQZZttWA6A3E0jcAAAAIAAAAATBFAiEAj2ZCDmO6rhFdD9lbOyribwkTHHWhQXGa1BDYZzSf138CIEDhRFVWyNxsQ+UGnQ3ON1yAgbs7DNufonbgh/YsrvWKAAAAZgNTQ0zXYxeHtNzIexJUz9HlzkjpaCPe6AAAAAgAAAABMEQCIGho39UyUHMFiB0YngPIPVXc0PUvA76HoA+CpUFg3xUGAiBOav5zr6SeXSfO48aAVio60nKEm+j1AAy8KqWSTZz4AgAAAGYDU09MH1Rji3c3GT/9hsGexRkHp8QXVdgAAAAGAAAAATBEAiBbUlIbH9qK9DkVnG+vW6bTOt+BabzzMVKZcrBJ3TWqMAIgMhzACC49cFhbQ9gQ5xH4bHbJ8x5CvOPpNKbVW4Xz15YAAABoBVNPTklRHGKsordgXbNgbqzae8Z6GFfduP8AAAASAAAAATBEAiBCGCnRlbfv0ukK/9LXFN1plsT0goO9F0a/Eqk4+b51FQIgHI2zcoRwtSPt46ta4UFPy6iOltvswRNP6RGs0ueiyO8AAABmA1hPUkD9ciV1l6oUxyMaexqqKfzoaPZ3AAAAEgAAAAEwRAIgO4OupblEMUO6UPCssL0JmWQPeN0rVJR2YS4++u4MYS4CIGSZlGAfTCFepT9h46WqgptTgN/Kx9PBj31aJb0WUtoZAAAAZgNWQUzoj4MT5hqXzsGHHuN/u+Kovz7R5AAAABIAAAABMEQCID+Ez7KPkp2XLmz30tuIjXe1gy7UHAaI9v4it3V/65peAiBtmXTXosj6kyaZPL2ROCbpSXE5MBAFxgAiqpxoqOnqlgAAAGYDU1BYBaqqgpr6QH2DMVze0dResWAlkQwAAAASAAAAATBEAiBosoY2kG4pALbboMk69BwIWTvnbGeLnCU+UiObg2PhXgIgS5uLFu794ZL0FmxO0+y37CqevnP3AjL1FZADrYqUX84AAABmA1NQQ4BpCAqSKDRGDDoJL7LBUQIk3AZrAAAAEgAAAAEwRAIgVTptptSxy7bGiznUY+OOo+FEaw6Io7a0dBtt1Fq66qYCIBcuTIXI3tyMi/ZkKLPeXZxW85/5cj33OXGMB9wK/uBMAAAAaQVTUEFOS0LWYi3s45S1SZn71z0QgSOAb2oYAAAAEgAAAAEwRQIhAL6zsqZVAtFOnCR8As10lNCind7V44naHTV/VZEROVkDAiBPFtHNeVwSET67gAOsWm7haD7R7f5tpNLDFa1HoukGeQAAAGkFU1BBUkNYv331fZ2nETxMy0nYRj1JCMc1ywAAABIAAAABMEUCIQDcMPt6WO74eDq+bhkRz5q3AiXUPs2PlzOQGyFvDw3PsQIgVRsOGNMddYyefq+NIGlA5dFGd/XGIl8BUpE9Rh0dRJYAAABmA1NSSwSIQBw/U1GT+o3wKdn/5hWgbnTmAAAAEgAAAAEwRAIgcS/3wJsF8uzfuO3WeOvWgLcRraQb+Y9w14vooc/VXqACIEu9b0rGW9cQ0kDh5ARXNms8DyPMl4InwNxKDibD7qOHAAAAagZTUEFSVEEkrvO/GkdWFQD5Qw107UCXxH9R8gAAAAQAAAABMEUCIQDT0oAYtsqdMGZ9mDdkXG3fUqHO1hhhMEs0c1Zwjs2FggIgZv+jZYVB3ggzf/tFk0jrDvHO97OzZ7ZCSg9dJv32cBcAAABnBENUS04I/34r48I6s5OLbSdRk9aknM73PgAAABIAAAABMEQCIBW2dUW84Wre6lZ/OH9WHdQX8apMKeWb6nTDpuMflsjpAiBr3BQqY3EnqF0EsPa4agFeVyy2JB45KtdM5ACZFnQz/gAAAGgEU1hEVBKzBvqY9Mu41EV/3/OgoKVvB8zfAAAAEgAAAAEwRQIhAJNtKSH8AL+xkmIrsCVUyZ+U6b3ZVnrGKxYmZ6l2AZBDAiA3WwbZEMuY0zvQI1SGcGQNyU9QCJZkT9JZOutKfDjb+QAAAGgEU1hVVCyCxz1bNKoBWYlGKylIzWFqN2QfAAAAEgAAAAEwRQIhAL48xZ+fOMBzekJROfeHz7xO5v5G8zVoO2M9LTsI2BdfAiB/ClSccl3G01FGTPQM112U2Sokkb20wVxzygUOStp/WwAAAGYDU01TOQE/lhw3jwLCuCpuHTHpgSeG/Z0AAAADAAAAATBEAiBmXbI/IUJtrg3qGhP+OWrVkhiHHwUv/vTAcwIPi6kjmAIgGdHb4NNJxmRKlSpwbK1dure1TCvCAT7s+4eCiQpl09EAAABnBFNQTkTd1GC72feYR+oIaBVj6KlpaGchDAAAABIAAAABMEQCIELeLnD8dnSC2/wRf7VCmnNTcxuTt2B2rVjOXgePhsroAiAsU6TFg8BQftnIhDOqgMhufISDnbiFn9g8MaSwMw/SYAAAAGkFU1BIVFg4M92grraUe5jORU2JNmy6jMVVKAAAABIAAAABMEUCIQCm2kAEuvuT1GHmwt55h5sbG4mrLM8Uc8FpDcx3sVkxvAIgCCi7Yra5hfmSHuCx5a/8ELMAZUiqozqFaQca9LgJh7MAAABpBVNQSUNFAyTdGV0M1T+fB77mpI7nogutc48AAAAIAAAAATBFAiEAri7CzriXSBUtMJi8+6diec0APURDnJ2t+r3mHQegqFsCIGELqBo1elm9vc41ffcDm0qu9QclMBM9ELjjY5cuSto7AAAAZwNTUEQd6pea528mBxhw+CQIjaeJeeuRyAAAABIAAAABMEUCIQC3kmpmGNP7bWtffL0ldm1ZN1BnRM8Yhm8tirizjMyQtwIgF9uy/AGBGOb/GXioBxxKPTzHA2Sy+mNdaUHvqO2ty+gAAABmA1NQRoUIk4nBS9nHf8K48MPR3DNjvwbvAAAAEgAAAAEwRAIgaEhFzR790gltoZFX0+YPGniN1cTvyQb9aiQugEBys2gCIG3YoMbAa8Cv7usYwPVVGTlNAJW1+iYlfqsmTXGpMfbSAAAAZgNTVEIJvKbrqwXuKulFvk7aUTk9lL97mQAAAAQAAAABMEQCIB0a1/nL1KGX1qAsE82Pqd1equH/HakX7584fpAJc5iGAiACl24A6NhET6BaD/E5L9+M1bQ5qm2syG18/2oalW/uvAAAAGcEVVNEU6S9sR3Aor7IjSSjqh5rsXIBES6+AAAABgAAAAEwRAIgY7eGy/cp7iG6cF53RmkKQTMzKvWm9k5tYeCLjy3Zxe4CIEbUY4epwFJX3v6rVgnsuf/HFCGWhg6XPFpeDXOL5KgFAAAAaQVTVEFDUyhnCPBpIlkFGUZzdV8SNZ5q/2/hAAAAEgAAAAEwRQIhAKXMgT6xZencZJ9geJKvCxVw3bBlR2FZmH439rrYEC5CAiAPy8fF9UtE/Yz2hIU0Nc+/IRwxoN/TgmQWMMwu0RdX5QAAAGgFU1RBS0UK4FUJfG0VmHlSHDhPHSEj0fGV5gAAABIAAAABMEQCIBzNbwWM3kYBC3kmowmsQyQfz12DuJP6Oqo0SbR56AzNAiBWyGCtC3lgjf6OG8XKTjAIfMnZ9q+YxTGycSrcEGRWcgAAAGgEUE9PTHebe3E8huPmd09QQNnMwtQ603X4AAAACAAAAAEwRQIhAPw7dIUtmEVY4mnqVfd3GAyEKGZGQgsju3duCGFUu6XOAiBCKXyfRI7fVbI/2RXALfHv+mafa+VlodTenGwzFGWD4wAAAGsHc3RrQUFWRU2ielRcDFt1imuhAOOgSQAd6HD1AAAAEgAAAAEwRQIhAMDIS2DzXuhNMidikzFfyhoF7x1pPIuJ6dB2JzniXcdAAiBqZ7HZUazWhMF7rQL1iM1B4QRc2IcVkvyFGpWmmaczrgAAAGYDU1RSuuI1gj1yVdnUhjXO1HNSJyRM1YMAAAASAAAAATBEAiBf6QlkBGPJ3QAvExe/gQ5HZ3eDBY7AH/lZQOXcDr2vAgIgZQw5Gx6sLiscMtu4VgsaFKNCML2YGGpWIQkRA+BocnIAAABoBFNUQVL3CmQr04f5Q4D/uQRRwsgdTrgsvAAAABIAAAABMEUCIQD5Pb+T0tYiiH9lVdWP4o7FHyUmVen/lb1cQzEV5OiOsQIgIpenp9/jkvbN6/yOMAHHqWwJ6s6pKCVG2u4GoKvWSPYAAABoBVNUQVJLHtybpynvb7AX75xoexo31ItqFmwAAAASAAAAATBEAiAxSIbvEsdfFADtq5WvkusQ4Tz4aeQrU6uMp0tN2QWyjQIgYC7xYqLkgk+L31Og0xlfQa2QWqrTevCBZxaUAd37S14AAABoBFNUQUOaAFyaib1ypL0nch56CaPBHSsDxAAAABIAAAABMEUCIQD/tHChYINZzuwwkjhSYC19nqeQFWwuxtuApsgvSB2I+QIgAa6pDljXP92g3zwlAozyd4+4Ju/qp5PyE/YWNWPCsRAAAABnA1NUUOzVcLv3R2G5YPoEzBD+LE6G/9o2AAAACAAAAAEwRQIhAIc8S9PYSGbM9VWPgISkiiNLep7LRZ6HTelPxnzmRi/nAiBBEeHa8mQ/wlCdhPYzKSPhR2kCCBrTi/gMqu1E5qU6AAAAAGoGU1RBU0lBY3TqkWk/Hsy093BaHLrZlMC4+HQAAAASAAAAATBFAiEA32WvzMITOCqM4MuJJq6TapxGrEMGODvh5J57B7wyTtACIAMhqD2zFlfKDRa7QisgH4CX2lxpH+Ju8CLs+2IXZ5a0AAAAZwRFVVJT2yXyEasFscl9WVUW9FeUUoqAetgAAAACAAAAATBEAiAbUpLy4sjPh1Xu59d9kCQatcbuxqQfFAHJOIyLbHCgMAIgS/YOjNwBBdkkXLWTjkBBsbv78cJ8CzxC/G9o/VyMoHsAAABnA1NOVHRNcP2+K6TPlRMWJmFKF2PfgFueAAAAEgAAAAEwRQIhAJS8CuTwcFHbMiQVs3vxKNz12xFSeoADkyVB9ncqZ7T6AiB9NYanIrnsMP5YR7jHq0v7d199MgppAI094K8FiAhX4QAAAGYDU0dU0kiw1I5EqvnEmuoDEr5+E6bcFGgAAAABAAAAATBEAiBbArR0WGWkVol8DOgQoTshzo//cv7CuUZK/ygPCRbSdwIgA1996Ft+vAey+oO5kgdS1OzIwo1GnjdIsSN3Xxcy8XkAAABmA1NUS65zs40cmosnQSfsMBYKSSfE1xgkAAAAEgAAAAEwRAIgaaTMMhWMlo1MZMc2Jtzc/Xa4as7ZPDpE+a2KtmsSHgMCIBgRFw4W5HxmaOQ8kgJ58y8HTfsg0pTd8vGIJeuSn0b8AAAAagYkU1RPUkUsD0HrB6BjW6w0vX0R0MpgWCeWAQAAAAgAAAABMEUCIQD9OysfT/vZAWkOboT2t2Z2w46qDW6vQwkvQuEQgJ4yTgIgSEosg9J/jq3w1uavi27VV3z9JecEuZzw1b9HheVPf8oAAABpBVNUT1JIAJyA7/T12PyiuWHuYHsAucZO+fIAAAAEAAAAATBFAiEApNBe0DYcOU0eN4DFfCINxOhaupsTYfp+8cnd2hTVL7UCIAf3+ql0/qbECcsLu4II9yL3hrE1WWy0i3KqLBwOc/HwAAAAZgNTVFFcOiKFENJGt4o3ZcICIcvzCCtEpAAAABIAAAABMEQCIBgAO5j6PJNgkg4bqc3T4u/LEtn9F/UmDfIiIYiiEk4aAiAOM6KMafiwONrxuzQcCifReLl51R/Y+kplOVeCxUuMngAAAGgFU1RPUkq2TvUciIlyyQjPrPWbR8GvvAq4rAAAAAgAAAABMEQCIBSAAUZ+RtX3QSvqAqRH4BYJX5vBHWKcSFZhovHHxQleAiBNWaDlqcMh/IV3DGt2fdIq9pEbTNbsbL0cesBcFxzUcgAAAGkFU1RPUk3QpLiUbLUvBmEnO/vG/Q4MdfxkMwAAABIAAAABMEUCIQC+tRzta4HctvIpIz0M0jl1ctYf1FjjhY8KVT0roTBDMAIgSUyOJSuguEQkK5IaxCO3h4rOTfOYGoMIgxaLRWYQEGwAAABnBFNUTVi+k3XGpCDS7rJYli77lVUaW3IoAwAAABIAAAABMEQCIHQBaOncDDN4fbbhzdGAkgd3E9QMzCjy0sCZbXWUe6bgAiBsa8oxVkq6GDFn8am2lmnpCH7bNer3OxGTCea/ra2u2wAAAGYDU1RYAGvqQ7qj96b3ZfFPEKGhsIM070UAAAASAAAAATBEAiAisc9GmHI2V0HD9hVCNvY5s2X079D8dZOvqVroN44GFgIgc+wIskNmTFcqycsdKenuV1Rm8f3hw1mylPX6xkyViZsAAABnBFNUUFTefYUVfZcU6t9ZUEXMEspKXz4q2wAAABIAAAABMEQCIDRYr6eamEMT1kf58SsEwBrYCnz/r2YvHh2Ccu3Zfu9SAiAfA/Y0FBVR7Gh66wIhRu48uUs07ri4+UFhvH7B2o3jdgAAAGcEU1RSQ0ZJJHN1Xo35YPgDSHf2FzLXGM6WAAAACAAAAAEwRAIgdwt+rbHlcqj1LpW4qw1skS/+/9Ae5ZBcH3rUNRpCRIQCIHIe4XJG9p0StM0yv6hPkMKAqVJhBgVdgz4bVtIC6m1nAAAAZwNTU0huIFDL+z7YpNObZMyfR+cRoDpaiQAAABIAAAABMEUCIQCZoyJ5SGzCrNmO5Uze0dRt0KlG6HUz8TEJ/s5UA7riGAIgMV4rr9fZus1MQISdRJuwKPIDWPfaCYYPH/mLTdJHhsgAAABmA1NUQ2Ka7lXtSVgcM6sn+UA/eZKiif/VAAAAEgAAAAEwRAIgf6WtyFj6hlw9myCiFxV6Dw5ucxJpfd5BzzEO3Ebbt8wCIGbHgrWow/g9TWXQZ7v9+4UAIwqrTT1IDTb6Yex7vENpAAAAZgNTVFUDcaguSp0KQxLz7irJxpWFEokTcgAAABIAAAABMEQCIBjMdzltCigyjYNPQdD7egG6VKITAed84SdSj1Iwz34ZAiBQyQrxjSHHQqRrz+6dEq9gOzUvpHiO74AebvWG3vEpiwAAAGYDU1VCEkgOJOtb7BqdQ2nKtqgMrTwKN3oAAAACAAAAATBEAiAaCvGY8g1JFdKKF9f2vAhzGEtOivLtrNbmhCPJiPe69wIgVgCh6OYHOOeH8f1uzclciFb7bfNQlenvT4DBMr5jxcoAAABmA1NVQo11lZ8eYewlcapyeYI3EB8ITeY6AAAAEgAAAAEwRAIgNv5YGHI/a/h1nmqt422/VKGdvMmjXb1HAMPCg4n3/7YCIFc/sj6BWdTUVi4o1i3ioNPI+KSsBB4b7bBm+C/xO508AAAAZwNTWEwiLv6D2MxI5CJBnWXPgtQQonZJmwAAAAQAAAABMEUCIQDUTakV0Zz6AeAnyV9VeuyRdP92KxFKfJqVt5+oYkusdQIgWdfpuh0y4bsNlgI/HlQ0GW6idVFTnKS94gVIZMNH+1MAAABmA1NHUstaBb7zJXYT6YTBfbzwOZUrbYg/AAAACAAAAAEwRAIgI+o3fGTP7eeY+PXHExHpG35S3Xpyj0nqEOelGdCTbkUCIDISo0Tgs+tm9WAw6rK1R4hTLhKeSSAk2mr4NLQdhhHhAAAAZwRTVU5Daw17g1e7hR3p8ZUxmcOce8RnV5YAAAASAAAAATBEAiA3i9TpdZKo+Lo258efhdNdl5/7U3q10J2i5PLIkLJ9XAIgbrCKL5kUZgf8g0DFF0zucZies5LuCIj63TIere6f6EgAAABnA1NLRRPbdLPPUS9lxLkWg5QLTzlV4FCFAAAACAAAAAEwRQIhAIR1pGIC4Yhu7PbBW6eMw9Ow1w3Oc1sh21QPCqj2vBodAiBj0pZHhUkbjm6KBQIqLTeKNrDvcdNarqFAZcyjRRh5nwAAAGcDU1VS4SDB7L/f6n8Kjw7jAGNJHowm/t8AAAAIAAAAATBFAiEApJyB27MfpQP6XlQEJsXQvB6QH4VRb/pje0XdsF8taOwCIFguNGIgbJhnkpXBDZWps8hFvsPuFe5sjrzZfvXM1LYgAAAAaAVTVVNISWs1lQaHeN1ZLjmhIvT1pc8JyQ/iAAAAEgAAAAEwRAIgTVDQQaTf6PVQmhotWxlWtfjxROSScxHMd4hP8FKD5ZkCICEaDo11/jsNiACDPsHdWBv9W0i8Fjpi5MQNAZo5DC8EAAAAZgNTV001BfSUw/D+0LWU4B+kHdOWdkXKOQAAABIAAAABMEQCIE7uIM8JQqMlLE79puD/tVsHWyeo/uvmSTv7ALzIzYrpAiBIRLGzxb9R6/ifiROTqj1ZlcvSZcQvpBxJa338vuGpZQAAAGcDU1dUuef4Vo4I1WWfXSnEmXFz2EzfJgcAAAASAAAAATBFAiEAy4TqvKw+PIXprsdxDYh8gOatS3mh4Ng8+YdolMdmHFECIHNpDtJctU/MbaodWK2rxT/W6zHDXiodKst82qoEgUVrAAAAZwNTV02eiGE0GM8D3KVNaiz2rZNKeMehegAAABIAAAABMEUCIQDZbtTGJAXXOp60iMsDw89Ux+AW+ic9TaQpGr5oWs8ijAIgAJV5A2MuNiehO/eBaW7UpqQAWkd+9gU5pYuIMumdnwAAAABnBFNXUla4uqDkKHiQpfeYY6tit/F1zsvUMwAAABIAAAABMEQCIDAEopWrwJ7ANpsUt+tfRhSondrpCxxI2dZEpBeYPYLFAiBnuSOxrtzQodVdfEph7EmsiO4UwL/kGmdXIhMdmeSyCQAAAGgFU1dGVEMLshfkD4pct5rfBOGqtg5avQ38HgAAAAgAAAABMEQCIENDsHOBk7Z74O6f7owARbDApaAqXcXRczW6I68jMKb/AiBDE/o7fOTw2n+aj6adKGijIjG8zD0jlYWUuiKXl5IXbwAAAGcDU1hQjOkTfTkyatDNZJH7XMDLoOCJtqkAAAASAAAAATBFAiEAir8wBaioxjePy1IHhqLxURoZ64SzdUOrx87y83imYHsCIASFessF8n8QICHbwg8K3WgbuObpdqLTAPdo8n7UtJEPAAAAZgNTWU4QsSP93eADJDGZqtA1IgZdwFgnoAAAABIAAAABMEQCIFxAxAUKUX/nMHIVPrge92EptcYt8S66o866alsYX8WFAiBHiR8VEhPEG/2I19rYCKJ0+PLIst91aGFNC/0cefgsbQAAAGYDTUZHZxDGNDKi3gKVT8D4UdsHFGpsAxIAAAASAAAAATBEAiBXB7QKMlZdTqDCfi9aqjtqoUkxzVSAVCd6UYwCTwtVmAIgN2XMO3FQjiPCh6YD9NAUGsrl1wQyi3eSZViZlgwaksoAAABoBHNVU0RXqx7CjRKXBwUt9N9BjVii1G1fUQAAABIAAAABMEUCIQCijbfASCD1lG22T2u6Gqw3w8nVtC+t6uxOFGeAE0oeQQIgTDFNUxMJVI1IzZMCK0ICGLj7bNxpE+1iuMs4CjOhJXEAAABnA1NOWMARpz7oV2+0b14cV1HKO5/grypvAAAAEgAAAAEwRQIhAL2eUTmqF0tIVJ+I8t5776V8PMu2oN3GNg4JAjhEdquCAiAiPBaEbg2j8DeRhGbScUL05etDxEHqMWeXQwHkiBw2AwAAAGcEVEtMTgZ12qlHJaUosFo6iGNcA+qWS/p+AAAAEgAAAAEwRAIgK0NeCEqdL/cDuQqOzFnMt00MceT1yJ6nnud8C+VM8JoCIB9mGSOGbaSU7nEbX0vHiWI9MFceNbTOvVxSgqBonRZ/AAAAZwNUQU4sNiBKBxKipQ5Upi98TwGGfnjLUwAAABIAAAABMEUCIQC5AKHuvjaj5pvjjNw8ZZblDf88UMB9ezvqVjfqSLavrAIgdpvK/vq12jtUoR5q38UGYvUFJ0C4SlvnkrRi2fWCPgsAAABpBVRBTEFPHUzMMdq26iD0YdMpoFYsHFhBJRUAAAASAAAAATBFAiEAneopBbkxZ/92ztHhzqXAhumZigrsAitVrJNsX6mGHtMCICGN14cLz08PxUKE/WpKMpz4MyaZ37ZLUrdwMSCX/6zIAAAAZgNUQ0H6DvXgNMrhrnUtWb24rc3jfterlwAAABIAAAABMEQCIEHnwtT4jHnNlnHguslyFlT4bzElaWGEtAhsZjl/xcrCAiBGvSoOs5Ik+YeZFNHSFSu6HkCftKT5bNkGq+RgugED1gAAAGYDVEdUrD2lh+rCKcmJbZGavCNcpP1/csEAAAABAAAAATBEAiAYRaRjc+7Hysgg8f/oIqO93QSO7kumy2FALYNnoGmwNQIgJI0iB8dehmt7Gr073TWFoFGSr/mdbz368/je0LHC23oAAABnA1RUVZzaimDdWvoVbJW9l0Qo2RoIEuBUAAAAEgAAAAEwRQIhALR6VS9wm/eTI7xVn9PaJckaRxGQ5dcjLKyxlI3fa8YMAiAdRvUcXn2+EHu+mrI0+7YxtgUetUHv6d+IcwSrxNup1gAAAGcEVEJDMvrM1fyDw+TDwawe810VrfBrzyCcAAAACAAAAAEwRAIgePvlGcu4Vzlzcr3PpafHgRKqR6DlpgglHDLz4MA8CVYCICh3bVmqvSnje6q91coMhHGIFr3R6CFOUm/f/jb7GkyRAAAAZgNUQlSv5gURNBo3SI3iW+81GVJWLjH8wQAAAAgAAAABMEQCIHR/zwiPIi/ehvvwS1mVXL+htbgNp7Ywj9vYTdwpNA+/AiAuqchhW1AuvY0MVh/T8ajiPppYYDCo1mrBc9ynGPdNTAAAAGcEVEJUQ42uut6SLfc1w4yAx+vXCK9QgV+qAAAAEgAAAAEwRAIgetbGp8MPA2mmfyqMNIBBV/OhUzsEx4cneYOQCcJbuusCIDQC0XxXpzdyCs7/t2DzlHNxohcfNO/WAQ4QEg3EsMWWAAAAaQVUQ0FTSHBRYg0RBCxDNQaaqk8QzTtCkMaBAAAACAAAAAEwRQIhAIvXUUjQaHs/sgVSPe99o3gWe+tZdtca5B/iwDqkZMuTAiAd+LJACZS3S/3SzTUPGTPDkw5gwRpqcUWOiTR57UfChgAAAGcEVE9ORSq2u4QIyjGZuPpsktW0VfggrwPEAAAAEgAAAAEwRAIgOR//iPqMNTkf7qW1PiGMcrF6v6ZchMZAUiZi8/MB8aMCIGAcI0QrjtQD8MMCScAtcNuszOkMrtnsq1xlY9x68KT6AAAAZgNURkTl8WbA2IcraHkAYTF7tsygRYLJEgAAABIAAAABMEQCIF8LIT6W9L5UL90pEYDOtJkkAP0MZTD2zboXncmV1gYRAiBaq1Zsdpnjpprx5JTWSB5ruP5p0ImwWE/pXWiNrRPnWgAAAGgEVEVBS33X9W1pfMDytSvVXAV/N48f5qtLAAAAEgAAAAEwRQIhANClPBg3Z4pu749r2hZ/+VuuLFyK4W/8OrKGt43i/MSVAiBvOnlnly9raVy50butNGUbt6z3NuXMepK4H12Jk8vPyAAAAGcEVEVBTRx5qzLGasqh6egZUriqpYG0PlTnAAAABAAAAAEwRAIgBksT4osWMvesXC0vTH6LTZeauCBAmB5KmIovw1VvgqYCICbnQ+wPnvE8qQ1I97dihAB1iLm+XDF9+4u3yS83+VtfAAAAZwNURUxGe8zZ0p8iO86AQ7hOjIsoKCd5DwAAAAIAAAABMEUCIQDr5mZ+4NcG0f3oqB6aDi4uozToy1+/19EzKtdGvPDb1QIgaoCUYjQUB3KDuJSYtGdIjKQG8sGEhsUPCTO/EUAcmpMAAABnA1RFTIXgdjYcyBOpCP9nL5utFUFHRAKyAAAAAgAAAAEwRQIhAN2AkOs39DI4Ery0V0/r7UuSpInP37L1Uic9ko8bpYQmAiBjN8Oxdtl46ykf3JzNUo6QEYLNnbUPy52liMhSv8lUYwAAAGcDVExYs2FlUKvIr3nHpZAt7576O8mpUgAAAAAIAAAAATBFAiEAsPpnTYsZS24pHv3VV1gv+XySjNm+2vy9FXgKa09K4VUCIBzlYq/1w81m/d2CG4Ph/O/8rC0Db5sLFKsmkteU0Y4GAAAAZwNUUkILpFqLXVV1k1uBWKiMYx6fnJWi5QAAABIAAAABMEUCIQCvoj1LTJR/2HcdAdxdxcVrZtDhLDRSf1JA2M2tFCOM4AIgZDz5CcMnYZ9b5AJuVAvSON+iCCP8/LiqN1whk00KufoAAABoBVRFTUNPL8JGqmbw2luxNo9ohUjsu+m97l0AAAASAAAAATBEAiBJIA6E8V1PW+BNMHzVeIYY71rAivxg9l+PNdQF7QESfQIgM0TJ3dTRJls7rurfZQkidWhWIv4ReLE6e+YcFTP7v5IAAABmA1RUQaq2BoF4CYQeixFovod57q9nRO9kAAAAEgAAAAEwRAIgfKwihxPY+aLs422IhqZGnoEbt3ZpXjOF1jQ2i6oDqR4CIDVVaX7kZTKbsDjhiXVrB1KwNkASuGWhWDYpJIefRRQuAAAAZgNQQVm5cEhijba2YdTCqoM+ldvhqQWygAAAABIAAAABMEQCIGCxx2Rjxc/vKS0PLwf1T4mbxE0IEZU7dvhMqF4OtoPcAiAdyRVIG0cZz4mdqafzqBiJlFT23mF5WDxhUnhx201LawAAAGcEVEVOWFFboKLihq8QEVKE8VHPOYaIppFwAAAAEgAAAAEwRAIgQhYLILFjcuiSojJZkjR3oaEAZM7ymdtStut0kzESg6ECIFqsjc76i8QK+T0rga7uP3iUqeDLDzSrx8XMv83qeQ8aAAAAZwRUQ05YKNf0MtJLpgINHL1PKL7cWoLyQyAAAAASAAAAATBEAiAW65IgLJst7CYcYS5UTsIQNvQbu1fJ18CjliHp7O3K0AIgMzrV7h+F+pbhJj5f5o0wVaj1dg+jJX1J7aQXCuunxa4AAABnA1RSQUTSrGXBORaLAvGyeBtgYSXKOeruAAAAAAAAAAEwRQIhALDXKYgq1yUuHAuKC1810+rbNuOJFeT9NWEfGXXuYo6LAiB9jRTk1BgKLfcaRDP6UY3ceDe/WYJnlO483YdJXPzyVwAAAGcDVFNXa4eZm+hzWAZbveQeig/gt7HNJRQAAAASAAAAATBFAiEAurlbBSa8pR9wh0fkPZXswu40nRZIKchyl/x42lT8yLkCIFJRLdEYbyW513y5dAjDgoj1/SbhEjz9j57h5O78Kn4CAAAAaQVUR0FNRfjgbk5KgCh/3KWwLczsqp0JVIQPAAAAEgAAAAEwRQIhAOfru1NqNMEvgd+OIdmIZSvi6ViCjO3XAUQDa8wbOz0tAiAop4gwc8Oi3SR/ZK/beX+HjZatHNFcuBp7Vhw3BwEvlwAAAGcEVGhhcpbDDVSZ726papwiG8GLw50pyX8nAAAAEgAAAAEwRAIgJrcBpgZFlTJJsNpBo21F3SsLLcTppVGtPni+JKv3Qs8CIF+MvTUBEekvDYNsobP6xI6LHjD9iYvamF/Sw44LlNUhAAAAZwRUTVRHEAhjmd2MHj3nNnJK9SWHogRMn6IAAAASAAAAATBEAiBRSid6FdDCdLqmxKeF/v9pbmY2pgQ4eCwoSEpEk+xLIAIgUbNe42OQyJu7G4P9XVju63SM9Kvqv6gvqfXx36Eb6a0AAABoBFRSQ05Wb9eZmx/DmIAivThQekjwvPIsdwAAABIAAAABMEUCIQCrNUjh1BwbC9jKkfteQcA3dxjOP7okaV1A6o6cSOyllAIgFTp0n0Vo/Sv3u3idTbnnv/0q7Htne7Ia1gm/iUdH+3EAAABmA1RSQ8s/kCv5diY5G/i6hyZLvD3BNGm+AAAAEgAAAAEwRAIgM0mFYiN5soZ/QL8rj14oPSj/gMl4yYYX2lq5zpTqvlUCIGMz7z0D0+1AkOyFDL4Qy0lxVvrNpthKj3E790v1DhnmAAAAZgNUVFQklKaMFIQ3b++IC0wk2R8EnSmwKgAAABIAAAABMEQCIFbEdg8NkiQDiipYr8q5UnPnLIcYuylV+QcKP8JQZ1blAiBx+ragFudtaQhUEKU5oSCJPTSKt9KUZphBSbp2SICAMAAAAGcDVFdOLvGriiYYfFi7iq6xGy/G0lxcBxYAAAASAAAAATBFAiEAxFpznu1G8KQsMmu6GtacXT9+ANlIf3i7P/4p2cgTqMkCIAjbD+LwsJoLf2SsqyIQowAj++vquswCA0Abz25ac1/UAAAAaQVUSEVUQTiD9eGB/Mr4QQ+mHhK1m62WP7ZFAAAAEgAAAAEwRQIhAL+gie5/cruAHpMFVPrwpV044Yx+ynK42PaP2e2leNEcAiAri2LkJGsaJ4haSsQDxnpZjOEU7hkjnYB4RGN9BHsAnwAAAGcDVElDckMKYSrcAHxQ47aUbbsbsP0xAdEAAAAIAAAAATBFAiEAj2W6+50RP11GXiEtrjy6+YeMmkJ24tlJzI8fltfTha8CIA1P6A9t2q6TrYU5GY/d7oACzRj9h7uIcmeobFHXc2XPAAAAZwRSVU5FMVW6hdX5ay0DCklmryBiMORoScsAAAASAAAAATBEAiAonksOXK87Fs+WZr02V5+/wHopzNRU6JNCdNUN4KBKgQIgSg4ZBimqDmwpOA/NNkXTJ6/+V4kDo1EFYE0nnJkxqy4AAABnA1RDSNRWDzC/j7HzJUblNiVuN417dZl5AAAAAAAAAAEwRQIhAIOzIGLM6qdhBH4WEYQ7TW/U549gFreyHiDQiPS0MpEwAiBWQlxHvOp8kkVqDgByQbzkLWMyPtFXJZM/lp5N1NlWIQAAAGYDVENImXKg8kGURH5zp+i2zSalLgLd+tUAAAAAAAAAATBEAiApnOpHHRtfJc1EZdpOoM+dds0fkQfyaJy3grCQLdnMogIgFjGZ9cwT24S78Q+czhxd3lu0zXBx29QgkUc1M/4N0WIAAABmA1RIUhyzIJ1FsqYLf7yhzNv4f2dCN6SqAAAABAAAAAEwRAIgff3duT0lvMrS8srL00j93pQbQO2pQCGJEl2flQyVSuECIGOIwS+S8f/l53Ob+huyvPjPz2/waR4tTqISWZ++WPvKAAAAaARUSFJUTycFPzLtqK+ElWQ3vADl/6cAMocAAAASAAAAATBFAiEAo1k5eyIqfDzP+KAbrlfRVr8/vUb7+/YrKpFTNO9VacYCIAQPNkfX+wIhTsCnLjobg4/RTnojVQQ6OPyeWSo07mm6AAAAaARUSFVH/nuRWguqDnn4XFVTJmUT98HAPtAAAAASAAAAATBFAiEA10cQlZOV/TYew1S6OrL1QAvKkU9Nz58f2AcvztcmGi0CIAcCUW3W0qdQjla6G2Qw6lFNxG9lYWoDanu0472tlnrXAAAAZgNUTlQI9akjWwgXO3Vp+DZF0sf7VejM2AAAAAgAAAABMEQCIBZkY/zzA7sc0EcUl8JouH9Rhnz8spiR1/9Bl6R5ZzlmAiBkBeA2BuXGAKGWbro9Edk6gX0Y/apqfyztumjC7FTAuAAAAGcDVElFmZln4uyKdLfI6dsZ4DnZILMdOdAAAAASAAAAATBFAiEA1OwXuLwLt6De+0X+7R9Qa3NN+IDqKCl2q36Zl9xG/yMCIHece0k7WzlQvYgMBDKCAuikNkyf3X8R3qDTECd0KTasAAAAZgNUSUfu4tAOt9643WkkGH9ao0lrfQbmKgAAABIAAAABMEQCICmGZ2HRJqSVfCIvsrGxTzKy0lnWM0HJCLFBaRKMArGPAiBrfssYrnDAttIqPok74pyWRleu+IsLUut/xqqf8ho0bwAAAGcDUVRRLDwfBRh9unpfLdR9ylcoHE1PGD8AAAASAAAAATBFAiEA8Bdp+Sfr1IwqA8UoXkkdW/y4foUgDDXunu+95gYL09cCIAalQWYRf7i02pTGwOgVEZjg3mfpSh9HyXty8QHwK8L7AAAAZwNUSU+AvFUSVhx/haOpUIx995AbNw+h3wAAABIAAAABMEUCIQDR5dSj+pGkWje4E7VjHeC4gNht8yboYOWhhWg4bQMlbwIgPlDMrmnHXmodnTz5TxL/eIk9HuzFoeG6rvFAKWfD87IAAABnBFRJT3jZR7DOqyqIhYZrmgSgaumd6FKj1AAAABIAAAABMEQCICrQr4Kdox403GtdlE0oGZjVTYfkaWGbO+WLWDCvMgdmAiBzoptXmJhhFwnZOQue918UHCI7SFP/ltHB2DK1HG/s0wAAAGYDVFhMju9aguaqIipg8AmsGMJO4S2/S0EAAAASAAAAATBEAiBR/nmhNDgHinaN2yy5WL2B2vDfQdp3CxGI86r5Q0J3LwIgTuB/875oU0DntUa96QA/POFPhzk0ic5sBDCY/LMHP6gAAABmA1RLUrRaUFRb7qtz848x5Zc3aMQhgF5eAAAAEgAAAAEwRAIgYTIyBsruLLu46JYp3gDP6qYIJjsx81bqVVsnZ+JOiCECIAESc/wwS4mOly0qmrrpPECVZf9DhgySXIhs9muUsNncAAAAZwRUT0tBTKgZ1wbuUVyBsRZRvxqQI0QiPQQAAAASAAAAATBEAiApESP2I5/EC9mOT5MgidMZ63eJDJDbSqIJLi03FU8hTgIgIwAjD+AO2CbbOYsoK1saoanYuw4cqS0/BjYLyTudXccAAABoBFRhYVPnd1pum8+QTrOdoraMXvtPk2DgjAAAAAYAAAABMEUCIQCN7l3jaTmCYkbT9rY1VY1V9iC0MjN4Rt5q9FoEAwKXtwIgUYxcv1GlsvJUl+GMNSRuQtTEzUejpdplNXBj0plxNYkAAABnBENBUkW/GPJGuTAfIx6VYbNaOHl2m7RjdQAAABIAAAABMEQCIBruVK7c7V4WOk9R5fNwk2db6UmDp25T0E7FXQXLj3WbAiAJx9SIqBK8uB3jXCUmaIpGRyIkig4HFT9EPjAFGMtk1QAAAGcDVEJYOpK9OWrvgq+Y68CqkDDSWiOxHGsAAAASAAAAATBFAiEA+W2LglxEZFPMsBWYBiTxjFR4QOjhYOg5O+mgnHPtDakCIASnxH6ef2NBmRM+NWTLVDC0/CGA3ypWM+XHkQIQ6ot+AAAAZgNUS06qr5HZuQ34AN9PVcIF/WmJyXfnOgAAAAgAAAABMEQCIA8jZyFs7prqbTKrirlVXpbnjdqEY2ixWk+1s259doSOAiAccNLeIIflgVV1gjFQKPkQdvOOh7EiqyGEtDTT50HKQgAAAGcDVENUSCSntk45ZrATP09P+xuda+t1//cAAAASAAAAATBFAiEAqupcalFAudAHxEsgtRis8ATr3asUyUqz2XRlVYxNJ0oCIFRsa4VFf+v50/A/NhDdSpyz+gje0x1jOmN8+gBf6IZwAAAAZwNURU7dFuwPZuVNRT5nVnE+UzNVmJBA5AAAABIAAAABMEUCIQCcWZmcZ50TYeQp+d003lScOS2mqw4hgYwqpPUEKSvCqAIgNBZh39/0/2gQvYXt+nqURKX2A1AjhvsTpsFy4hl4w0gAAABmA1RLQdrhuvJJlkvEtqyYwxIvDj54X9J5AAAAEgAAAAEwRAIgKmSZOJW5xRq2BenGixCm25G0OcfsYzfa9BrWuOxy0HUCIH5PXjiFlKhQL/LDhS0C6Gg0HooGpaV86sZy0HhidTtCAAAAZgNUT0uaSfAuEoqOmJtEOo+UhDwJGL9F5wAAAAgAAAABMEQCIE91SNlAczwUcjcASp+fJRPfUkSptXi1JVTwgjSZBxzAAiBIn5nl3mqHktCxpHO80m9L8/JHoRN5+E95ypcBTkva8AAAAGwIVE9NT0JFQVKhZTyzeFIknk8Y37xHOlzj+I+mrQAAABIAAAABMEUCIQDyLT6V+qWV4jxIn4E0qyw9Nthy0WLEsyLq9gZq7hSyhgIgC7bLZUZfswte+NchNk+fAaFEWxeRfcFC34dwdTJod1MAAABsCFRPTU9CVUxMo4kgwA0aUwPbU4o+oI2np3nh91EAAAASAAAAATBFAiEAxU6rRiUrb3EIp8CqfNpVRMKz2gUYAHxNNbmA37mU3isCIEvtZ0zwwgL20yw6D8K0P05RlwrEz8Qt2zBmCzrQSCcjAAAAaARUT01PizUwIRiTdVkXI+c4QmL0Vwmjw9wAAAASAAAAATBFAiEAlW2zY0CRCs4Pf4IOCr9qrNWuMVmdW1XGCQMPPSPFpnECIHHlSeM6/mzvCi5KQ72UScqjaRhDQXkv5T4SaTTCeMlPAAAAZwRUT09Sjrll7pzPvOdsCgYmRJLAr+/Cgm0AAAASAAAAATBEAiBe7FXAo4B1NTnxGgKvWN/LesFXHzLb++YuxJdoSC/kmgIgecpNWl6NlXAhc5JakVKvSY6BQ7JWoBntlp7swy9wL1oAAABmA1RPUNzYWRS4rijB5i8cSI4dlo1ar/4rAAAAEgAAAAEwRAIgKQusl3d+JB+fTIPW/rBJkJTJaWWrVYss+sf8vEBia58CIDmK71k0VgPn3SUN+zQQrERJvZ58Tt4EbTIHqZBgPEdlAAAAZwRUSUNPf0sqaQYFp8u2b3qmiF69kGpeLp4AAAAIAAAAATBEAiAYtcZTvbEeEs32IPAhdqmUNIamy4qM3SbcWT+uRub4hQIgbcu62IRGszla63fdmqwQ65FU21evnVgSCVnsw7w15GMAAABnBFRSQUOqepyofTaUtXVfITtdBAlLjQ8KbwAAABIAAAABMEQCIHTW6shg9AAZW+T9xNmBBOsBMo3hgP8tRDlgj4Vp+wTqAiB3sPjKmiVXVOHkOowWfExHYLM2IfQtnhi0IgtORR3mNwAAAGcEVFJDVDDOy1RhpEmpAIH1pfVdtOBIOXurAAAACAAAAAEwRAIgapliGVT+Edj8liriWV403HRJXCaKJATKcxeOKRRZRzwCIHVlcTobTs0+ikSh0b5eQbmvPt1DXcODQ9iKBVQX0L43AAAAZwRUQ1NUmRD0rtSnVQpBIK19qN+LVukRl/oAAAAAAAAAATBEAiAcykuieApJtQBG4ZsiGfefEX9GpszAU6z3Xmx6wFhGpQIgT07IWirl19JkMKW/R2q3cbIkKiicz7j/gDRxoCsE23oAAABoBFRSQUsSdZUS0yYwO0Xxzsj3tv2W84d3jgAAABIAAAABMEUCIQCLQrWvXyTUVq8eFxNg16blhkaEN57G3nw4O2sNOCpEAAIgfNL7uxnBpkh8nN917f0BQL8gfo6VXX6eZeIlNlsftw0AAABmA1ROU7AoB0O0S/fbS2vkgrK6e3Xl2glsAAAAEgAAAAEwRAIgFrp4a4ieOzkTfiVUQsn3DEG3PHoBliRCZ3gXWeZvAtYCIH2g772eLwUJePhwB5At/3LUeYBjvzsHtR2mjrBk/ZsjAAAAZgRUUkFU4iWsopUku2X9gsealgLztPnG/j8AAAAFAAAAATBDAiABUq5964XOK/UXBvd4PAnNSQ9tDrIXupH0oDaHmgJ9FgIff1qpfoy31eYWx2iPGyuh6Z76StGzBw3JsY9yMAg6GAAAAGYDVE1UMgn5i+vwFJt2nOJtcfeuqOQ17+oAAAASAAAAATBEAiBGCrAWnP2IB608Q/buySnJZifbJIr2pdE+I0QKkuJmJAIgE1AX3Pxw3I+6IpgvKnj0rAUI/b7Sg22K43rxs6ahfKAAAABnBFRSRFQz+Q3uB8bouWgt0g9z5sNYsu0PAwAAAAAAAAABMEQCICmugRVYZP+a7gJCDJf1u0WQB2sKw0WBbRY2JB5gQ3j5AiBrbgaWyRDDZfjjOPJ52WQ0BW2pJ8dVqXYRwMzLmqX8xwAAAGYDM0xUQwJBNowdKT/aIduou3rzIAfFkQkAAAAIAAAAATBEAiBSOfcExyLBKTD6x0dALFd+Lo6UBEF4mwoWeXvhYFoy7AIgbinOz4TXObAfSLHzLLAX448m9XL98zYRgnKGnwhxHCEAAABoBFRSSVgFY1Tz/yB0OqTA2jZWA4cccACwgQAAABIAAAABMEUCIQCqMywQQ+cZJGSv/HEmdAm53+WgACrq7N8OIVrZMLRlvQIgViRzo527KnWt8RqEpCMPBJGGv/RXoQTSImEIPXWYX+kAAABnA1RSWPIwt5DgU5D8gpX00/YDMsk77ULiAAAABgAAAAEwRQIhALBfRvLMfLQ1A1Js4+Ij09dKq7n/9TKAeJ8+rSL5QiahAiARoD1eNpdQE1iVyVTMLFbjrvJhAJPUm5PBg8wiXMRpzwAAAGgEVFJTVMuUvm8ToRguSkthQMt78gJdKOQbAAAABgAAAAEwRQIhALklAz6Q3OCej+gFTWevskhy9c64fwKYvTxTatb40O3GAiBW26rBkHZiqIgKdOR51qstY43NhnQbL7Anu+kmfl2nBgAAAGcEVEFVRAAAYQD3CQAQAF8b165hIsPCzwCQAAAAEgAAAAEwRAIgC+oBW/pszQR+G53s19ZSXUDHA+suVELCjeHcaf6seTECIHEgw3qsG+uG5WnkeAt6/ef/ma1mc54mK0xVSt0PUMINAAAAZwRUQ0FEAAABAPKivQAHFQAZIOtw0ilwAIUAAAASAAAAATBEAiB1guHDgqMz2emdRQEAP1BGiEHDe8gYRwQspi2ruDDFewIgCYfdn+UR2dmcTS+qo4N4GllAlCG+NeKRuBq8ysAyf9EAAABnA1RGTKf5dsNg677URlwoVWhNGq5Sce+pAAAACAAAAAEwRQIhAJu/OmyRSn3Fv1gNMk3d0aK/Dct0fe5Zc5ME8GeWvHFbAiBm7jFAY20w0O7IuvLd/Dj4cyXTQcNQyw9s/9FzMWTq8gAAAGgEVEdCUAAAAABEE3gAjqZ/QoSleTKxwAClAAAAEgAAAAEwRQIhAN58+GYGqnhCvhGufGSS2+HA/pBHlzPJlR6xA0cmhGntAiAQE/hHDNCby4n48iRepS9YaekuTBCw1whabzOekA/klwAAAGcEVEhLRAAAhSYAzrAB4I4AvACL5iDWADHyAAAAEgAAAAEwRAIgALLl6eoOSAQA8mefmsVTGDyfc6fzZ5/QRuItU+RyCqcCIG5oNSYw5TISVtfJehU3IAO9bsTgze0cnrd5R3h1njbOAAAAZwRUVVNEAAAAAAAIXUeAtzEZtkSuXs0is3YAAAASAAAAATBEAiB5PKv1qE/061SOXcUsT9603eerpeBXYI+gn/DtdOu+bAIgbAaFYN5AMk/FmQaeBftbQAvjToEmm0WdsfdjnYOW768AAABoBFRVU0SN1fvOL2qVbDAiujZjdZAR3VHnPgAAABIAAAABMEUCIQCsRwJXst3FAJ0juHz25WGUiK1EdgOWDiCp+NLAYPeDQgIgU6nTrjpqvZ/w/wp6T138rOC2Ht484+YCm+KW6J+smjgAAABmA1RESCodur5lxZWwAi51IIw0AUE51dNXAAAAEgAAAAEwRAIgV396+Q4Vn+/7ycsJt6WByG9PpjrFlVZrytXWk4mrFm8CIDYMy7Wx2YqlwDFFh/C9RM9uivKo9EpOektDKcI3w2qjAAAAaARTV0FQzEMEox0JJYsAKep/5j0DL1LkTv4AAAASAAAAATBFAiEA6A64902bFylXXaQcEw+QRth2XWWX/UHk2rbm1y2zEb8CIH2PpODUWzVYJnQ4/28XpfC/i2bZgS/eAFxYgCmrhC8JAAAAZwNUUlVMGVlvWq/0Wfo4sPftkvEa5lQ3hAAAAAgAAAABMEUCIQCxOtxhpcBwjx/ho1ZHYKZm618B4LzzQ9zmCyOSftE0UAIgM05dDBDKIbrUU+1dYrgqQex/sebF6k82brg/l9O/a0MAAABnA1RSVnKVXs/3bkjyyKvM4R1U5XNNbzZXAAAAEgAAAAEwRQIhAI1vBg5mJDNW16F6q5YkzJ82+7KHKXci+DYw66a+61sKAiAWhIqtD1saSuqBC5qOLCqeTnrFzjrQbUzQ49+QR6kVYwAAAGoHVFJYQkVBUoaAfaW5LTH2fhKHccrLhfNXlkbqAAAAEgAAAAEwRAIgbQ/do0rtr1U2yLJ25BjkI1AqWeNLnO171ozU4aYYCGwCICryPRAD2hJF8HL+jITTwlSkSEPR+uYgi0FLYAZ9uDeAAAAAawdUUlhCVUxMwXXnewTyNBUXM06j7QsZigGpc4MAAAASAAAAATBFAiEAl3gFgDrLeQMftTUpQy6JMDST+xsVuxdh7yam5T6ozI0CIGySGVTmVzZ9lvgFA8icXtAvcScfPvL1b7XwWLodUuN/AAAAawhUUlhIRURHReWMjfAIjPJ7JsfVRqmDXerMKUlsAAAAEgAAAAEwRAIgTPt0J4vFVXGsubPheThTZf4TSXM5QBTux4KoUJ1fvdMCID5QzjnsKe/tujKn6FQ+7BiDXxsyMhiBHrFnlLcgwb25AAAAbAhUUllCQkVBUqXd/Ki4N8zQz4D+bCTiqQGPtQ26AAAAEgAAAAEwRQIhANetnkWAmSI4AN8Y2BHJ0gRb+6aIVz7Oxhw2C30Awj0gAiBi7Ub51kS/MkbVji8q3sKYx4SREU1i2DRppF0fkQ2mIQAAAGwIVFJZQkJVTEzHA4zPYOSMW3EZ5VVmpq2fLWbHwgAAABIAAAABMEUCIQDpbnTGS84XvdEYpk0o/HbZ+H7bxIV/A+BYsAamXJ5ImQIgVfl/MAThT8XBcrJcx5nt/U3HX9lk3bG7wCP0qSBkV+AAAABnA1RUQ5OJQ0hSuUu61Miv7Vt728X/DCJ1AAAAEgAAAAEwRQIhAO4o4XlHG+hbJ31p259alethGswHJY28W3VEI2pejrGjAiBYJomzaaxe3vNEtHLK85UyQr2SlEI0lIJfPVRn87j57wAAAGcEVFVEQV4wAt/1kcXnW7ne2uJoBJdC5rE6AAAACAAAAAEwRAIgS9Lldo7Lh97yWVhu6wZhg9HQID8+1p+ChzHCcomDlxQCIHIc6E5cjAFW6Fe/k7HsMElr+DWSzJVBgsayOuDgpD8zAAAAaARUVU5Fa04GhIBv5TkCRptihgJNucYnH1MAAAASAAAAATBFAiEAqPdR05v0a3rUmE3uNph9yfUf/OmmL+wbXfb70IfHDS4CIDMl2APLj2T51WyDHxwkhN0tVmD/u2nlIwUIiyWu2xsGAAAAZwNUWFSiQottHP+ol2DXl6m1omNCzfRUXwAAABIAAAABMEUCIQDsHIzlHgKcyQTtd/dwpaVxfUo/rw7aLQ+MScICyA/q6AIgNXQOVzlVXIZWnYv9pDJTlX6ZHJGYpTviwbW7D61yBycAAABmA1RUVqg4vm5Ldg5gYdRzLWufEb9Xj5p2AAAAEgAAAAEwRAIgfZmcaYq8cCVgDsbMVpXP6jRRkBCXzP1J/zkUeuTKuIUCIENgDk9g9lfswjDrFXwBqVUU48tIKkSbm76aXlQld5SSAAAAaAVUV05LTPvQ0cd7UBeWo12Gz5HWXZd47uaVAAAAAwAAAAEwRAIgKsv/vJbRGWES6fAXoyCIdN/qVWjtz1OoxkU5jSvh/j4CIFR8V4Pkk+Go0wOSes73lsMBx45CD9oUvoFAznKv0rlBAAAAZgNVVVU1Q2OO1KkAbkhAsQWUQnG86hVgXQAAABIAAAABMEQCIE6MiXAtuMbmtLK7vYR10hfErlbeIXYVTntPtAK2AvOjAiBWm2coHhSthtFrfK6DFUIWW2fRjU5ZtkXrZwQjQXTMLgAAAGgEVUJFWGcEtnPHDem/dMj7pLS9dI8OIZDhAAAAEgAAAAEwRQIhANF203lEfMfMihfuNVhLvpePYBlDSs9uA6kdXxmMWKDEAiAU1XM91RrQgkKJxKJhzPkaJHImmsA/PPW8FQqARHHr+QAAAGgFVUNBU0iS5SoaI12aED2XCQEGbOkQqs79NwAAAAgAAAABMEQCIGAn7GnQ/EMBiQyoQjv2KOxdgWus2mbWYdgtzxlpbuvCAiAkx6NfOzomZw1fnTa2jxCcc4EGLJWiB3v62UWnS1VVBAAAAGYDVUNOqvNwVRiP7uSGneY0ZJN+aD1hsqEAAAASAAAAATBEAiBwLQIGSfYlgtmC7tNPERIdmCQWGAlHgHNmDPaM86WNwgIgfL1LqS9vqx1M2sh873MkFYLZNMb/v+07bMQUksun53oAAABmA1VDTXIvl6Q1J4tzg6HjxH9Bdzvr8yMsAAAAEgAAAAEwRAIgCsxGGL4Om9DloB637vxVQXhoaIbUDwkUzEjY1H4NsX0CIAjeJyCNBHaaBE1aRZIMwyZ+4R9OA/+Y/NDzYogpCY2YAAAAaAR1RE9PEvZJqegh+QuxQwiablaEaUWJL/sAAAASAAAAATBFAiEAvOZvumOVNIwua2/5XzK5HJTqCPQAvdMlOLVXOrr8MhsCICeQYAi80FcCrlCh4fQpy5IWgk6twTjEjBaWWgdXSwvfAAAAZgNVT1PRPHNC4e9ofFrSGyfCtl13LKtcjAAAAAQAAAABMEQCIBdpF7JFpuY6ZoKZ+ivGxKWIpU22N30PJ2Gircuad8wWAiB52f/Quri5Yl7XjmUTb3MOMgM4+e9g8o6uxNF9+qUuTQAAAGcDVU1BBPoNI1xKv0vPR4evTPRH3lcu+CgAAAASAAAAATBFAiEApErNVPWFFfObMp59pX8HiPSE+KG86C2dU+8Q2wnWHPICICbzXpMmJj5XkS2QUp4+g78o6P9iuXM5Ola+y5YWmUb+AAAAaARVTUtBjlr8afYiejrXXtNGyHI7xizpcSMAAAAEAAAAATBFAiEAktqA7xZcshqw99jYiEzcfNQERl9MU1u/7JNQpRKZvKgCIGpSinIeaCnbiGES5r0H625sV3gZ9MJla+xZHq9ESgI6AAAAaQVlUlNETFIY5HLPz+C2SgZPBVtDtM3J79OmAAAAEgAAAAEwRQIhALS3wXk5pn2X5nTWVBmQVZK697sQzgfCXkj+ade4yF5KAiBalfU0sdzVJYrKvZpk6hHQ+Hrrf+s1AqTEkTPissjqZQAAAGYDVUJUhADZSlyw+g0EGjeI45UoXWHJ7l4AAAAIAAAAATBEAiBZ/2veNTqclLlYmdvmp5mkt2C3PYydgd+af7YabsUTewIgeHsQ1AheNCQrLJui99+/M0D9a4iPcAAsMTtndeUc6ewAAABmA0lVQzWNess2CupNSVuH4SRvt1K3aENRAAAAEgAAAAEwRAIgVAlg64yY+TsNEKYJc4/JfasvcefNoRSs9OJTzEamweUCIHqjgKg3qu4397h04VXMklFXboQnmtFPO/HKGPBjKbrUAAAAagdVbmljb3JuiSBaOjsqad5tv38B7ROyEIssQ+cAAAAAAAAAATBEAiAJF5gl6YNO62LLzKdDDbJ7371HkLwL6QfWMZGxJJIgxwIgRGyrGKusjTTOX0gDM1ams4/pgQZz/mX7O3rc8r/6dTYAAABmA1VLRyRpJ5G8RExc0LgePLyrpLBKzR87AAAAEgAAAAEwRAIgWGziEtcNT56ZDR1WUGQBSZ/BC62CJmZS4rL188CGSjoCIBZldvHXJGXDZcAZRa92drjPXMrTXDvpigD1mPYFAyLeAAAAaQVMQVlFUg/2/8/aksU/YVpKddmC85nJiTZrAAAAEgAAAAEwRQIhAJ4KcUPuOQ+AV45ZtgW4p8vgVxAArXWU+Z1Pv+vqM3xIAiBjrmQ3RH4POMNf9LDQxKh6N40xVQKcBv+n4SxjkoyBTwAAAGYDVUZUAgK+NjuKSCDz9N5/r1Ik/wWUOrEAAAASAAAAATBEAiA0SUyDJ2EUwY6JlskzAqzpiFzATxwgxQ/p6FJ2cX1RsQIgcKJi0HLyMt4rWFP9/O6arA4mKmGDXzw68cMPn0NedbcAAABnA1VOTiJve4QuDwEgt+GU0FQys/0UdzqdAAAAEgAAAAEwRQIhAJpsxO1m4TGPFA3LpICJ4OSlRX1jYNhYrkEaPdB84A5jAiBxMgCKlwA1mCPdIki7HmhW0FZWt3zzu6rfXCfPhic4AwAAAGcDVU5JH5hAqF1a9b8dF2L5Jb2t3EIB+YQAAAASAAAAATBFAiEArl1J6ZJwXJS7Wvx+7T6vOjzFZBsxHq2+ZnoE1c/MTM0CIHSuCEmk8RNmMSAtPZmcdE/Xa0IhItFNEUq3QU5yh6BBAAAAZwNVVFQW+BK+f/8CyvZiuF1dWKXaZXLU3wAAAAgAAAABMEUCIQCshT0IpbPp/1PUYCIudxrjO0CUKGaBYI2kZJyI5ZSupwIgdk9ZWHutmTP7Lpuk4C4tKUeR+L9ym83WTpnjbWKzmiIAAABnBFVUTlCeMxljbiEm48C8njE0rsXhUIpGxwAAABIAAAABMEQCICF7Xjj737Ca1hhIf8glHoujyiBtGO50t3Jf+v7GCF8OAiBXkvF4Zl0H/fwMfkIFE0F9NKk/n3pnxuYR8WU5bwdGegAAAGkFVVBCVEPHRhs5gAXlC8xDyOY2N4xnIudsAQAAAAgAAAABMEUCIQCEsNDtlQRwmPZdHokk3RxpT9ZLTg8DwOqa1olzoWbT/gIgX+mn5biK62I0VLvqd8KfWPAeb2pMbn+Nnuy95RRE238AAABnBVVQQ08yr5cA/KFids1pxONf7sxm0RFoJswAAAASAAAAATBDAh8l7/h6A6oI+hfWoVWg8d8whdgS8JFI0LHc/oqVx3S0AiBwd5MLEizMNc1rS4HSZdfufH7aAGb3G1A0ahzZzKwaPAAAAGgFVVBFVVJsED2FwVEH3OGfWnX8dGIn5hCqvQAAAAIAAAABMEQCIDqUXR92ykOGd3tv065bo3YOWR93f6Y9myyFuigLOCwvAiBj/N6QlX2BxgnjgeIeB9reIGj0FkkUEa9apbGcNN50CgAAAGkFVVBYQVUFV992dBkpZHTD9VG7Cg7Uwt0zgAAAAAUAAAABMEUCIQCNi3USFPi+uO9Oavc8uLocwfn0eMpK23vg/TCz0hmQ5AIgZQf7rvfyRIz8dH317LskO5bEvsjU4A2TwMdbuyeWH+8AAABnA1VQVGyojMjZKI9crYJQU7ahsXmwXHb8AAAAEgAAAAEwRQIhAOe9T/4JA+YaaGS7To50ByButHUHpDXarHdqrWlMIOaYAiAeLGUyqRoZHbOZ3ffGVLma6zBZGpqHW3UtCWRkLd/b/gAAAGgFVVBVU0SGNnwOUXYi2s2rN58t44nDyVJDRQAAAAIAAAABMEQCICrjG2ABoTBWNfIJDLz8XU9oA7IHgP99pnK9/vJarXbmAiBthsy+WSk5Hra9GD+fnABY0HXRjad8zvXaOG96YordRAAAAGYDVUZS6gl6Kx2wBiey+hdGCtJgwBYBaXcAAAASAAAAATBEAiAnkTCvcw+XX2H0uD+tzZHqw1VB+Ya+hVz+IQAFgzD16wIgQnTj+A+IQ2Di7C4MaYXQuOSFl5ITIsroF9vmSGptPBIAAABmAlVQa6Rgq3XNLFY0OzUX/+umB0hlTSYAAAAIAAAAATBFAiEAmJX1YLUDDStC7gAldp84/AbHldXDqKdmE9mK0RxIF0MCIBqnA8YVSjsnJq16FvhXlQJ3blmWuJKKbKRXluSUUKnuAAAAZgMxVVAHWXJVkQpRUJykaVaLBI8ll+clBAAAABIAAAABMEQCIAetCzh7tJZ5LgnnZurdIOHx/Av4bZPylM71hjfbrYkHAiB5kXzvBZ98KRiysiVHiqQ8Lb/4UuEebpLEsxuLe5fEcAAAAGYDVVFDiAaSaraOtae5Cdyvb9vl2TJx1uIAAAASAAAAATBEAiBidXzRVBSBCPE99JOhW/3FgZ/bOPeaLsI4rFksJ+ahNQIga9z5xgFrJWZ5hpRd6Aw2xnwuu+xyQ6e0ptonJbxpJboAAABmA1VRQ9Adtz4EeFXvtBTmICCYxL5M0kI7AAAAEgAAAAEwRAIgTxqfbCcXA760gfuDLpcoot3nLNyaa+u2Jvn1q2Yr2g8CIGT0pUXF7hj4/VTP8beI29nzANIZS4m7vG9iK8tpiNXBAAAAZwNVUkKTFoQTn3VsJOwHMen3T+UOVUjd7wAAABIAAAABMEUCIQCAmXmTtoQ8dTZupIiIZlq77jhRaMT91pNy91Qg+b3dfQIgOZv+/ygB+QucnkL2a4Sh040tlf77jdXszwROPMNVK1QAAABnBFVTRCs+z4B7ihDgU9UnMxLyOE5dWfgQVwAAAAIAAAABMEQCIDht4CtCUQAwaNfpw94K3mLJAYhOLxqNwCevRITb9mLnAiAmV9DYpr8WluLQ1iT4Wz3RszJZftkEz+Igmfov5/EojQAAAGgEVVNEQ6C4aZHGIYs2wdGdSi6esM42ButIAAAABgAAAAEwRQIhALLjWHJuTmpnUs80QBfA6dRbmpBBIHWNRfYbKAT5rVKZAiAVFh7yjYxEgb2UMsE1Yt75zOaIvP7Ilu8kTJohPxBs3QAAAGcEVVNERL2+TZ5D6PMFr+lGKAK4aRxFyvWWAAAAEgAAAAEwRAIgYWq1eBtbqhjFF32mI92L+/2+s//3Jp6g0jyfYmrTgTECIDpDEQlUC/h4kmfYKNCrJ5/IBwecYGTMKx7o7enaucHzAAAAZwRVU0RU2sF/lY0u5SOiIGIGmUWXwT2DHscAAAAGAAAAATBEAiB4xmzOo+Te2xWiTsPHg9e1gs0mDa9i/Tav6aghKjRK7QIgFguowcS2qKplZb7SBjKgka7ut7/axn/GWJpgMay/URwAAABrCFVTRFRCRUFSDNbIFh8WOEhaGi9b8aASfkWRPC8AAAASAAAAATBEAiAzeovd7Wq6tJPbgDCetxX/rY2feLBwDi2n7/9fjKCHPAIgVZ4Gg8oLefKuFWFWPbQdzwzoEJYBMZmjRRTaMmqK3zkAAABrCFVTRFRCVUxMjM4ZlDoB54t8J3eU+wgYFvYVG6sAAAASAAAAATBEAiAa9UEfu2YATguHMIhie7ajuzqiR/ZQqBgFaP4STKh5KwIgNwalTnCO7cgQa4CeGenBvMxSbJ+2BKAadX5TKMQmpNkAAABtCVVTRFRIRURHRfO41LJgejkRTay5ArrNTd3nGCVgAAAAEgAAAAEwRQIhAIEUpnk0dM5BAEbdEqvhUHkZsbhaW3CdF3+L7YpacEd+AiA5W39c9xJjmw7FlY7K+lMurMPUvdWkhncg+w7w8I66IgAAAGcDVVAyT1SoP1kpokU8LhjiWyFfb48oKPkAAAASAAAAATBFAiEA6iEftZccO95mGcOiyYSiQ1uE9TFx1CH4+JOi1m9VVLYCIDseFA2wweY+gjyo6da0iH9Ct2LKuYjcyjpT/S+ZpqIXAAAAZwNVU0dAADaaz6Jcj+XRf+MxLjDDMr72MwAAAAkAAAABMEUCIQD+GDQkOAif4yuI3rfVH1khXyxG4y66meldmORkFnX3BwIgXmnrGv/vW/7RmTTMSSJLMQtctXpYtxzcgEXnGosVguAAAABmA1VUS3CnKDPWv39QjIIkzlnqHvPQ6jo4AAAAEgAAAAEwRAIgVKM3hyA4vtG2YvTZiMmmktbtoxY4A4oUesmGUyNr4awCIGIFNdL19I94OyB7Lhb6q0QBgJ8/TmujAnY9OHP1PK0+AAAAZgNVVEvcmsPCDR7QtUDfmx/twQA53xP5nAAAABIAAAABMEQCIEm2CSgvbeTU9dTXEV8qGS1ELAJgPjuUfSKp/rf3g+z3AiBuIuqvW+DGlhyU6IcsPVk7/06IcmFZywsRsMxWMSuKswAAAGkFVVVOSU/LfSwxuH4OiNUUjIi9et/flsPd+QAAAAgAAAABMEUCIQDGm03Jo5HpDuYOV7X4pMGG4Y+nz+pL3S4kgudQ7S4qmAIgX+5fHFexXgWWA1Xz6jN/MAcdtxavq2jDVBs5paKDexIAAABoBFZJRFREX1EpnvMwfb11A23YllZfW0v3pQAAABIAAAABMEUCIQDsiFre5q1zPe7UYU0bPYgpCh3LtS1lk2Zg+4uBe3OrfQIgX8WPJIKFrHEPOdTlUDaS1eFPRwo38tOr4fabgeL2jPYAAABmA1ZMRJIqxHOjzCQf06AEntFFNkUtWNc8AAAAEgAAAAEwRAIgLeiIAfwVcU4mZDt+JosM/JVbwmPl86/M6dJo1jbSMwICIACCKNkH9gqzfAX3ZUmrJXSwzFfFWBOnnSst6umI9kBhAAAAaAVWQUxPUil+Tl5ZrXKxsKL9RGkp52EXvg4KAAAAEgAAAAEwRAIgTEDgvU8NmwZZDV4ZkIncxIYNX8lG4nObxzkrHfMYoZwCIAKntPvEilEORwrJzsxKe7secBCUvjbgNUPaWojtnCrlAAAAZgNWU0xcVD564KEQT3hAbDQOnGT9n85RcAAAABIAAAABMEQCIBTYu6LGk30PPPzxQbYbCh8BpSVjSRKcghcj9uX+PgTMAiAHV1FzdJuOT5notnEKHv1RBftwDNhZQx3j+O4AuS50lgAAAGYDVkVO2FCULviBHyqGZpKmIwEb3lKkYsEAAAASAAAAATBEAiBMhwAibIluEaiDQSYPRVlCyCJvW8+nLR/uXcaaWv7pOAIgbEN8mwDNAVvV4Ocll7XD8Cz2grpP5r2o1nw8CtuDLsoAAABmA1ZYVn0ppkUEYpFypCnmQYPWZzudrL/OAAAAEgAAAAEwRAIgaVgdVeWrfe/VAhy/gShsprdy0kYHcfsTOnd206wCjYcCIHWwhkK0vR5Gn0ngSnLG7qT8xQB4bwx92Xi3c+CHi9B2AAAAaAVWRUdBTvreF6B7o7SAqhcUw3JKUtTFfUEOAAAACAAAAAEwRAIgfdH3fzJQHzbbsO2jqaegOnruCuJ//xHaDvfVzZYQRkICIGbgeKZqINu4cTRX4495KvCkm3xCyowiNEeF0owSIFIAAAAAaAVWRU5VU+vtT/n+NEE9uPyClFVrvRUopNrKAAAAAwAAAAEwRAIgGu6Ag8j+++YGFytrR4yUtnOnoxkna51MCV+LbiLRY4kCIGdw99MWgbWC8eKJcqAV5TYHqQs5zLlVI3Wu/y3J7H8SAAAAZwNWUk8QvFGMMvuuXjjstQphIWBXG9geRAAAAAgAAAABMEUCIQDvNd57FqW+CjhiHsZ4Fs7Kw6ik3mz/uMAOFUf9ygyspwIgatXWNIHxRMXnK/gJCiamliVBjn5L/zgHRWw59P0vd8wAAABnA1ZER1fHXszIVXE20yYZoZH7zciFYNcRAAAAAAAAAAEwRQIhAOBRL8WUCelrf8xqr2G6j34zaFxUg0pDe5wz9IMI5vakAiAGBIDwQ56urTOFINu1JEYpX/UomWpNWP+8siXqrSjOMAAAAGcDVlNGujp511jxnv5Ygkc4h1S45Nbt2oEAAAASAAAAATBFAiEA51sqznizAvZs+s+yeoyOKrefSvrxzueOluSNSqm+A94CIFdebe4tctCnIl7N0SFQrnVP6ixbbJcnbe7XzWcj/OpMAAAAZwRWRVJJjzRwpziMBe5OevPQHYxyKw/1I3QAAAASAAAAATBEAiBwVgAdDn60VcU6IMdBiLvku+kKRK9m/R05xPYUFd/o7wIgWmTwIuXY6oew/OxyouCj4tDTqbZdKjgibp+A+6px9lgAAABmA1ZSU5Lnja4TFQZ6iBnv1tykMt6dzeLpAAAABgAAAAEwRAIgEQ5rrEJyydbBIlWZBgGQDM3y6ZHsdJVlNMCjS7sKPxgCIGt/7Yugh436bSAKU+QFaeB6sBIeOLhTfkIIz9ItBYYxAAAAZwNWUlPtuvPFEAMC3N2lMmkyLzcwsfBBbQAAAAUAAAABMEUCIQCYwVeFzNYNnq8dEdNPJpWJPxS3PqU1ynjnKZPh7cDtSwIgUPLAqTXdyQjUgmDcepGLSrPPkHAxIWH954Y5uCDzchoAAABoBVZFUlNJG4edOBLyreEhQmRlW0c5EODK8eYAAAASAAAAATBEAiA65FFyW+AHtLpQbnHaHxlz2k+DZ1exEiM5N9+T/TjvVwIgAiy+7fI4KuhGT1C4yAtC9+HRSG0Xy1JZDsci7iy8oqQAAABnA1ZFUwNFLmn/zZxFyjT/TZuiIJ04qNVqAAAAEgAAAAEwRQIhAN2CIkoN6B+FFvVzp7VSUQnz8pXVmIE7OWptwLCpF/I3AiBc7kXFdHV3gTZJhR/qZT8p9ppCo4XTxHT2Zz6qK5UaowAAAGcDVlpUlyC0Z6cQOCojKjL1QL3O19ZioQsAAAASAAAAATBFAiEA5Tx9qp81tCCijdq6YWeqR/0gqjVFBrEHoNZmpZvyM44CIDY/Tc0aGClpKz3a+cvviVvk6Xqp1ag2cgEM/pGVt+0sAAAAZgJWSYtsO3wB2dtDk/mqc0dQ823xVD6aAAAAEgAAAAEwRQIhANg0sWA+u3wrNnZbOFfzMCdAH6kEvwn0kl/yei3WSWXOAiAgCibfvPlKqBw4KTCT5pgYkmD0kqFeWunPCqtzd7dMrQAAAGUCVknTIcp816IzSDuM1aEaiekzfnDfhAAAABIAAAABMEQCIFuk4VMTgzICPXuVHwa16IPJHn4Bn/JKdS7LrOu8MFUaAiAIW+rA68HwwRUPKLqqw+I1B/s5in80hWrta8j1ScSyqQAAAGcDVklCLJdLLQuhcW5kTB/FmYKond0v9yQAAAASAAAAATBFAiEAgrMJMcLHcExOutRHpdsUSdZrK4bvjmLeXukZaz0CFcMCICgoeRIcIKH7HKpOCQwZ/3CcjAq2mq5LEqz15Y3+zsRYAAAAZwRWSUJF6P9cnHXes0asrEk8RjyJUL4D37oAAAASAAAAATBEAiAu3byoUwIAaqTBuWnz0HcqEXT2n/HQJmQTiakreoUKdQIgTZZtvNirJvoEcY9kW06YwHEH1NDdhfnjd+HsrihnKhgAAABpBVZJQkVYiCRI+D2Qsr9HevLqeTJ/3qEzXZMAAAASAAAAATBFAiEAhBGXaO6TGzBhV7xZBuRYaVOdHeMOlr8SfiMiTrNym5oCIGFu1KtJqoO/LpAFYvreWFVez2Q+6Cqw32CBcszzytyTAAAAZwNWSVQjt1vHqvKOLWYow/Qks4gvjwcqPAAAABIAAAABMEUCIQDIrurlAc52rDB9X4RjATsvrizeKKJcGagD1zaa7ax5FAIgZafyxpFi2xlv1GIJ1ph1cUV9V+WtsvN5y4MFbvnUdRgAAABnA1ZJRBLX1FpLlpOzEu3jdQdKSLm58rbsAAAABQAAAAEwRQIhAPgBajJ9826YjqybsxoJMRMkpjrBUOdIzjJtkslRE2LzAiBVuNhdDjzL8JDyY6pm99geipxUFu48cDsMBCrIKQOf9QAAAGYDVklELJAju8Vy/43BIox4WKKABG6oyeUAAAASAAAAATBEAiAvQwO+ygLVnWLfwf+bd86sW7uJJTHbEbKfMFVLB7o0VQIgIdkLXiw0wRtPQzVcltGEQ/K9CMYYd4A6gCTqM0/7LjwAAABoBFZJRFT+9BhVlEVwUMycI5gNMBkI/gV7sQAAABIAAAABMEUCIQC6CR3YtflHhaaCDY7qRV6ImL4szdwI/8qFsqqsuvahCAIgUqEa/mPRaUD4vXPegIC7jTJZG7VZrKpZTP5NPjQ1eXkAAABnBFZJRVfwP41luvpZhhHDSVEkCTxW6PY48AAAABIAAAABMEQCIE5DVodZME1btovB81q6l5NAE0JR3lAZ2TrBqtyosn7kAiA2CcVhd43CheThYLrv5tyL3DcfwLVcJTSdab82oQeR8QAAAGkFVklLS1nSlGvnhvNcPMQCwpsyNker2nmQcQAAAAgAAAABMEUCIQCmWMK6xkRodAPYvMuC37b2km2iQ44jLHWWdZpIEm0OZwIgM7ZvakVX1NjiEyaNg7/ziFDTX/9ledhyUVAyIG/tKvAAAABmA1ZJTvPgFP6BJnhwYkEy7zpka46DhTqWAAAAEgAAAAEwRAIgPMhcpLZHAlZuDiQHX4SgBpmrnzR474euS7apQzZhr4wCIHZvIGm+wBiihXLynaZEzKhPH/aq46UujTjknucO6tvtAAAAZgNWWFSLoAnK1JPHZG4x1pQoq5pU9Hs3eQAAABIAAAABMEQCIAjmm2XTxYXzjErnRQQsirFqDn+C698+Fl5ExHZi/F3bAiAS+856XnFwZZzfod1uou6tA+jf5ob1rjVYdPDd4My/7QAAAGgEVklURRt5Pkkjd1jb2LdSr8nrSzKdXaAWAAAAEgAAAAEwRQIhALKxetIKuax9Rc45O+gLusISfhFp/VtmecCUTKFC9MqIAiB7e9DOwHj9mm3Fwrw2fQ91wvyMpvqSY4k66WJFXEoleQAAAGYDVklVUZR1sxZT5G0gzQn5/c87Er2stPUAAAASAAAAATBEAiBFiM724bmvI/ToaKgHrvspQsA+UcQmcVsQTQ956nVW6gIgMKNzKcBdJ7Cck6b3A5Fa6kf406QevWW3Y+6w1Nz0AgIAAABoBVZPSVNFg+6gDYOPkt7E0UdWl7n001N7VuMAAAAIAAAAATBEAiBVQ2Ki5v2hv3BZ+RXqKNSNzJULkuzN6GX0Yaishb9X6gIgKz2v5fkjDMTsrxRr1Q1s596hJhoF6TNSfNag47P2ukYAAABnA1ZPQ8O8nrcfdexDmmtsjot0b89bYvcDAAAAEgAAAAEwRQIhALeAnbO5csZzLUfvP2W5jz1ntZZszEuBpfWUUokTVVE+AiA0v8gtp5C5szsd/pK4/u3JHQY7I2AWyGtFgTSnEetcLwAAAGcDVlJF9yKwGRD5O4TtqcoSi58FghpB6uEAAAASAAAAATBFAiEAumQEJGYuH/P7pEDzwnwHBZxHWM2vbe6oP/fOuI02KLcCIA32vRIhwLF/+niTSInG0InOV/fpgCUHArye7jfu81FnAAAAZQJWWL84uiqQuCX7oC9gRZoJf7ICE0aHAAAAEgAAAAEwRAIgKwuyI+3WeXKuEROWVKYsZeWS9uchJAGAdA2dNoXRP1UCIE0qV6TDrqpikW+MAYK05KIbNcsdtkAcnggwQCptvwjjAAAAZwRXYUJpKGvaFBOi34FzHUkwzi+GKjWmCf4AAAASAAAAATBEAiBl/377T3/5CfWZMbCFK1/G3C/u7Ytb42kWuyzqRZAmaAIgY4wNwl4nbaUJtXSeJXYjIow5gFZUGg1ZrTp12NA0COAAAABmA1dBQku7xXrycBOO8v8sUNv61oTp4OYEAAAAEgAAAAEwRAIgcBgasLZICQ76yvLlYb2tdux46nbzdZnuS4Z8ZFarui8CIFbPjbfKpJUx76Wpq4uUr/bxp2zJA9Sic7pMexE+mezRAAAAZgNXQUufZRPtKw3okhjpfbSlEVugS+RJ8QAAABIAAAABMEQCIGIToL2z9fzOd4ARlfAd8Z4fcvebHKcgF/LaEl/d6Pk4AiApyXglpKpxaKRmkDkmR14oFH2AAYUwRP+A5XB4hQ8SbAAAAGYDV1RDt8sclttrIrDT2VNuAQjQYr1Ij3QAAAASAAAAATBEAiBQ8LOen+x3UQz2kqp+9UR1G1WFXWi2WwslCuZuZNQR9AIgUQAmKh3R77CxQRnDCmgie5YFZWUl6eoze4L4koPtcSMAAABmA1dBWDm7JZ9m4cWdWr74g3WXm00g2YAiAAAACAAAAAEwRAIgTrG53J0EcB40IovnRq1z8upO2euf70KHGXuIbnI7uSUCIAVTIucwUUKQMWz0TPXRuImu4GepAs2jazByiMiqN7AzAAAAZwNXSU6Jkzi4TSWsUFozKtznQC1pfZR0lAAAAAgAAAABMEUCIQCcXfbYabiXVzrPZNqCsC2/JMUWL2vEnnXs9ZngkwJRRAIgRJdqHb14S0TKMWrGBhPApuEAxXy43e/RHgqP4+ttVNoAAABmA1dFQoQP51q/rcDy1UA3gpVxsngukZzkAAAAEgAAAAEwRAIgc0jELAybeJ183EF/BAm5/gLJ/N0KlszeGiouOg2nwhwCIA18QUyKRkRo6wctMUvYblH2Plc+OHT3VkiqqKI74YbyAAAAZwNXQkF0lRtnfeMtWW7oUaIzM2km5qLNCQAAAAcAAAABMEUCIQDKeWB6zcyU0l4lMORh7qifzgO0FCfA+67TFMGOAiHREwIgS0qrV/+lo5Kgd1SV/q/5PXGLHNh6XYBr4x6eRdj0f/IAAABnA1dNQWhe05CxasnfmrlwcpSkKhB8+2KvAAAAEgAAAAEwRQIhAM75AGeFe+/NnFVYEYfTBM5jtapYvELrPbHOiEhDMJh4AiB7RmW5HGGLCiEcZa9b1sbotcFupx3ny9KYZ297EXnvHgAAAGcDV01Lv75TMvFy13gRvGwnKETz5Up7I7sAAAASAAAAATBFAiEA2ukj7WUrTFRyqCFwIqDddTgx5BMrdVnlTQxO052yqKACIBnenF6l4dSrPB+itJciEESgXVcrFsH+Zbu52zyTHQOuAAAAZwNXQ1RqCpfkfRWq0dEyoax5pIDj8geQYwAAABIAAAABMEUCIQDE4AUkYB2uZMXO1WLcRTGC9s6ledckTmEQ4CTEz4ZwswIgRiGI4pIL+5b7ngStmehUlNQNpPBAczObfRelV6XzFkkAAABmA1dQUkz0iDh/A1/wjDcVFVYsunEvkBXUAAAAEgAAAAEwRAIgOrMvmpkiBy+7GTgTB0KKsNeiCxvyuV4oSTNTBmYGZdwCIDORtkFKev4lyix4TDzdMfBLI1CL9f06Y7RyXyPh2Hs4AAAAaARXRVRIwCqqObIj/o0KDlxPJ+rZCDx1bMIAAAASAAAAATBFAiEAtH7oVRwVos9oHGSWUemH1+UnxIHSfDjaH5cagkJ5K9MCIGnD9oisVJOiPatXmOPJsHSEdlBp4dS+FDIark2Sy4y+AAAAaARXSEVO9P6VYDiB0OB5VP12BeDpqRbkLEQAAAASAAAAATBFAiEA0GIug/vEXxfE4b+Vd3DwoXO5Kfbye7nVZSHQpjyhxPACIFoMGaoxBtqcahLgKSWeY9PSaNbgD0pepJvw8IhKrvpyAAAAZwNXSE/pM8DNl4RBTV8njBFJBPWoSzlpGQAAABIAAAABMEUCIQDmA5G8vfiFlOMQSOGyYlnIevC/Fbn+tHH3hkbtAgR5xgIgX214oZN2q08z9FHAwL3He0Ui+eQnVkr6yP9JcXwXr5kAAABnA1dpQ15KvmQZZQyoOc5bt9tCK4gaYGS7AAAAEgAAAAEwRQIhAOLtNoV1CsGgt92YzvhkLyOzg5u2VgRMhN3yxpckrCOeAiASaA3Y08L3hNPjmxb2W38q+G0BrTkvNmJtIiXZzpGUsQAAAGcDV0lCPxfdR2+vCkhVVy8LbtURXZu6Iq0AAAAJAAAAATBFAiEAwx8PLBhuPChp+N+wQi70WoD/2+WAERdiprEJRWoTlh0CIH33VA3dFSHG6pNC4WA2eBzRC+aSa1VB0/QI9fu2xS3EAAAAZgNXQli7l+OB8dHpT/oqWET2h15hRpgQCQAAABIAAAABMEQCICruyQ/jvfCD7oDRooUpL0dSyIHu39yUbI7DSbwHQFdjAiAvT3/bl4TKadGUnz0pNDDrsyvjDEbjA0q35NoGKxASZgAAAGYDV0lDYs0H1BTsULaMfsqoY6I9NE8tBi8AAAAAAAAAATBEAiA5JJno9/1cBqtbVYJPgeBJKCHthHQKY4A/sVPd6J2d6gIgRnAdsSIJJjqXUnX2FFDeQuJif02ZmmHwhd3KztjXY3oAAABoBFdJTETTwAdysk2ZeoEiScpjepIegTV3AQAAABIAAAABMEUCIQCp08NGNN/CH7TrvWfcZ415bH7cfkmWbx3REFrSL6cyogIgOZ/0EE360E4TLlfyelGfIE5sCDPo8AqdUNib5iEyW18AAABnBFdETlQYNDPLtfS1Kv8VCfeGTKL3bk2FNQAAABIAAAABMEQCIFFKqKic3jQ0vyF+Dzgz3uPwVTJJ60jn6JGKM1GCFMUMAiB9W9uSwJj9sv8B0ea3O9NMKF6aHJKGIuKHAh5PQjigxAAAAGkFV0lOR1NmcIiyEs49BqG1U6ciHh/RkADZrwAAABIAAAABMEUCIQDQPQO43bab0c+bXlpw2K80hkhsLjTqXakuwCx5Ltyq8gIgf87y2SFudabShOONRG/QYBQe0nsZrxqsVwot0Lw7uUMAAABnBFdJU0VmoPZ2R5zuHXNz89wuKVJ3i/9b1gAAABIAAAABMEQCIFE/kKkIONeGzeiBibo4hIUumsFrzrnP8JZYj/twL2slAiAEV/8Kjs5n3XLf8EyE+cxTNqkdDItbBVnzr0OzqkD/vAAAAGcEV09MS3KHgedXNdwJYt86UdfvR+eYpxB+AAAAEgAAAAEwRAIgLDLNcWby4u3jT+qWkphh4KbxDyAg1nr3WPKvLjxG4FACIB9itvJgxdOv/MDgDRJzzNeA8du8jTLWIFynt5ceOBmGAAAAZwRXT0xL9rVay7xJ9FJKpI0ZKBqad8VN4Q8AAAASAAAAATBEAiAmkYvPXa0GFt/AU9LX+Ll6/qDB/+1S5wo9yq+aW4x+vQIgBY+ByU596CiBgPQbk87+iZbtkKtVavpSF5+zD/HYAH4AAABmA1dPTb01ajm/8srajpJIUy3YeRRyIc92AAAAEgAAAAEwRAIgTd3Vi1+kbk4/PVMWUqYDtdBcQSFiGu5KMDhWCAMwD4ECIEOa5M3Xh2rdpNoFrDI+nsN2bC7I2YbhEXzuEypPut84AAAAZwNXT02pgrLhnpCy2feUjpwbZdEZ8c6I1gAAABIAAAABMEUCIQDEvrNmcya+KE/vGYHnRvjbtjhOCZMNdMFm/3+ocLcX/QIgXQ0jjzZqYIN+DgbByighiPWYOc+/KivfoaAOFXMi/hYAAABnA1dOS9c6Zrj7Jr6LCs18Ur0yUFSsfUaLAAAAEgAAAAEwRQIhANti1dfSmElzxG1CTXtVxZXX+/qN13B0G/Ew7NSAs6lGAiBIDd/86+aSslop1uYZGQrdT3+JxawdkIjmqmwIiuvHtQAAAGgFV29vbmtaOG6w/L/uPw11niYwU8CRYv8QLQAAABIAAAABMEQCIF67NAM4Ptkf6rHPOr+LyqHnjfwhjEcdYyTLXMkPZGuEAiBWw5fTkfGpPkZCIzfQWW9z12ZVJlVslI6Helc5cak4NAAAAGcDV09PRpGTenUIhg+HbJwKKmF+fZ6UXUsAAAASAAAAATBFAiEAj5r5hzrVJU7pv4RGwndQhZaXhZq5SpxjFPG/H6VOA0ACIEmxkeD4G5tkxuhTX1LGQFEdO1ZndsiL8gMtLUbMxhwWAAAAZwRXQVRUgppMoTAzg/EIK2sfuTcRbks7VgUAAAASAAAAATBEAiBD3vOgrFSYNbpOvNvgf6aMl++cKvxFYlYmMWf5GsHSlgIgTVpewlbV2azuQfKhtW2IurqKiwTJiBaNvqZ5Wnin67oAAABmA1dSS3Ho10/xySPjadDnDfsJhmYpxN01AAAAEgAAAAEwRAIgG/cZ66zBbxFuHDp/Fiw8Q8KYiDGBzqf75AJE1BaLZ3MCIFpd+uZubxXnWkYs4GMG4pqzjydDwV26pnxh07drT6sqAAAAZgNXUkNyra20R3hN16sfRyRndQ/EheTLLQAAAAYAAAABMEQCICB60/MGtu2R+nqLbUioRv/TeKqkAO4tp7hCIPg+AdPDAiBfDdRRLochro26Ib1EK4SHFkQIvJw79UM6J3xNmndy7gAAAGgFd0RHTEQSMVFAIHb8gZt1ZFEJieR1yc2TygAAAAgAAAABMEQCIEyodn0TkdMdFBdTk8RBB172+t3YgFjA3FKDnAgbhzr8AiAeiwZt/2NbS6PmCpSInqltTknwKsrqj+JYP5/+GlGfBwAAAGgEV0JUQyJg+sXlVCp3OqRPvP7ffBk7wsWZAAAACAAAAAEwRQIhANczs9G8SaBWmOFNiGmDTPGRG++JzZjqjTj3w3K4GgB7AiBvtD3t3HUItWfzMLopLtoSmUEJNUNMuXlf7CbqFWDdLAAAAGcEd05YTQ1DjztRdb68JivyN1PB5T0DQyveAAAAEgAAAAEwRAIgezayaIAHdnkFDv+b6gPgmhvJwxQBbsjFKvL2HNiyQoICIDseR6tMthIueiJM6kgGBSMdGlyru6cqSYqNdEcjrgxYAAAAZwNXVFSEEZyzPo9ZDXXC1upOawdBp0lO2gAAAAAAAAABMEUCIQD0Tbm4Uscw5KSrlm5SniU6YfKBDyNsg7ky5Pk8/8uTPQIgL4Lc3C//Q5bvNC+/OwP8WRlsaygkhEGeVswugavvb3EAAABnA1dZU9iVD96qEDBLen/QOi/Ga8OfPHEaAAAAEgAAAAEwRQIhAJ6m5gli7A4nhoAigurOCGB5dHCEz66UooQUBp0ANUvYAiBidu9OjJQS87aEIBpTKDVoZFqpw2YWlbiUNwSsNntepAAAAGcDV1lWBWAXxVrnrjLRKu98Z534OoXKdf8AAAASAAAAATBFAiEAn/Ye/u+v4gUx+w+/nBStu2NzmegvY5W9tyx8Mrw1590CIDKiWntgc43BMNNM973mWxx8CdBJgIlHsq/baOEdaovNAAAAZwNYOFiRDfwY1uo9anEkpvi1RY8oEGD6TAAAABIAAAABMEUCIQCZBHyDdDPj0dXW9883aKNi7OHjN4YPUB6f8kTBWIKbrAIgcgcLrJqTFHoLej8QYR3jbo0mGPs70ZdYg2LeWBQrlIwAAABoBFhBVVJN+BL2Bk3vHl4CnxyoWHd8yY0tgQAAAAgAAAABMEUCIQDVQe4ZAHOZs0+0PkiqT1TnQ8M67QVHtyasjfkY+K9NxgIgLft2dHrWZIVIKNprCmksWuUZ3O3R2ImIPjGzi22b5sQAAABmA1hDVNK7Fs84yghsq1Eo1cJd6Ud+vVlrAAAAEgAAAAEwRAIgdeTVyVtSyQd/4XZi+ytXFAIUEbcSBS2afGV6+YIO7OYCIBV2bD6jeZT6uxIQNkmbM+SvFvAChW/Yr9kyqR7UM/VMAAAAZwNYTk6rlekVwSP97VvftjJeNe9VFfHqaQAAABIAAAABMEUCIQDAFHNG4Je0DWu9eIFQ+yDxoxA6enq+v2N4RrQRP9jr2gIgZ5x5q2+rsfUQyg7pHnymAUDkZmMgf16mxCs1r+zPf3MAAABmA1hTVFvJAcvr77A6VtReV+TzVtxNswq1AAAAEgAAAAEwRAIgR5ciJ4sT+teoChXJaQzAEamBnoLZE+JzTrrxpH1LVpsCIFoG7MzassTSvqZMgtf4ncw5+knAkTzQ7+eCpzhMEs2cAAAAZgNYR01TPvCYSy+qInrMYgxnzOEqo5zYzQAAAAgAAAABMEQCICkSMtAIIm6OeNmxybUaJHHP29XCaTQ6u+a5TTAHLnxXAiAbwN/Z2jEkT0uDSDAoO2bDDJiYXh1Zyx+FekjUpGT+KQAAAGYDWEdUMPSj4Kt6dnM9i2C4ndk8PQtMni8AAAASAAAAATBEAiAmBiq/Bd/fZZaotdxQS26IM3gCViwX0fzF4cEWB46AEgIgZMHpUag3o5GjoHljfdjbtv5LGZNHs6vW1n391SRULRsAAABmA1hJRLEQ7Hsdy4+rje2/KPU7xj6lvt2EAAAACAAAAAEwRAIgFgOeY6/D8B5eZD/+epmS0a6VH1WDC+LCeW7gdGB/ecECIGxiDEXgSF2BDTlc7UyC/acfkWcCtOrfVoCPBn2hzQsoAAAAaARYRENFQasbb8uy+p3O2BrL3sE+pjFfK/IAAAASAAAAATBFAiEAouTsNqmRxgc6GzL/z/gdoHOZ79fWnh9u9CivHsJXQvsCICiiyGQ6bNkyhV7TrEzc+HHVqgzHJJWvuRYDl5/F6s8RAAAAZgNYTVgPjEW4lnhKHkCFJrkwBRnvhmAgnAAAAAgAAAABMEQCIBEy0alqObOHujx0HnbgxPKMrAcNmof5+2p1uYnBdkaYAiBBwRDQGFlVKIOAhth/P4KrCxWVIRsnN0KoxoVcz4VQDQAAAGcEWE1DVEREn6TWB/gH0e1Kaa2UKXFyg5HIAAAAEgAAAAEwRAIgL1abogm3F9sEd7c9/SRyXmU5ehCTDZ2elTafm44fEd0CIDi56Ieh7b65KyI68t09ZQJT/794gco3cXh6EKOobBlJAAAAZQNYTlRXLm8xgFa6DF1HpCJlMROEPSUGkQAAAAAAAAABMEMCIDKS0IXlMWWRd2IXpQEiGzoa6OBVj75QfDjEy8SbwRDBAh87zg9VVtfwIDpUTQph/5n42BUcTs+/oZPBdQ4xdsw/AAAAZgNYT1YVPtnMG3kpedK94Lv0XMKn5Dal+QAAABIAAAABMEQCIDkn/51R0rr6YqMQ0wci1EQyR0lUL+nI6AOq7zah/7sTAiAcK5vX43JGYB0SkImyRYNoB7a6cSqyNrCUAA6oQs1QnQAAAGcDWFBBkFKK6zorc2t4D9G2xHi7fh1kMXAAAAASAAAAATBFAiEAnYeAeqOO0CL6e2GyUIzorVOC+9+CG5Za0BEZwRBQDn8CIHGNpmS0pNTl4FA9O0TcTYsOv86tKe98W0HQjlAeGT/UAAAAZwNYUkyyR1S+eSgVU9wa3BYN31zZt0NhpAAAAAkAAAABMEUCIQC0ftH1bsrGb8f046pHdFDWgztlTSWkhEzH+lSj0/joQgIgL2dUjgBH2GOCnA5XgZ0InNuBwY9yiBCgsyFb458kDpsAAABqB1hSUEJFQVKU/Fk0z1lw6USmfegG7rWktJPG5gAAABIAAAABMEQCICVehDbauZM/czDr29VVPDFCqoSVM2Pn7NP/eNMLZAevAiAyTPTRZBzS0F14kbJ9I/B8MA0mxMsMQWwhgEzi7/BKUAAAAGoHWFJQQlVMTCfBuk+FuNwcFQFXgWYjps6At/GHAAAAEgAAAAEwRAIgXoMiuZn1MtvDGyIACZlWXXC3VI7uNJfmjoVbZ4QSxfMCID+tWtrt5zOwYvA4IHUvKSBLjKmflcizQVRFOOoebX2wAAAAbAhYUlBIRURHRVW1TY+xZA0TIdUWRZDnsCC6Q97yAAAAEgAAAAEwRQIhAPWY+r5GGN0HlHsZhWc4ExIrC235vDUYc+DkAskdUXEJAiBQgyfrnYF3IhyinSd2qXtJAdR0ptwEoD0MnOLev+9PtQAAAGcDWFNDD1E/+0km/4LX9goFBpBHrKKVxBMAAAASAAAAATBFAiEA1jUdYfU75KhMaptQIoIEW9Bh6hrlJ8Rcg31mzhOa/wgCIAGSGlPED8dbuX/4JceKKJffv8YyVV1bibvHo1SSFDvlAAAAaARYU0dEcOjec85TjaK+7TXRQYf2lZqOypYAAAAGAAAAATBFAiEA6Gz/ZzRx2+TI+dxQdPQCHp1EfZuPTvEJPRGwNY29nssCIFdM3YMMJopSWAijcek5F8ZBOPw8T/91PR8TGmqG8fcCAAAAZgNYVFgYIhJv7ttMfWHuzb42gv5h6ROD1gAAABIAAAABMEQCIDT//DYiMYYOr0EWISYd/5JnwClYbQX8Gi8Hlp0Yo87mAiA1vzL5WM37qhFGBcjTa2GxFtASPPHjIhiodGh92V6K7wAAAGsHWFRaQkVBUrxB0FKHSY3sWBKVYN5r0bjU46wdAAAAEgAAAAEwRQIhAKBtvezII4sgHPoXZ16tlXIgrreJS8KQUgcxkLPOOVi5AiADhhybq2yKPBdND7EHUhnWNbs+9vH3l0tfAPPCEl0McQAAAGoHWFRaQlVMTIrxemOWyPMV9rbbxqpobIX5s+VUAAAAEgAAAAEwRAIgBosSSUl+ELRUsBjZMBRqIFr5cqhZq5HXhzAkgDo4iG4CIEkVKTHRjyEm7JxDcgoplWZDoXSavEtfU5mV7eMzh0ZbAAAAZgNYWU9VKW9p9A6m0g5HhTPBWmsItlTnWAAAABIAAAABMEQCIBRdWvf7YmCQsJmGX1/BEXDMpRUQNHzboUQAdV7QT+vnAiAcNh7g++hnvjT48pkY0KFiUovPtlg+RAM3+cUGF4l42AAAAGYDWU5OG8fB3grG70/ew1wFMDDZDPVMfpoAAAASAAAAATBEAiArXl5PXOCjmB0gzxJjCJb1J6i+jUUwmymTPWw3gxQTPgIgNYp5EeVWanyglBo7KQbvX/krq+/oCawL2Q5inS2PnF4AAABmA1lGSQvFKcAMZAGu9tIgvoxuoWZ/atk+AAAAEgAAAAEwRAIgNZ/hEP7bJOsGy7qVAXadz04ELEdeLV2eXrFP6GwfrVICICjQKn+GHx8eHPDjxqYb+T+r7Z9j+BKwuuSwUpVPmxmiAAAAZwR5REFJrNQ+Yn5kNV8YYc7G06ZoizGm+VIAAAASAAAAATBEAiAedOgB91Tl1hsWhvARRRE3AyrPvBNV/2ypqocXDnKXbAIgIMuuJZY+9gzXhKcUhhXIyP2n2S7W9DCQDb5C4GeFItoAAABnA1lFRZIhBfrYFT9Ra8+4KfVtwJeg4dcFAAAAEgAAAAEwRQIhAJCMc6FKG0gL+lndR6oHZCKNKEw0H29YZcEP1O+W2hHDAiADmJVm12Cr2uNk3zNWkUN20u69+xr5VfieNpMhDaT7SAAAAGoGWWYtREFJ9M09P9qNf9bFpQAgPjhkCnC/lXcAAAASAAAAATBFAiEAwmIrRO43QIkt16AEXqofHxIevcOzDLiLyWOpuXyltVoCIDHdV6FnRoND4jgaKRrrL4TMDnOKUrTnk7eQ/mVFDD7+AAAAZwRZRkkzCYQ7kTf8WTW384MhUvkHTbXS0e4AAAASAAAAATBEAiBu1GwmhkqPMMyUoQ1/gJQeRdRH9spzPW14dJlHrsZ4XwIgLPNzt6F5Bt4I+AFeuQOJ5n/rKAcPRErdyudgVC4Gf+gAAABoBFlGSUmh0OIVoj1wMIQvxnzlgqavo8yrgwAAABIAAAABMEUCIQCYZmJuCZWb7HuHPhBRMicS+5aLueFtqOaHct4m9iAY6gIgQEsXjb3srCQMDEWVSN9m2QvMQheUGZ976hZDTqT9YyEAAABmA1lGTCjLfoQe6XlHqGsG+kCQyEUfZMC+AAAAEgAAAAEwRAIgMDzWluKBWzZf96bcm1vEYjOxmzFIZFHfpFtvHHLet/0CIDg7YQogj5imkVLQ9V9zKgsRf3q5kntsg0ekvvBGyylcAAAAaAVZRlBSTw/cUxMzNTPMDADCJ5K/9zg9MFXyAAAAEgAAAAEwRAIgLzdAbBKALjItFdBd47tTfbsbDD/RhN4aRFkEFaXV4o8CIDh1j8KbUSEJ+oVX4HNnCW+5gfP+bdQxfJaCW3xpUJM+AAAAZwNZRlZF8kuu7yaLttY67lEpAV1pcCvN+gAAABIAAAABMEUCIQCHsxywQKtK4EqdKOwzuH5DTfQ2LUP3BXc8vGzKmM9HNgIgLJCcyoKgzWYHCBAd4i/Sr+yQE7KO48A/M3hoLK/j8C4AAABoBFlFRUTKJ5b59h3HsjiqsEOXHknGFk3zdQAAABIAAAABMEUCIQDIoBBoYfyFTENQ7IbD5E2TouDWodEwo/1Jp7nkWDpO4wIgR59TwlD496jDY8m3zEL5TxkmedKTSC52rWVyTpXHgXoAAABnA1lMRPlLXFZRyIjZKEOatlFLk5RO7m9IAAAAEgAAAAEwRQIhAI8c0or5CawDyVdCzxWV9SbvpsIzLUhkBrLytQHB4E7CAiA+n8ccylh7+oIItHv4X6V+wsyMXWRqB6WVxiYytKzGLwAAAGcDWUxEf5J/mEF3MjxKxJ5rHTmOQM0aePYAAAACAAAAATBFAiEAu+KGawYgRsL64Je29DxBNWDn4wuCAX+heQk2uwKG/7wCIFgQcEgVEMjIxAxYfyxS+N8OBmv9Qstjnj6Dtc9s4pUhAAAAaARZT1VDPTcUE91UifOgTAfAws42nCCYbOsAAAAKAAAAATBFAiEA0FlUwQ+/WJINshIy7efr9UyAA/WNGPTBXGt/PQEPMGICIFPD87NA0wbHes0enTSY4ruqRwoFlr5ilP+BtMgv6W3TAAAAaAVZT1lPV8vq7GmUMYV/2003rdu9wg4TLUkDAAAAEgAAAAEwRAIgUeWLxpV5bfmrXjKXwyeVkbCdZ6y8fkcXk7dVOdNJf+ECIAdgimHlXIQGskkXqf/st2q7DuG9jGY7GWI0LSGRdVyuAAAAZwNZVVDZoSzeA6hugASWRphY3oWB06U1PQAAABIAAAABMEUCIQCW9wZhU/YTKBKB7sDRgMPIDKk9//bRjMzrpIRWLbvqOAIgT6XUmg+MNMp9J12HwEVD7xL2+sySkcLxQzQWT//w0MgAAABpBVlVUElFDzO7IKKCp2Scezr/ZE8ISpNI6TMAAAASAAAAATBFAiEA/heX6zN3PuKhP8mf6EXlbCR+fQbqLu5v3RSYHOPQSH8CIBteuwnZKQN5imHsPU9udVExJnHBCEb4bn0RWvU2mxlhAAAAZwNaQVBngaD4TH6ehG3LhKmlvUkzMGexBAAAABIAAAABMEUCIQD389a+5ALkpEoaG1L/UIKZm7XHTLg+5eb1dAdqpN0FAgIgccTlWUMA32bRfV2ESv9V67g/tFFJrHi6YanhlUYqyNgAAABlAlpCvQeTMy6fuESlKiBaIz7yels0uScAAAASAAAAATBEAiAOGlVM7ZqFiYjqB4gQLiW4uoL5QC74zooGHrauqT94AAIgNI5NHcl6Cc5tpMX+vQ/uQqg3qm7ajoEZe/mChSC5XBEAAABnA1pDTyAI4wV71zThCtE8nq5F/xMqvBciAAAACAAAAAEwRQIhAOanqzQQtgfh00eZAxr27VOo4u+RcDZWSBCUbjPGl4MzAiBVuiaCeCac+Z7/QWBD48TJTMOxZMGIqepPjPp0FbyIFQAAAGcEWkVPTuW4JsosoC8JwXJem9mNmoh0wwUyAAAAEgAAAAEwRAIgQrXj6TBefZuTWxP/Z8IEGtkBUBw9sMujnYM+mWQZGb0CIBtE5MYhAmX+xWX5T3n+RLfCEO02W854A6ptr7UwQ+ySAAAAZwNaU1TjhrE57TcVyksY/VJnG9zqHN/ksQAAAAgAAAABMEUCIQCUlH8kz0JXiUDPH4afZbtOs4hub4PlRBOkdXCGmVAqbQIgLDcxvsHJurjVGjhz7C+Zre4+xjIPc6/jA1Bm3IADAfMAAABoBFpFVVPn5CebgNMZ7eKImFUTWiICG68JBwAAABIAAAABMEUCIQC/CvRHfKQr/ZVw5FxqOtucCBTV0vr0MfZKDDxLqKSJgwIgXriYekjskzXz95xPmjotxBps6FnmfL4S6A7oHBHcRI0AAABmA1pTQ3pB4FF6XspP28f766TUxHuf9txjAAAAEgAAAAEwRAIgITSU6OXj+q0IRYBJeP0AmzB1M6DakC650yVnSs7OlmQCICvZBFMn3oth0fZMCRaaSY4pKPhHEh+sXPw0alv596xYAAAAZgNaTEH9iXHV6OF0DOLQqECV/KTecp0MFgAAABIAAAABMEQCIDHWqa9hMuaKqINVTwQ1nPebMCrcpP4Q5wkz3OAPT6iMAiBZocjP5OOrn0g3671u0ZpBpg2FzVlKfZa1XWBspW0W+wAAAGcDWklMBfSkLiUfLVK47RXp/tqs/O8frScAAAAMAAAAATBFAiEAldmJSyiUY/nPy6w35FM4a/gyVkIiarVO+zYJ5gY6ArMCIHG+XMpjPLS+3uMbxwEqwQzdWYcSw2qwFaoSbCpeQFskAAAAaARaSU5DSqxGHIar+nHp0A2aLN6NdOThruoAAAASAAAAATBFAiEApdS5XEcA92mTzR3HwZXzv7u2TRUuntZ39LBvIGxeYosCIH3Uob6Wl3pgbQjt8W7g6aylkqIvIf4/0PESbve5y/ZxAAAAaARaSVBDjvm4mNtWPTxhdcLN385QJ8NjgPwAAAASAAAAATBFAiEAk5WOWYqn6Upl9ugQM9qJj1QbEZgLjeUq5It+d2Yah4ECIDGv3Kf3azi3fX6+TgLhm5WNsMZzn86a/Id+G2pmJmasAAAAZgNaSVCp0pJ9OgQwngCLavbi4oKuKVLn/QAAABIAAAABMEQCIFrjRUcJuQIHVFaoXl4H45H+xpAQR0dP59rE0cgeJD2LAiBG8XPhpPlZF5rul8kHGvwWjez1ABvs+YEgXt9p7083iQAAAGcEWklQVO3XyU/XtJcbkW0VBnvEVLnhutmAAAAAEgAAAAEwRAIgNOuACl6K9AErak4ESKFwufb/bHAs4/Eu4Kjp/I1k/XUCIFaie3Rflcx4LCtrOcei3nJjG1MhRKsXrOI7mg/WpRmcAAAAZwNaSVjzwJLKjNbT1MoATcHQ8f6MyrU1mQAAABIAAAABMEUCIQDaPa18TNzuG3er6ueYZ7+fqsgB61AujGp9mY7lf2GrGgIgdaenVAVDmm66j8iD3nVMDT0D9FkBfcsxboSJm4sHbcYAAABmA1pNTlVP/Hf0JRqfs8DjWQpqIF+NTgZ9AAAAEgAAAAEwRAIgBNoDZmnRsaMLwvFISOqVX6YtWCsFD24Fu8oTigpi4mECIEaEHYdrcAuBOSulIKxtwtDlQ8gOmKcvyKOVdoouFTAUAAAAZwNaT01COC8558nxrdX6XwxuJKpi9QvjswAAABIAAAABMEUCIQDtxpvGOA5UNQaqOyBU8xNdO7mDM5mfKzw4OOd6p6QLgwIgbQCzUaGwhxw35sUBS4QTaZ37JDEdLcrLmVvQJeDgS/kAAABmA1pQUrW49WFv5C1c7KPofz/dvdj0ltdgAAAAEgAAAAEwRAIgfTRx5+c6ESCaYbWHmpYlefaEw1bAGcapajyNu3ZC1FkCIHzVtJQueGZaYm1edXu1kKDwRkZ7Y4jGzQkMI1j3TQBBAAAAZwNaVFjo+fqXfqWFWR2fOUaBMYwWVSV3+wAAABIAAAABMEUCIQDEYO+C//tbzGktUtKQbZhIkBJq56P9LUEtkULUo5scJwIgJ2EGdNd865iwKc1M6i0oRPf6QvxpAfqz6T1ptX3X0IQAAABnA1pZTuZe58A7uzyVDP1IlcJJia+iM+8BAAAAEgAAAAEwRQIhALSjOlVZss9XUqte1JvUoFkMUuiBnYD0kkM1L9S0D25uAiAaTn4g9alAR97HoCg8UprvIu6GWCZ+ELhe3+7oWDVBGQ=="; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "abi/5.4.0"; + },{}],4:[function(require,module,exports){ -'use strict'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.defaultAbiCoder = exports.AbiCoder = void 0; +// See: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI +var bytes_1 = require("@ethersproject/bytes"); +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var abstract_coder_1 = require("./coders/abstract-coder"); +var address_1 = require("./coders/address"); +var array_1 = require("./coders/array"); +var boolean_1 = require("./coders/boolean"); +var bytes_2 = require("./coders/bytes"); +var fixed_bytes_1 = require("./coders/fixed-bytes"); +var null_1 = require("./coders/null"); +var number_1 = require("./coders/number"); +var string_1 = require("./coders/string"); +var tuple_1 = require("./coders/tuple"); +var fragments_1 = require("./fragments"); +var paramTypeBytes = new RegExp(/^bytes([0-9]*)$/); +var paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/); +var AbiCoder = /** @class */ (function () { + function AbiCoder(coerceFunc) { + var _newTarget = this.constructor; + logger.checkNew(_newTarget, AbiCoder); + properties_1.defineReadOnly(this, "coerceFunc", coerceFunc || null); + } + AbiCoder.prototype._getCoder = function (param) { + var _this = this; + switch (param.baseType) { + case "address": + return new address_1.AddressCoder(param.name); + case "bool": + return new boolean_1.BooleanCoder(param.name); + case "string": + return new string_1.StringCoder(param.name); + case "bytes": + return new bytes_2.BytesCoder(param.name); + case "array": + return new array_1.ArrayCoder(this._getCoder(param.arrayChildren), param.arrayLength, param.name); + case "tuple": + return new tuple_1.TupleCoder((param.components || []).map(function (component) { + return _this._getCoder(component); + }), param.name); + case "": + return new null_1.NullCoder(param.name); + } + // u?int[0-9]* + var match = param.type.match(paramTypeNumber); + if (match) { + var size = parseInt(match[2] || "256"); + if (size === 0 || size > 256 || (size % 8) !== 0) { + logger.throwArgumentError("invalid " + match[1] + " bit length", "param", param); + } + return new number_1.NumberCoder(size / 8, (match[1] === "int"), param.name); + } + // bytes[0-9]+ + match = param.type.match(paramTypeBytes); + if (match) { + var size = parseInt(match[1]); + if (size === 0 || size > 32) { + logger.throwArgumentError("invalid bytes length", "param", param); + } + return new fixed_bytes_1.FixedBytesCoder(size, param.name); + } + return logger.throwArgumentError("invalid type", "type", param.type); + }; + AbiCoder.prototype._getWordSize = function () { return 32; }; + AbiCoder.prototype._getReader = function (data, allowLoose) { + return new abstract_coder_1.Reader(data, this._getWordSize(), this.coerceFunc, allowLoose); + }; + AbiCoder.prototype._getWriter = function () { + return new abstract_coder_1.Writer(this._getWordSize()); + }; + AbiCoder.prototype.getDefaultValue = function (types) { + var _this = this; + var coders = types.map(function (type) { return _this._getCoder(fragments_1.ParamType.from(type)); }); + var coder = new tuple_1.TupleCoder(coders, "_"); + return coder.defaultValue(); + }; + AbiCoder.prototype.encode = function (types, values) { + var _this = this; + if (types.length !== values.length) { + logger.throwError("types/values length mismatch", logger_1.Logger.errors.INVALID_ARGUMENT, { + count: { types: types.length, values: values.length }, + value: { types: types, values: values } + }); + } + var coders = types.map(function (type) { return _this._getCoder(fragments_1.ParamType.from(type)); }); + var coder = (new tuple_1.TupleCoder(coders, "_")); + var writer = this._getWriter(); + coder.encode(writer, values); + return writer.data; + }; + AbiCoder.prototype.decode = function (types, data, loose) { + var _this = this; + var coders = types.map(function (type) { return _this._getCoder(fragments_1.ParamType.from(type)); }); + var coder = new tuple_1.TupleCoder(coders, "_"); + return coder.decode(this._getReader(bytes_1.arrayify(data), loose)); + }; + return AbiCoder; +}()); +exports.AbiCoder = AbiCoder; +exports.defaultAbiCoder = new AbiCoder(); -Object.defineProperty(exports, '__esModule', { value: true }); +},{"./_version":3,"./coders/abstract-coder":5,"./coders/address":6,"./coders/array":8,"./coders/boolean":9,"./coders/bytes":10,"./coders/fixed-bytes":11,"./coders/null":12,"./coders/number":13,"./coders/string":14,"./coders/tuple":15,"./fragments":16,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/properties":63}],5:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Reader = exports.Writer = exports.Coder = exports.checkResultErrors = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var bignumber_1 = require("@ethersproject/bignumber"); +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("../_version"); +var logger = new logger_1.Logger(_version_1.version); +function checkResultErrors(result) { + // Find the first error (if any) + var errors = []; + var checkErrors = function (path, object) { + if (!Array.isArray(object)) { + return; + } + for (var key in object) { + var childPath = path.slice(); + childPath.push(key); + try { + checkErrors(childPath, object[key]); + } + catch (error) { + errors.push({ path: childPath, error: error }); + } + } + }; + checkErrors([], result); + return errors; +} +exports.checkResultErrors = checkResultErrors; +var Coder = /** @class */ (function () { + function Coder(name, type, localName, dynamic) { + // @TODO: defineReadOnly these + this.name = name; + this.type = type; + this.localName = localName; + this.dynamic = dynamic; + } + Coder.prototype._throwError = function (message, value) { + logger.throwArgumentError(message, this.localName, value); + }; + return Coder; +}()); +exports.Coder = Coder; +var Writer = /** @class */ (function () { + function Writer(wordSize) { + properties_1.defineReadOnly(this, "wordSize", wordSize || 32); + this._data = []; + this._dataLength = 0; + this._padding = new Uint8Array(wordSize); + } + Object.defineProperty(Writer.prototype, "data", { + get: function () { + return bytes_1.hexConcat(this._data); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Writer.prototype, "length", { + get: function () { return this._dataLength; }, + enumerable: false, + configurable: true + }); + Writer.prototype._writeData = function (data) { + this._data.push(data); + this._dataLength += data.length; + return data.length; + }; + Writer.prototype.appendWriter = function (writer) { + return this._writeData(bytes_1.concat(writer._data)); + }; + // Arrayish items; padded on the right to wordSize + Writer.prototype.writeBytes = function (value) { + var bytes = bytes_1.arrayify(value); + var paddingOffset = bytes.length % this.wordSize; + if (paddingOffset) { + bytes = bytes_1.concat([bytes, this._padding.slice(paddingOffset)]); + } + return this._writeData(bytes); + }; + Writer.prototype._getValue = function (value) { + var bytes = bytes_1.arrayify(bignumber_1.BigNumber.from(value)); + if (bytes.length > this.wordSize) { + logger.throwError("value out-of-bounds", logger_1.Logger.errors.BUFFER_OVERRUN, { + length: this.wordSize, + offset: bytes.length + }); + } + if (bytes.length % this.wordSize) { + bytes = bytes_1.concat([this._padding.slice(bytes.length % this.wordSize), bytes]); + } + return bytes; + }; + // BigNumberish items; padded on the left to wordSize + Writer.prototype.writeValue = function (value) { + return this._writeData(this._getValue(value)); + }; + Writer.prototype.writeUpdatableValue = function () { + var _this = this; + var offset = this._data.length; + this._data.push(this._padding); + this._dataLength += this.wordSize; + return function (value) { + _this._data[offset] = _this._getValue(value); + }; + }; + return Writer; +}()); +exports.Writer = Writer; +var Reader = /** @class */ (function () { + function Reader(data, wordSize, coerceFunc, allowLoose) { + properties_1.defineReadOnly(this, "_data", bytes_1.arrayify(data)); + properties_1.defineReadOnly(this, "wordSize", wordSize || 32); + properties_1.defineReadOnly(this, "_coerceFunc", coerceFunc); + properties_1.defineReadOnly(this, "allowLoose", allowLoose); + this._offset = 0; + } + Object.defineProperty(Reader.prototype, "data", { + get: function () { return bytes_1.hexlify(this._data); }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Reader.prototype, "consumed", { + get: function () { return this._offset; }, + enumerable: false, + configurable: true + }); + // The default Coerce function + Reader.coerce = function (name, value) { + var match = name.match("^u?int([0-9]+)$"); + if (match && parseInt(match[1]) <= 48) { + value = value.toNumber(); + } + return value; + }; + Reader.prototype.coerce = function (name, value) { + if (this._coerceFunc) { + return this._coerceFunc(name, value); + } + return Reader.coerce(name, value); + }; + Reader.prototype._peekBytes = function (offset, length, loose) { + var alignedLength = Math.ceil(length / this.wordSize) * this.wordSize; + if (this._offset + alignedLength > this._data.length) { + if (this.allowLoose && loose && this._offset + length <= this._data.length) { + alignedLength = length; + } + else { + logger.throwError("data out-of-bounds", logger_1.Logger.errors.BUFFER_OVERRUN, { + length: this._data.length, + offset: this._offset + alignedLength + }); + } + } + return this._data.slice(this._offset, this._offset + alignedLength); + }; + Reader.prototype.subReader = function (offset) { + return new Reader(this._data.slice(this._offset + offset), this.wordSize, this._coerceFunc, this.allowLoose); + }; + Reader.prototype.readBytes = function (length, loose) { + var bytes = this._peekBytes(0, length, !!loose); + this._offset += bytes.length; + // @TODO: Make sure the length..end bytes are all 0? + return bytes.slice(0, length); + }; + Reader.prototype.readValue = function () { + return bignumber_1.BigNumber.from(this.readBytes(this.wordSize)); + }; + return Reader; +}()); +exports.Reader = Reader; -/* eslint-disable no-continue */ -/* eslint-disable no-unused-vars */ -/* eslint-disable no-param-reassign */ -/* eslint-disable no-prototype-builtins */ -var errorClasses = {}; -var deserializers = {}; -var addCustomErrorDeserializer = function (name, deserializer) { - deserializers[name] = deserializer; -}; -var createCustomErrorClass = function (name) { - var C = function CustomError(message, fields) { - Object.assign(this, fields); - this.name = name; - this.message = message || name; - this.stack = new Error().stack; - }; - C.prototype = new Error(); - errorClasses[name] = C; - return C; -}; -// inspired from https://github.com/programble/errio/blob/master/index.js -var deserializeError = function (object) { - if (typeof object === "object" && object) { - try { - // $FlowFixMe FIXME HACK - var msg = JSON.parse(object.message); - if (msg.message && msg.name) { - object = msg; - } - } - catch (e) { - // nothing - } - var error = void 0; - if (typeof object.name === "string") { - var name_1 = object.name; - var des = deserializers[name_1]; - if (des) { - error = des(object); - } - else { - var constructor = name_1 === "Error" ? Error : errorClasses[name_1]; - if (!constructor) { - console.warn("deserializing an unknown class '" + name_1 + "'"); - constructor = createCustomErrorClass(name_1); - } - error = Object.create(constructor.prototype); - try { - for (var prop in object) { - if (object.hasOwnProperty(prop)) { - error[prop] = object[prop]; - } - } - } - catch (e) { - // sometimes setting a property can fail (e.g. .name) - } - } - } - else { - error = new Error(object.message); - } - if (!error.stack && Error.captureStackTrace) { - Error.captureStackTrace(error, deserializeError); - } - return error; - } - return new Error(String(object)); -}; -// inspired from https://github.com/sindresorhus/serialize-error/blob/master/index.js -var serializeError = function (value) { - if (!value) - return value; - if (typeof value === "object") { - return destroyCircular(value, []); - } - if (typeof value === "function") { - return "[Function: " + (value.name || "anonymous") + "]"; - } - return value; -}; -// https://www.npmjs.com/package/destroy-circular -function destroyCircular(from, seen) { - var to = {}; - seen.push(from); - for (var _i = 0, _a = Object.keys(from); _i < _a.length; _i++) { - var key = _a[_i]; - var value = from[key]; - if (typeof value === "function") { - continue; - } - if (!value || typeof value !== "object") { - to[key] = value; - continue; - } - if (seen.indexOf(from[key]) === -1) { - to[key] = destroyCircular(from[key], seen.slice(0)); - continue; - } - to[key] = "[Circular]"; - } - if (typeof from.name === "string") { - to.name = from.name; - } - if (typeof from.message === "string") { - to.message = from.message; - } - if (typeof from.stack === "string") { - to.stack = from.stack; - } - return to; +},{"../_version":3,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/properties":63}],6:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AddressCoder = void 0; +var address_1 = require("@ethersproject/address"); +var bytes_1 = require("@ethersproject/bytes"); +var abstract_coder_1 = require("./abstract-coder"); +var AddressCoder = /** @class */ (function (_super) { + __extends(AddressCoder, _super); + function AddressCoder(localName) { + return _super.call(this, "address", "address", localName, false) || this; + } + AddressCoder.prototype.defaultValue = function () { + return "0x0000000000000000000000000000000000000000"; + }; + AddressCoder.prototype.encode = function (writer, value) { + try { + address_1.getAddress(value); + } + catch (error) { + this._throwError(error.message, value); + } + return writer.writeValue(value); + }; + AddressCoder.prototype.decode = function (reader) { + return address_1.getAddress(bytes_1.hexZeroPad(reader.readValue().toHexString(), 20)); + }; + return AddressCoder; +}(abstract_coder_1.Coder)); +exports.AddressCoder = AddressCoder; + +},{"./abstract-coder":5,"@ethersproject/address":24,"@ethersproject/bytes":33}],7:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AnonymousCoder = void 0; +var abstract_coder_1 = require("./abstract-coder"); +// Clones the functionality of an existing Coder, but without a localName +var AnonymousCoder = /** @class */ (function (_super) { + __extends(AnonymousCoder, _super); + function AnonymousCoder(coder) { + var _this = _super.call(this, coder.name, coder.type, undefined, coder.dynamic) || this; + _this.coder = coder; + return _this; + } + AnonymousCoder.prototype.defaultValue = function () { + return this.coder.defaultValue(); + }; + AnonymousCoder.prototype.encode = function (writer, value) { + return this.coder.encode(writer, value); + }; + AnonymousCoder.prototype.decode = function (reader) { + return this.coder.decode(reader); + }; + return AnonymousCoder; +}(abstract_coder_1.Coder)); +exports.AnonymousCoder = AnonymousCoder; + +},{"./abstract-coder":5}],8:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ArrayCoder = exports.unpack = exports.pack = void 0; +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("../_version"); +var logger = new logger_1.Logger(_version_1.version); +var abstract_coder_1 = require("./abstract-coder"); +var anonymous_1 = require("./anonymous"); +function pack(writer, coders, values) { + var arrayValues = null; + if (Array.isArray(values)) { + arrayValues = values; + } + else if (values && typeof (values) === "object") { + var unique_1 = {}; + arrayValues = coders.map(function (coder) { + var name = coder.localName; + if (!name) { + logger.throwError("cannot encode object for signature with missing names", logger_1.Logger.errors.INVALID_ARGUMENT, { + argument: "values", + coder: coder, + value: values + }); + } + if (unique_1[name]) { + logger.throwError("cannot encode object for signature with duplicate names", logger_1.Logger.errors.INVALID_ARGUMENT, { + argument: "values", + coder: coder, + value: values + }); + } + unique_1[name] = true; + return values[name]; + }); + } + else { + logger.throwArgumentError("invalid tuple value", "tuple", values); + } + if (coders.length !== arrayValues.length) { + logger.throwArgumentError("types/value length mismatch", "tuple", values); + } + var staticWriter = new abstract_coder_1.Writer(writer.wordSize); + var dynamicWriter = new abstract_coder_1.Writer(writer.wordSize); + var updateFuncs = []; + coders.forEach(function (coder, index) { + var value = arrayValues[index]; + if (coder.dynamic) { + // Get current dynamic offset (for the future pointer) + var dynamicOffset_1 = dynamicWriter.length; + // Encode the dynamic value into the dynamicWriter + coder.encode(dynamicWriter, value); + // Prepare to populate the correct offset once we are done + var updateFunc_1 = staticWriter.writeUpdatableValue(); + updateFuncs.push(function (baseOffset) { + updateFunc_1(baseOffset + dynamicOffset_1); + }); + } + else { + coder.encode(staticWriter, value); + } + }); + // Backfill all the dynamic offsets, now that we know the static length + updateFuncs.forEach(function (func) { func(staticWriter.length); }); + var length = writer.appendWriter(staticWriter); + length += writer.appendWriter(dynamicWriter); + return length; +} +exports.pack = pack; +function unpack(reader, coders) { + var values = []; + // A reader anchored to this base + var baseReader = reader.subReader(0); + coders.forEach(function (coder) { + var value = null; + if (coder.dynamic) { + var offset = reader.readValue(); + var offsetReader = baseReader.subReader(offset.toNumber()); + try { + value = coder.decode(offsetReader); + } + catch (error) { + // Cannot recover from this + if (error.code === logger_1.Logger.errors.BUFFER_OVERRUN) { + throw error; + } + value = error; + value.baseType = coder.name; + value.name = coder.localName; + value.type = coder.type; + } + } + else { + try { + value = coder.decode(reader); + } + catch (error) { + // Cannot recover from this + if (error.code === logger_1.Logger.errors.BUFFER_OVERRUN) { + throw error; + } + value = error; + value.baseType = coder.name; + value.name = coder.localName; + value.type = coder.type; + } + } + if (value != undefined) { + values.push(value); + } + }); + // We only output named properties for uniquely named coders + var uniqueNames = coders.reduce(function (accum, coder) { + var name = coder.localName; + if (name) { + if (!accum[name]) { + accum[name] = 0; + } + accum[name]++; + } + return accum; + }, {}); + // Add any named parameters (i.e. tuples) + coders.forEach(function (coder, index) { + var name = coder.localName; + if (!name || uniqueNames[name] !== 1) { + return; + } + if (name === "length") { + name = "_length"; + } + if (values[name] != null) { + return; + } + var value = values[index]; + if (value instanceof Error) { + Object.defineProperty(values, name, { + get: function () { throw value; } + }); + } + else { + values[name] = value; + } + }); + var _loop_1 = function (i) { + var value = values[i]; + if (value instanceof Error) { + Object.defineProperty(values, i, { + get: function () { throw value; } + }); + } + }; + for (var i = 0; i < values.length; i++) { + _loop_1(i); + } + return Object.freeze(values); } +exports.unpack = unpack; +var ArrayCoder = /** @class */ (function (_super) { + __extends(ArrayCoder, _super); + function ArrayCoder(coder, length, localName) { + var _this = this; + var type = (coder.type + "[" + (length >= 0 ? length : "") + "]"); + var dynamic = (length === -1 || coder.dynamic); + _this = _super.call(this, "array", type, localName, dynamic) || this; + _this.coder = coder; + _this.length = length; + return _this; + } + ArrayCoder.prototype.defaultValue = function () { + // Verifies the child coder is valid (even if the array is dynamic or 0-length) + var defaultChild = this.coder.defaultValue(); + var result = []; + for (var i = 0; i < this.length; i++) { + result.push(defaultChild); + } + return result; + }; + ArrayCoder.prototype.encode = function (writer, value) { + if (!Array.isArray(value)) { + this._throwError("expected array value", value); + } + var count = this.length; + if (count === -1) { + count = value.length; + writer.writeValue(value.length); + } + logger.checkArgumentCount(value.length, count, "coder array" + (this.localName ? (" " + this.localName) : "")); + var coders = []; + for (var i = 0; i < value.length; i++) { + coders.push(this.coder); + } + return pack(writer, coders, value); + }; + ArrayCoder.prototype.decode = function (reader) { + var count = this.length; + if (count === -1) { + count = reader.readValue().toNumber(); + // Check that there is *roughly* enough data to ensure + // stray random data is not being read as a length. Each + // slot requires at least 32 bytes for their value (or 32 + // bytes as a link to the data). This could use a much + // tighter bound, but we are erroring on the side of safety. + if (count * 32 > reader._data.length) { + logger.throwError("insufficient data length", logger_1.Logger.errors.BUFFER_OVERRUN, { + length: reader._data.length, + count: count + }); + } + } + var coders = []; + for (var i = 0; i < count; i++) { + coders.push(new anonymous_1.AnonymousCoder(this.coder)); + } + return reader.coerce(this.name, unpack(reader, coders)); + }; + return ArrayCoder; +}(abstract_coder_1.Coder)); +exports.ArrayCoder = ArrayCoder; -var AccountNameRequiredError = createCustomErrorClass("AccountNameRequired"); -var AccountNotSupported = createCustomErrorClass("AccountNotSupported"); -var AmountRequired = createCustomErrorClass("AmountRequired"); -var BluetoothRequired = createCustomErrorClass("BluetoothRequired"); -var BtcUnmatchedApp = createCustomErrorClass("BtcUnmatchedApp"); -var CantOpenDevice = createCustomErrorClass("CantOpenDevice"); -var CashAddrNotSupported = createCustomErrorClass("CashAddrNotSupported"); -var CurrencyNotSupported = createCustomErrorClass("CurrencyNotSupported"); -var DeviceAppVerifyNotSupported = createCustomErrorClass("DeviceAppVerifyNotSupported"); -var DeviceGenuineSocketEarlyClose = createCustomErrorClass("DeviceGenuineSocketEarlyClose"); -var DeviceNotGenuineError = createCustomErrorClass("DeviceNotGenuine"); -var DeviceOnDashboardExpected = createCustomErrorClass("DeviceOnDashboardExpected"); -var DeviceOnDashboardUnexpected = createCustomErrorClass("DeviceOnDashboardUnexpected"); -var DeviceInOSUExpected = createCustomErrorClass("DeviceInOSUExpected"); -var DeviceHalted = createCustomErrorClass("DeviceHalted"); -var DeviceNameInvalid = createCustomErrorClass("DeviceNameInvalid"); -var DeviceSocketFail = createCustomErrorClass("DeviceSocketFail"); -var DeviceSocketNoBulkStatus = createCustomErrorClass("DeviceSocketNoBulkStatus"); -var DisconnectedDevice = createCustomErrorClass("DisconnectedDevice"); -var DisconnectedDeviceDuringOperation = createCustomErrorClass("DisconnectedDeviceDuringOperation"); -var EnpointConfigError = createCustomErrorClass("EnpointConfig"); -var EthAppPleaseEnableContractData = createCustomErrorClass("EthAppPleaseEnableContractData"); -var FeeEstimationFailed = createCustomErrorClass("FeeEstimationFailed"); -var FirmwareNotRecognized = createCustomErrorClass("FirmwareNotRecognized"); -var HardResetFail = createCustomErrorClass("HardResetFail"); -var InvalidXRPTag = createCustomErrorClass("InvalidXRPTag"); -var InvalidAddress = createCustomErrorClass("InvalidAddress"); -var InvalidAddressBecauseDestinationIsAlsoSource = createCustomErrorClass("InvalidAddressBecauseDestinationIsAlsoSource"); -var LatestMCUInstalledError = createCustomErrorClass("LatestMCUInstalledError"); -var UnknownMCU = createCustomErrorClass("UnknownMCU"); -var LedgerAPIError = createCustomErrorClass("LedgerAPIError"); -var LedgerAPIErrorWithMessage = createCustomErrorClass("LedgerAPIErrorWithMessage"); -var LedgerAPINotAvailable = createCustomErrorClass("LedgerAPINotAvailable"); -var ManagerAppAlreadyInstalledError = createCustomErrorClass("ManagerAppAlreadyInstalled"); -var ManagerAppRelyOnBTCError = createCustomErrorClass("ManagerAppRelyOnBTC"); -var ManagerAppDepInstallRequired = createCustomErrorClass("ManagerAppDepInstallRequired"); -var ManagerAppDepUninstallRequired = createCustomErrorClass("ManagerAppDepUninstallRequired"); -var ManagerDeviceLockedError = createCustomErrorClass("ManagerDeviceLocked"); -var ManagerFirmwareNotEnoughSpaceError = createCustomErrorClass("ManagerFirmwareNotEnoughSpace"); -var ManagerNotEnoughSpaceError = createCustomErrorClass("ManagerNotEnoughSpace"); -var ManagerUninstallBTCDep = createCustomErrorClass("ManagerUninstallBTCDep"); -var NetworkDown = createCustomErrorClass("NetworkDown"); -var NoAddressesFound = createCustomErrorClass("NoAddressesFound"); -var NotEnoughBalance = createCustomErrorClass("NotEnoughBalance"); -var NotEnoughBalanceToDelegate = createCustomErrorClass("NotEnoughBalanceToDelegate"); -var NotEnoughBalanceInParentAccount = createCustomErrorClass("NotEnoughBalanceInParentAccount"); -var NotEnoughSpendableBalance = createCustomErrorClass("NotEnoughSpendableBalance"); -var NotEnoughBalanceBecauseDestinationNotCreated = createCustomErrorClass("NotEnoughBalanceBecauseDestinationNotCreated"); -var NoAccessToCamera = createCustomErrorClass("NoAccessToCamera"); -var NotEnoughGas = createCustomErrorClass("NotEnoughGas"); -var NotSupportedLegacyAddress = createCustomErrorClass("NotSupportedLegacyAddress"); -var GasLessThanEstimate = createCustomErrorClass("GasLessThanEstimate"); -var PasswordsDontMatchError = createCustomErrorClass("PasswordsDontMatch"); -var PasswordIncorrectError = createCustomErrorClass("PasswordIncorrect"); -var RecommendSubAccountsToEmpty = createCustomErrorClass("RecommendSubAccountsToEmpty"); -var RecommendUndelegation = createCustomErrorClass("RecommendUndelegation"); -var TimeoutTagged = createCustomErrorClass("TimeoutTagged"); -var UnexpectedBootloader = createCustomErrorClass("UnexpectedBootloader"); -var MCUNotGenuineToDashboard = createCustomErrorClass("MCUNotGenuineToDashboard"); -var RecipientRequired = createCustomErrorClass("RecipientRequired"); -var UnavailableTezosOriginatedAccountReceive = createCustomErrorClass("UnavailableTezosOriginatedAccountReceive"); -var UnavailableTezosOriginatedAccountSend = createCustomErrorClass("UnavailableTezosOriginatedAccountSend"); -var UpdateFetchFileFail = createCustomErrorClass("UpdateFetchFileFail"); -var UpdateIncorrectHash = createCustomErrorClass("UpdateIncorrectHash"); -var UpdateIncorrectSig = createCustomErrorClass("UpdateIncorrectSig"); -var UpdateYourApp = createCustomErrorClass("UpdateYourApp"); -var UserRefusedDeviceNameChange = createCustomErrorClass("UserRefusedDeviceNameChange"); -var UserRefusedAddress = createCustomErrorClass("UserRefusedAddress"); -var UserRefusedFirmwareUpdate = createCustomErrorClass("UserRefusedFirmwareUpdate"); -var UserRefusedAllowManager = createCustomErrorClass("UserRefusedAllowManager"); -var UserRefusedOnDevice = createCustomErrorClass("UserRefusedOnDevice"); // TODO rename because it's just for transaction refusal -var TransportOpenUserCancelled = createCustomErrorClass("TransportOpenUserCancelled"); -var TransportInterfaceNotAvailable = createCustomErrorClass("TransportInterfaceNotAvailable"); -var TransportRaceCondition = createCustomErrorClass("TransportRaceCondition"); -var TransportWebUSBGestureRequired = createCustomErrorClass("TransportWebUSBGestureRequired"); -var DeviceShouldStayInApp = createCustomErrorClass("DeviceShouldStayInApp"); -var WebsocketConnectionError = createCustomErrorClass("WebsocketConnectionError"); -var WebsocketConnectionFailed = createCustomErrorClass("WebsocketConnectionFailed"); -var WrongDeviceForAccount = createCustomErrorClass("WrongDeviceForAccount"); -var WrongAppForCurrency = createCustomErrorClass("WrongAppForCurrency"); -var ETHAddressNonEIP = createCustomErrorClass("ETHAddressNonEIP"); -var CantScanQRCode = createCustomErrorClass("CantScanQRCode"); -var FeeNotLoaded = createCustomErrorClass("FeeNotLoaded"); -var FeeRequired = createCustomErrorClass("FeeRequired"); -var FeeTooHigh = createCustomErrorClass("FeeTooHigh"); -var SyncError = createCustomErrorClass("SyncError"); -var PairingFailed = createCustomErrorClass("PairingFailed"); -var GenuineCheckFailed = createCustomErrorClass("GenuineCheckFailed"); -var LedgerAPI4xx = createCustomErrorClass("LedgerAPI4xx"); -var LedgerAPI5xx = createCustomErrorClass("LedgerAPI5xx"); -var FirmwareOrAppUpdateRequired = createCustomErrorClass("FirmwareOrAppUpdateRequired"); -// db stuff, no need to translate -var NoDBPathGiven = createCustomErrorClass("NoDBPathGiven"); -var DBWrongPassword = createCustomErrorClass("DBWrongPassword"); -var DBNotReset = createCustomErrorClass("DBNotReset"); -/** - * TransportError is used for any generic transport errors. - * e.g. Error thrown when data received by exchanges are incorrect or if exchanged failed to communicate with the device for various reason. - */ -function TransportError(message, id) { - this.name = "TransportError"; - this.message = message; - this.stack = new Error().stack; - this.id = id; -} -TransportError.prototype = new Error(); -addCustomErrorDeserializer("TransportError", function (e) { return new TransportError(e.message, e.id); }); -var StatusCodes = { - PIN_REMAINING_ATTEMPTS: 0x63c0, - INCORRECT_LENGTH: 0x6700, - MISSING_CRITICAL_PARAMETER: 0x6800, - COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 0x6981, - SECURITY_STATUS_NOT_SATISFIED: 0x6982, - CONDITIONS_OF_USE_NOT_SATISFIED: 0x6985, - INCORRECT_DATA: 0x6a80, - NOT_ENOUGH_MEMORY_SPACE: 0x6a84, - REFERENCED_DATA_NOT_FOUND: 0x6a88, - FILE_ALREADY_EXISTS: 0x6a89, - INCORRECT_P1_P2: 0x6b00, - INS_NOT_SUPPORTED: 0x6d00, - CLA_NOT_SUPPORTED: 0x6e00, - TECHNICAL_PROBLEM: 0x6f00, - OK: 0x9000, - MEMORY_PROBLEM: 0x9240, - NO_EF_SELECTED: 0x9400, - INVALID_OFFSET: 0x9402, - FILE_NOT_FOUND: 0x9404, - INCONSISTENT_FILE: 0x9408, - ALGORITHM_NOT_SUPPORTED: 0x9484, - INVALID_KCV: 0x9485, - CODE_NOT_INITIALIZED: 0x9802, - ACCESS_CONDITION_NOT_FULFILLED: 0x9804, - CONTRADICTION_SECRET_CODE_STATUS: 0x9808, - CONTRADICTION_INVALIDATION: 0x9810, - CODE_BLOCKED: 0x9840, - MAX_VALUE_REACHED: 0x9850, - GP_AUTH_FAILED: 0x6300, - LICENSING: 0x6f42, - HALTED: 0x6faa, -}; -function getAltStatusMessage(code) { - switch (code) { - // improve text of most common errors - case 0x6700: - return "Incorrect length"; - case 0x6800: - return "Missing critical parameter"; - case 0x6982: - return "Security not satisfied (dongle locked or have invalid access rights)"; - case 0x6985: - return "Condition of use not satisfied (denied by the user?)"; - case 0x6a80: - return "Invalid data received"; - case 0x6b00: - return "Invalid parameter received"; - } - if (0x6f00 <= code && code <= 0x6fff) { - return "Internal error, please report"; - } -} -/** - * Error thrown when a device returned a non success status. - * the error.statusCode is one of the `StatusCodes` exported by this library. - */ -function TransportStatusError(statusCode) { - this.name = "TransportStatusError"; - var statusText = Object.keys(StatusCodes).find(function (k) { return StatusCodes[k] === statusCode; }) || - "UNKNOWN_ERROR"; - var smsg = getAltStatusMessage(statusCode) || statusText; - var statusCodeStr = statusCode.toString(16); - this.message = "Ledger device: " + smsg + " (0x" + statusCodeStr + ")"; - this.stack = new Error().stack; - this.statusCode = statusCode; - this.statusText = statusText; -} -TransportStatusError.prototype = new Error(); -addCustomErrorDeserializer("TransportStatusError", function (e) { return new TransportStatusError(e.statusCode); }); +},{"../_version":3,"./abstract-coder":5,"./anonymous":7,"@ethersproject/logger":57}],9:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BooleanCoder = void 0; +var abstract_coder_1 = require("./abstract-coder"); +var BooleanCoder = /** @class */ (function (_super) { + __extends(BooleanCoder, _super); + function BooleanCoder(localName) { + return _super.call(this, "bool", "bool", localName, false) || this; + } + BooleanCoder.prototype.defaultValue = function () { + return false; + }; + BooleanCoder.prototype.encode = function (writer, value) { + return writer.writeValue(value ? 1 : 0); + }; + BooleanCoder.prototype.decode = function (reader) { + return reader.coerce(this.type, !reader.readValue().isZero()); + }; + return BooleanCoder; +}(abstract_coder_1.Coder)); +exports.BooleanCoder = BooleanCoder; -exports.AccountNameRequiredError = AccountNameRequiredError; -exports.AccountNotSupported = AccountNotSupported; -exports.AmountRequired = AmountRequired; -exports.BluetoothRequired = BluetoothRequired; -exports.BtcUnmatchedApp = BtcUnmatchedApp; -exports.CantOpenDevice = CantOpenDevice; -exports.CantScanQRCode = CantScanQRCode; -exports.CashAddrNotSupported = CashAddrNotSupported; -exports.CurrencyNotSupported = CurrencyNotSupported; -exports.DBNotReset = DBNotReset; -exports.DBWrongPassword = DBWrongPassword; -exports.DeviceAppVerifyNotSupported = DeviceAppVerifyNotSupported; -exports.DeviceGenuineSocketEarlyClose = DeviceGenuineSocketEarlyClose; -exports.DeviceHalted = DeviceHalted; -exports.DeviceInOSUExpected = DeviceInOSUExpected; -exports.DeviceNameInvalid = DeviceNameInvalid; -exports.DeviceNotGenuineError = DeviceNotGenuineError; -exports.DeviceOnDashboardExpected = DeviceOnDashboardExpected; -exports.DeviceOnDashboardUnexpected = DeviceOnDashboardUnexpected; -exports.DeviceShouldStayInApp = DeviceShouldStayInApp; -exports.DeviceSocketFail = DeviceSocketFail; -exports.DeviceSocketNoBulkStatus = DeviceSocketNoBulkStatus; -exports.DisconnectedDevice = DisconnectedDevice; -exports.DisconnectedDeviceDuringOperation = DisconnectedDeviceDuringOperation; -exports.ETHAddressNonEIP = ETHAddressNonEIP; -exports.EnpointConfigError = EnpointConfigError; -exports.EthAppPleaseEnableContractData = EthAppPleaseEnableContractData; -exports.FeeEstimationFailed = FeeEstimationFailed; -exports.FeeNotLoaded = FeeNotLoaded; -exports.FeeRequired = FeeRequired; -exports.FeeTooHigh = FeeTooHigh; -exports.FirmwareNotRecognized = FirmwareNotRecognized; -exports.FirmwareOrAppUpdateRequired = FirmwareOrAppUpdateRequired; -exports.GasLessThanEstimate = GasLessThanEstimate; -exports.GenuineCheckFailed = GenuineCheckFailed; -exports.HardResetFail = HardResetFail; -exports.InvalidAddress = InvalidAddress; -exports.InvalidAddressBecauseDestinationIsAlsoSource = InvalidAddressBecauseDestinationIsAlsoSource; -exports.InvalidXRPTag = InvalidXRPTag; -exports.LatestMCUInstalledError = LatestMCUInstalledError; -exports.LedgerAPI4xx = LedgerAPI4xx; -exports.LedgerAPI5xx = LedgerAPI5xx; -exports.LedgerAPIError = LedgerAPIError; -exports.LedgerAPIErrorWithMessage = LedgerAPIErrorWithMessage; -exports.LedgerAPINotAvailable = LedgerAPINotAvailable; -exports.MCUNotGenuineToDashboard = MCUNotGenuineToDashboard; -exports.ManagerAppAlreadyInstalledError = ManagerAppAlreadyInstalledError; -exports.ManagerAppDepInstallRequired = ManagerAppDepInstallRequired; -exports.ManagerAppDepUninstallRequired = ManagerAppDepUninstallRequired; -exports.ManagerAppRelyOnBTCError = ManagerAppRelyOnBTCError; -exports.ManagerDeviceLockedError = ManagerDeviceLockedError; -exports.ManagerFirmwareNotEnoughSpaceError = ManagerFirmwareNotEnoughSpaceError; -exports.ManagerNotEnoughSpaceError = ManagerNotEnoughSpaceError; -exports.ManagerUninstallBTCDep = ManagerUninstallBTCDep; -exports.NetworkDown = NetworkDown; -exports.NoAccessToCamera = NoAccessToCamera; -exports.NoAddressesFound = NoAddressesFound; -exports.NoDBPathGiven = NoDBPathGiven; -exports.NotEnoughBalance = NotEnoughBalance; -exports.NotEnoughBalanceBecauseDestinationNotCreated = NotEnoughBalanceBecauseDestinationNotCreated; -exports.NotEnoughBalanceInParentAccount = NotEnoughBalanceInParentAccount; -exports.NotEnoughBalanceToDelegate = NotEnoughBalanceToDelegate; -exports.NotEnoughGas = NotEnoughGas; -exports.NotEnoughSpendableBalance = NotEnoughSpendableBalance; -exports.NotSupportedLegacyAddress = NotSupportedLegacyAddress; -exports.PairingFailed = PairingFailed; -exports.PasswordIncorrectError = PasswordIncorrectError; -exports.PasswordsDontMatchError = PasswordsDontMatchError; -exports.RecipientRequired = RecipientRequired; -exports.RecommendSubAccountsToEmpty = RecommendSubAccountsToEmpty; -exports.RecommendUndelegation = RecommendUndelegation; -exports.StatusCodes = StatusCodes; -exports.SyncError = SyncError; -exports.TimeoutTagged = TimeoutTagged; -exports.TransportError = TransportError; -exports.TransportInterfaceNotAvailable = TransportInterfaceNotAvailable; -exports.TransportOpenUserCancelled = TransportOpenUserCancelled; -exports.TransportRaceCondition = TransportRaceCondition; -exports.TransportStatusError = TransportStatusError; -exports.TransportWebUSBGestureRequired = TransportWebUSBGestureRequired; -exports.UnavailableTezosOriginatedAccountReceive = UnavailableTezosOriginatedAccountReceive; -exports.UnavailableTezosOriginatedAccountSend = UnavailableTezosOriginatedAccountSend; -exports.UnexpectedBootloader = UnexpectedBootloader; -exports.UnknownMCU = UnknownMCU; -exports.UpdateFetchFileFail = UpdateFetchFileFail; -exports.UpdateIncorrectHash = UpdateIncorrectHash; -exports.UpdateIncorrectSig = UpdateIncorrectSig; -exports.UpdateYourApp = UpdateYourApp; -exports.UserRefusedAddress = UserRefusedAddress; -exports.UserRefusedAllowManager = UserRefusedAllowManager; -exports.UserRefusedDeviceNameChange = UserRefusedDeviceNameChange; -exports.UserRefusedFirmwareUpdate = UserRefusedFirmwareUpdate; -exports.UserRefusedOnDevice = UserRefusedOnDevice; -exports.WebsocketConnectionError = WebsocketConnectionError; -exports.WebsocketConnectionFailed = WebsocketConnectionFailed; -exports.WrongAppForCurrency = WrongAppForCurrency; -exports.WrongDeviceForAccount = WrongDeviceForAccount; -exports.addCustomErrorDeserializer = addCustomErrorDeserializer; -exports.createCustomErrorClass = createCustomErrorClass; -exports.deserializeError = deserializeError; -exports.getAltStatusMessage = getAltStatusMessage; -exports.serializeError = serializeError; - -},{}],5:[function(require,module,exports){ -module.exports = require("./lib/erc20"); - -},{"./lib/erc20":7}],6:[function(require,module,exports){ -(function (Buffer){ +},{"./abstract-coder":5}],10:[function(require,module,exports){ "use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BytesCoder = exports.DynamicBytesCoder = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var abstract_coder_1 = require("./abstract-coder"); +var DynamicBytesCoder = /** @class */ (function (_super) { + __extends(DynamicBytesCoder, _super); + function DynamicBytesCoder(type, localName) { + return _super.call(this, type, type, localName, true) || this; + } + DynamicBytesCoder.prototype.defaultValue = function () { + return "0x"; + }; + DynamicBytesCoder.prototype.encode = function (writer, value) { + value = bytes_1.arrayify(value); + var length = writer.writeValue(value.length); + length += writer.writeBytes(value); + return length; + }; + DynamicBytesCoder.prototype.decode = function (reader) { + return reader.readBytes(reader.readValue().toNumber(), true); + }; + return DynamicBytesCoder; +}(abstract_coder_1.Coder)); +exports.DynamicBytesCoder = DynamicBytesCoder; +var BytesCoder = /** @class */ (function (_super) { + __extends(BytesCoder, _super); + function BytesCoder(localName) { + return _super.call(this, "bytes", localName) || this; + } + BytesCoder.prototype.decode = function (reader) { + return reader.coerce(this.name, bytes_1.hexlify(_super.prototype.decode.call(this, reader))); + }; + return BytesCoder; +}(DynamicBytesCoder)); +exports.BytesCoder = BytesCoder; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _utils = require("./utils"); - -var _errors = require("@ledgerhq/errors"); - -var _bignumber = require("bignumber.js"); - -var _rlp = require("rlp"); - -/******************************************************************************** - * Ledger Node JS API - * (c) 2016-2017 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ********************************************************************************/ -// FIXME drop: -const starkQuantizationTypeMap = { - eth: 1, - erc20: 2, - erc721: 3, - erc20mintable: 4, - erc721mintable: 5 -}; - -function hexBuffer(str) { - return Buffer.from(str.startsWith("0x") ? str.slice(2) : str, "hex"); -} - -function maybeHexBuffer(str) { - if (!str) return null; - return hexBuffer(str); -} - -const remapTransactionRelatedErrors = e => { - if (e && e.statusCode === 0x6a80) { - return new _errors.EthAppPleaseEnableContractData("Please enable Contract data on the Ethereum app Settings"); - } - - return e; -}; -/** - * Ethereum API - * - * @example - * import Eth from "@ledgerhq/hw-app-eth"; - * const eth = new Eth(transport) - */ - - -class Eth { - constructor(transport, scrambleKey = "w0w") { - this.transport = void 0; - this.transport = transport; - transport.decorateAppAPIMethods(this, ["getAddress", "provideERC20TokenInformation", "signTransaction", "signPersonalMessage", "getAppConfiguration", "signEIP712HashedMessage", "starkGetPublicKey", "starkSignOrder", "starkSignOrder_v2", "starkSignTransfer", "starkSignTransfer_v2", "starkProvideQuantum", "starkProvideQuantum_v2", "starkUnsafeSign", "eth2GetPublicKey", "eth2SetWithdrawalIndex"], scrambleKey); - } - /** - * get Ethereum address for a given BIP 32 path. - * @param path a path in BIP 32 format - * @option boolDisplay optionally enable or not the display - * @option boolChaincode optionally enable or not the chaincode request - * @return an object with a publicKey, address and (optionally) chainCode - * @example - * eth.getAddress("44'/60'/0'/0/0").then(o => o.address) - */ - - - getAddress(path, boolDisplay, boolChaincode) { - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4); - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - return this.transport.send(0xe0, 0x02, boolDisplay ? 0x01 : 0x00, boolChaincode ? 0x01 : 0x00, buffer).then(response => { - let result = {}; - let publicKeyLength = response[0]; - let addressLength = response[1 + publicKeyLength]; - result.publicKey = response.slice(1, 1 + publicKeyLength).toString("hex"); - result.address = "0x" + response.slice(1 + publicKeyLength + 1, 1 + publicKeyLength + 1 + addressLength).toString("ascii"); - - if (boolChaincode) { - result.chainCode = response.slice(1 + publicKeyLength + 1 + addressLength, 1 + publicKeyLength + 1 + addressLength + 32).toString("hex"); - } - - return result; - }); - } - /** - * This commands provides a trusted description of an ERC 20 token - * to associate a contract address with a ticker and number of decimals. - * - * It shall be run immediately before performing a transaction involving a contract - * calling this contract address to display the proper token information to the user if necessary. - * - * @param {*} info: a blob from "erc20.js" utilities that contains all token information. - * - * @example - * import { byContractAddress } from "@ledgerhq/hw-app-eth/erc20" - * const zrxInfo = byContractAddress("0xe41d2489571d322189246dafa5ebde1f4699f498") - * if (zrxInfo) await appEth.provideERC20TokenInformation(zrxInfo) - * const signed = await appEth.signTransaction(path, rawTxHex) - */ - - - provideERC20TokenInformation({ - data - }) { - return this.transport.send(0xe0, 0x0a, 0x00, 0x00, data).then(() => true, e => { - if (e && e.statusCode === 0x6d00) { - // this case happen for older version of ETH app, since older app version had the ERC20 data hardcoded, it's fine to assume it worked. - // we return a flag to know if the call was effective or not - return false; - } - - throw e; - }); - } - /** - * You can sign a transaction and retrieve v, r, s given the raw transaction and the BIP 32 path of the account to sign - * @example - eth.signTransaction("44'/60'/0'/0/0", "e8018504e3b292008252089428ee52a8f3d6e5d15f8b131996950d7f296c7952872bd72a2487400080").then(result => ...) - */ - - - signTransaction(path, rawTxHex) { - let paths = (0, _utils.splitPath)(path); - let offset = 0; - let rawTx = Buffer.from(rawTxHex, "hex"); - let toSend = []; - let response; // Check if the TX is encoded following EIP 155 - - let rlpTx = (0, _rlp.decode)(rawTx); - let rlpOffset = 0; - let chainIdPrefix = ""; - - if (rlpTx.length > 6) { - let rlpVrs = (0, _rlp.encode)(rlpTx.slice(-3)); - rlpOffset = rawTx.length - (rlpVrs.length - 1); - const chainIdSrc = rlpTx[6]; - const chainIdBuf = Buffer.alloc(4); - chainIdSrc.copy(chainIdBuf, 4 - chainIdSrc.length); - chainIdPrefix = (chainIdBuf.readUInt32BE(0) * 2 + 35).toString(16).slice(0, -2); // Drop the low byte, that comes from the ledger. - - if (chainIdPrefix.length % 2 === 1) { - chainIdPrefix = "0" + chainIdPrefix; - } - } +},{"./abstract-coder":5,"@ethersproject/bytes":33}],11:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FixedBytesCoder = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var abstract_coder_1 = require("./abstract-coder"); +// @TODO: Merge this with bytes +var FixedBytesCoder = /** @class */ (function (_super) { + __extends(FixedBytesCoder, _super); + function FixedBytesCoder(size, localName) { + var _this = this; + var name = "bytes" + String(size); + _this = _super.call(this, name, name, localName, false) || this; + _this.size = size; + return _this; + } + FixedBytesCoder.prototype.defaultValue = function () { + return ("0x0000000000000000000000000000000000000000000000000000000000000000").substring(0, 2 + this.size * 2); + }; + FixedBytesCoder.prototype.encode = function (writer, value) { + var data = bytes_1.arrayify(value); + if (data.length !== this.size) { + this._throwError("incorrect data length", value); + } + return writer.writeBytes(data); + }; + FixedBytesCoder.prototype.decode = function (reader) { + return reader.coerce(this.name, bytes_1.hexlify(reader.readBytes(this.size))); + }; + return FixedBytesCoder; +}(abstract_coder_1.Coder)); +exports.FixedBytesCoder = FixedBytesCoder; - while (offset !== rawTx.length) { - let maxChunkSize = offset === 0 ? 150 - 1 - paths.length * 4 : 150; - let chunkSize = offset + maxChunkSize > rawTx.length ? rawTx.length - offset : maxChunkSize; +},{"./abstract-coder":5,"@ethersproject/bytes":33}],12:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NullCoder = void 0; +var abstract_coder_1 = require("./abstract-coder"); +var NullCoder = /** @class */ (function (_super) { + __extends(NullCoder, _super); + function NullCoder(localName) { + return _super.call(this, "null", "", localName, false) || this; + } + NullCoder.prototype.defaultValue = function () { + return null; + }; + NullCoder.prototype.encode = function (writer, value) { + if (value != null) { + this._throwError("not null", value); + } + return writer.writeBytes([]); + }; + NullCoder.prototype.decode = function (reader) { + reader.readBytes(0); + return reader.coerce(this.name, null); + }; + return NullCoder; +}(abstract_coder_1.Coder)); +exports.NullCoder = NullCoder; - if (rlpOffset != 0 && offset + chunkSize == rlpOffset) { - // Make sure that the chunk doesn't end right on the EIP 155 marker if set - chunkSize--; - } +},{"./abstract-coder":5}],13:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NumberCoder = void 0; +var bignumber_1 = require("@ethersproject/bignumber"); +var constants_1 = require("@ethersproject/constants"); +var abstract_coder_1 = require("./abstract-coder"); +var NumberCoder = /** @class */ (function (_super) { + __extends(NumberCoder, _super); + function NumberCoder(size, signed, localName) { + var _this = this; + var name = ((signed ? "int" : "uint") + (size * 8)); + _this = _super.call(this, name, name, localName, false) || this; + _this.size = size; + _this.signed = signed; + return _this; + } + NumberCoder.prototype.defaultValue = function () { + return 0; + }; + NumberCoder.prototype.encode = function (writer, value) { + var v = bignumber_1.BigNumber.from(value); + // Check bounds are safe for encoding + var maxUintValue = constants_1.MaxUint256.mask(writer.wordSize * 8); + if (this.signed) { + var bounds = maxUintValue.mask(this.size * 8 - 1); + if (v.gt(bounds) || v.lt(bounds.add(constants_1.One).mul(constants_1.NegativeOne))) { + this._throwError("value out-of-bounds", value); + } + } + else if (v.lt(constants_1.Zero) || v.gt(maxUintValue.mask(this.size * 8))) { + this._throwError("value out-of-bounds", value); + } + v = v.toTwos(this.size * 8).mask(this.size * 8); + if (this.signed) { + v = v.fromTwos(this.size * 8).toTwos(8 * writer.wordSize); + } + return writer.writeValue(v); + }; + NumberCoder.prototype.decode = function (reader) { + var value = reader.readValue().mask(this.size * 8); + if (this.signed) { + value = value.fromTwos(this.size * 8); + } + return reader.coerce(this.name, value); + }; + return NumberCoder; +}(abstract_coder_1.Coder)); +exports.NumberCoder = NumberCoder; - let buffer = Buffer.alloc(offset === 0 ? 1 + paths.length * 4 + chunkSize : chunkSize); +},{"./abstract-coder":5,"@ethersproject/bignumber":31,"@ethersproject/constants":37}],14:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StringCoder = void 0; +var strings_1 = require("@ethersproject/strings"); +var bytes_1 = require("./bytes"); +var StringCoder = /** @class */ (function (_super) { + __extends(StringCoder, _super); + function StringCoder(localName) { + return _super.call(this, "string", localName) || this; + } + StringCoder.prototype.defaultValue = function () { + return ""; + }; + StringCoder.prototype.encode = function (writer, value) { + return _super.prototype.encode.call(this, writer, strings_1.toUtf8Bytes(value)); + }; + StringCoder.prototype.decode = function (reader) { + return strings_1.toUtf8String(_super.prototype.decode.call(this, reader)); + }; + return StringCoder; +}(bytes_1.DynamicBytesCoder)); +exports.StringCoder = StringCoder; - if (offset === 0) { - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); +},{"./bytes":10,"@ethersproject/strings":99}],15:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TupleCoder = void 0; +var abstract_coder_1 = require("./abstract-coder"); +var array_1 = require("./array"); +var TupleCoder = /** @class */ (function (_super) { + __extends(TupleCoder, _super); + function TupleCoder(coders, localName) { + var _this = this; + var dynamic = false; + var types = []; + coders.forEach(function (coder) { + if (coder.dynamic) { + dynamic = true; + } + types.push(coder.type); }); - rawTx.copy(buffer, 1 + 4 * paths.length, offset, offset + chunkSize); - } else { - rawTx.copy(buffer, 0, offset, offset + chunkSize); - } - - toSend.push(buffer); - offset += chunkSize; - } - - return (0, _utils.foreach)(toSend, (data, i) => this.transport.send(0xe0, 0x04, i === 0 ? 0x00 : 0x80, 0x00, data).then(apduResponse => { - response = apduResponse; - })).then(() => { - const v = chainIdPrefix + response.slice(0, 1).toString("hex"); - const r = response.slice(1, 1 + 32).toString("hex"); - const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); - return { - v, - r, - s - }; - }, e => { - throw remapTransactionRelatedErrors(e); - }); - } - /** - */ - - - getAppConfiguration() { - return this.transport.send(0xe0, 0x06, 0x00, 0x00).then(response => { - let result = {}; - result.arbitraryDataEnabled = response[0] & 0x01; - result.erc20ProvisioningNecessary = response[0] & 0x02; - result.starkEnabled = response[0] & 0x04; - result.starkv2Supported = response[0] & 0x08; - result.version = "" + response[1] + "." + response[2] + "." + response[3]; - return result; - }); - } - /** - * You can sign a message according to eth_sign RPC call and retrieve v, r, s given the message and the BIP 32 path of the account to sign. - * @example - eth.signPersonalMessage("44'/60'/0'/0/0", Buffer.from("test").toString("hex")).then(result => { - var v = result['v'] - 27; - v = v.toString(16); - if (v.length < 2) { - v = "0" + v; - } - console.log("Signature 0x" + result['r'] + result['s'] + v); - }) - */ - - - signPersonalMessage(path, messageHex) { - let paths = (0, _utils.splitPath)(path); - let offset = 0; - let message = Buffer.from(messageHex, "hex"); - let toSend = []; - let response; - - while (offset !== message.length) { - let maxChunkSize = offset === 0 ? 150 - 1 - paths.length * 4 - 4 : 150; - let chunkSize = offset + maxChunkSize > message.length ? message.length - offset : maxChunkSize; - let buffer = Buffer.alloc(offset === 0 ? 1 + paths.length * 4 + 4 + chunkSize : chunkSize); - - if (offset === 0) { - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); + var type = ("tuple(" + types.join(",") + ")"); + _this = _super.call(this, "tuple", type, localName, dynamic) || this; + _this.coders = coders; + return _this; + } + TupleCoder.prototype.defaultValue = function () { + var values = []; + this.coders.forEach(function (coder) { + values.push(coder.defaultValue()); }); - buffer.writeUInt32BE(message.length, 1 + 4 * paths.length); - message.copy(buffer, 1 + 4 * paths.length + 4, offset, offset + chunkSize); - } else { - message.copy(buffer, 0, offset, offset + chunkSize); - } - - toSend.push(buffer); - offset += chunkSize; - } - - return (0, _utils.foreach)(toSend, (data, i) => this.transport.send(0xe0, 0x08, i === 0 ? 0x00 : 0x80, 0x00, data).then(apduResponse => { - response = apduResponse; - })).then(() => { - const v = response[0]; - const r = response.slice(1, 1 + 32).toString("hex"); - const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); - return { - v, - r, - s - }; - }); - } - /** - * Sign a prepared message following web3.eth.signTypedData specification. The host computes the domain separator and hashStruct(message) - * @example - eth.signEIP712HashedMessage("44'/60'/0'/0/0", Buffer.from("0101010101010101010101010101010101010101010101010101010101010101").toString("hex"), Buffer.from("0202020202020202020202020202020202020202020202020202020202020202").toString("hex")).then(result => { - var v = result['v'] - 27; - v = v.toString(16); - if (v.length < 2) { - v = "0" + v; - } - console.log("Signature 0x" + result['r'] + result['s'] + v); - }) - */ - - - signEIP712HashedMessage(path, domainSeparatorHex, hashStructMessageHex) { - const domainSeparator = hexBuffer(domainSeparatorHex); - const hashStruct = hexBuffer(hashStructMessageHex); - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4 + 32 + 32, 0); - let offset = 0; - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - offset = 1 + 4 * paths.length; - domainSeparator.copy(buffer, offset); - offset += 32; - hashStruct.copy(buffer, offset); - return this.transport.send(0xe0, 0x0c, 0x00, 0x00, buffer).then(response => { - const v = response[0]; - const r = response.slice(1, 1 + 32).toString("hex"); - const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); - return { - v, - r, - s - }; - }); - } - /** - * get Stark public key for a given BIP 32 path. - * @param path a path in BIP 32 format - * @option boolDisplay optionally enable or not the display - * @return the Stark public key - */ - - - starkGetPublicKey(path, boolDisplay) { - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4); - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - return this.transport.send(0xf0, 0x02, boolDisplay ? 0x01 : 0x00, 0x00, buffer).then(response => { - return response.slice(0, response.length - 2); - }); - } - /** - * sign a Stark order - * @param path a path in BIP 32 format - * @option sourceTokenAddress contract address of the source token (not present for ETH) - * @param sourceQuantization quantization used for the source token - * @option destinationTokenAddress contract address of the destination token (not present for ETH) - * @param destinationQuantization quantization used for the destination token - * @param sourceVault ID of the source vault - * @param destinationVault ID of the destination vault - * @param amountSell amount to sell - * @param amountBuy amount to buy - * @param nonce transaction nonce - * @param timestamp transaction validity timestamp - * @return the signature - */ - - - starkSignOrder(path, sourceTokenAddress, sourceQuantization, destinationTokenAddress, destinationQuantization, sourceVault, destinationVault, amountSell, amountBuy, nonce, timestamp) { - const sourceTokenAddressHex = maybeHexBuffer(sourceTokenAddress); - const destinationTokenAddressHex = maybeHexBuffer(destinationTokenAddress); - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4 + 20 + 32 + 20 + 32 + 4 + 4 + 8 + 8 + 4 + 4, 0); - let offset = 0; - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - offset = 1 + 4 * paths.length; - - if (sourceTokenAddressHex) { - sourceTokenAddressHex.copy(buffer, offset); - } - - offset += 20; - Buffer.from(sourceQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); - offset += 32; - - if (destinationTokenAddressHex) { - destinationTokenAddressHex.copy(buffer, offset); - } - - offset += 20; - Buffer.from(destinationQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); - offset += 32; - buffer.writeUInt32BE(sourceVault, offset); - offset += 4; - buffer.writeUInt32BE(destinationVault, offset); - offset += 4; - Buffer.from(amountSell.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); - offset += 8; - Buffer.from(amountBuy.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); - offset += 8; - buffer.writeUInt32BE(nonce, offset); - offset += 4; - buffer.writeUInt32BE(timestamp, offset); - return this.transport.send(0xf0, 0x04, 0x01, 0x00, buffer).then(response => { - const r = response.slice(1, 1 + 32).toString("hex"); - const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); - return { - r, - s - }; - }); - } - /** - * sign a Stark order using the Starkex V2 protocol - * @param path a path in BIP 32 format - * @option sourceTokenAddress contract address of the source token (not present for ETH) - * @param sourceQuantizationType quantization type used for the source token - * @option sourceQuantization quantization used for the source token (not present for erc 721 or mintable erc 721) - * @option sourceMintableBlobOrTokenId mintable blob (mintable erc 20 / mintable erc 721) or token id (erc 721) associated to the source token - * @option destinationTokenAddress contract address of the destination token (not present for ETH) - * @param destinationQuantizationType quantization type used for the destination token - * @option destinationQuantization quantization used for the destination token (not present for erc 721 or mintable erc 721) - * @option destinationMintableBlobOrTokenId mintable blob (mintable erc 20 / mintable erc 721) or token id (erc 721) associated to the destination token - * @param sourceVault ID of the source vault - * @param destinationVault ID of the destination vault - * @param amountSell amount to sell - * @param amountBuy amount to buy - * @param nonce transaction nonce - * @param timestamp transaction validity timestamp - * @return the signature - */ - - - starkSignOrder_v2(path, sourceTokenAddress, sourceQuantizationType, sourceQuantization, sourceMintableBlobOrTokenId, destinationTokenAddress, destinationQuantizationType, destinationQuantization, destinationMintableBlobOrTokenId, sourceVault, destinationVault, amountSell, amountBuy, nonce, timestamp) { - const sourceTokenAddressHex = maybeHexBuffer(sourceTokenAddress); - const destinationTokenAddressHex = maybeHexBuffer(destinationTokenAddress); - - if (!(sourceQuantizationType in starkQuantizationTypeMap)) { - throw new Error("eth.starkSignOrderv2 invalid source quantization type=" + sourceQuantizationType); - } - - if (!(destinationQuantizationType in starkQuantizationTypeMap)) { - throw new Error("eth.starkSignOrderv2 invalid destination quantization type=" + destinationQuantizationType); - } - - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4 + 1 + 20 + 32 + 32 + 1 + 20 + 32 + 32 + 4 + 4 + 8 + 8 + 4 + 4, 0); - let offset = 0; - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - offset = 1 + 4 * paths.length; - buffer[offset] = starkQuantizationTypeMap[sourceQuantizationType]; - offset++; - - if (sourceTokenAddressHex) { - sourceTokenAddressHex.copy(buffer, offset); - } - - offset += 20; + // We only output named properties for uniquely named coders + var uniqueNames = this.coders.reduce(function (accum, coder) { + var name = coder.localName; + if (name) { + if (!accum[name]) { + accum[name] = 0; + } + accum[name]++; + } + return accum; + }, {}); + // Add named values + this.coders.forEach(function (coder, index) { + var name = coder.localName; + if (!name || uniqueNames[name] !== 1) { + return; + } + if (name === "length") { + name = "_length"; + } + if (values[name] != null) { + return; + } + values[name] = values[index]; + }); + return Object.freeze(values); + }; + TupleCoder.prototype.encode = function (writer, value) { + return array_1.pack(writer, this.coders, value); + }; + TupleCoder.prototype.decode = function (reader) { + return reader.coerce(this.name, array_1.unpack(reader, this.coders)); + }; + return TupleCoder; +}(abstract_coder_1.Coder)); +exports.TupleCoder = TupleCoder; - if (sourceQuantization) { - Buffer.from(sourceQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); +},{"./abstract-coder":5,"./array":8}],16:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ErrorFragment = exports.FunctionFragment = exports.ConstructorFragment = exports.EventFragment = exports.Fragment = exports.ParamType = exports.FormatTypes = void 0; +var bignumber_1 = require("@ethersproject/bignumber"); +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +; +var _constructorGuard = {}; +var ModifiersBytes = { calldata: true, memory: true, storage: true }; +var ModifiersNest = { calldata: true, memory: true }; +function checkModifier(type, name) { + if (type === "bytes" || type === "string") { + if (ModifiersBytes[name]) { + return true; + } } - - offset += 32; - - if (sourceMintableBlobOrTokenId) { - Buffer.from(sourceMintableBlobOrTokenId.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + else if (type === "address") { + if (name === "payable") { + return true; + } } - - offset += 32; - buffer[offset] = starkQuantizationTypeMap[destinationQuantizationType]; - offset++; - - if (destinationTokenAddressHex) { - destinationTokenAddressHex.copy(buffer, offset); + else if (type.indexOf("[") >= 0 || type === "tuple") { + if (ModifiersNest[name]) { + return true; + } } - - offset += 20; - - if (destinationQuantization) { - Buffer.from(destinationQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + if (ModifiersBytes[name] || name === "payable") { + logger.throwArgumentError("invalid modifier", "name", name); } - - offset += 32; - - if (destinationMintableBlobOrTokenId) { - Buffer.from(destinationMintableBlobOrTokenId.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + return false; +} +// @TODO: Make sure that children of an indexed tuple are marked with a null indexed +function parseParamType(param, allowIndexed) { + var originalParam = param; + function throwError(i) { + logger.throwArgumentError("unexpected character at position " + i, "param", param); + } + param = param.replace(/\s/g, " "); + function newNode(parent) { + var node = { type: "", name: "", parent: parent, state: { allowType: true } }; + if (allowIndexed) { + node.indexed = false; + } + return node; + } + var parent = { type: "", name: "", state: { allowType: true } }; + var node = parent; + for (var i = 0; i < param.length; i++) { + var c = param[i]; + switch (c) { + case "(": + if (node.state.allowType && node.type === "") { + node.type = "tuple"; + } + else if (!node.state.allowParams) { + throwError(i); + } + node.state.allowType = false; + node.type = verifyType(node.type); + node.components = [newNode(node)]; + node = node.components[0]; + break; + case ")": + delete node.state; + if (node.name === "indexed") { + if (!allowIndexed) { + throwError(i); + } + node.indexed = true; + node.name = ""; + } + if (checkModifier(node.type, node.name)) { + node.name = ""; + } + node.type = verifyType(node.type); + var child = node; + node = node.parent; + if (!node) { + throwError(i); + } + delete child.parent; + node.state.allowParams = false; + node.state.allowName = true; + node.state.allowArray = true; + break; + case ",": + delete node.state; + if (node.name === "indexed") { + if (!allowIndexed) { + throwError(i); + } + node.indexed = true; + node.name = ""; + } + if (checkModifier(node.type, node.name)) { + node.name = ""; + } + node.type = verifyType(node.type); + var sibling = newNode(node.parent); + //{ type: "", name: "", parent: node.parent, state: { allowType: true } }; + node.parent.components.push(sibling); + delete node.parent; + node = sibling; + break; + // Hit a space... + case " ": + // If reading type, the type is done and may read a param or name + if (node.state.allowType) { + if (node.type !== "") { + node.type = verifyType(node.type); + delete node.state.allowType; + node.state.allowName = true; + node.state.allowParams = true; + } + } + // If reading name, the name is done + if (node.state.allowName) { + if (node.name !== "") { + if (node.name === "indexed") { + if (!allowIndexed) { + throwError(i); + } + if (node.indexed) { + throwError(i); + } + node.indexed = true; + node.name = ""; + } + else if (checkModifier(node.type, node.name)) { + node.name = ""; + } + else { + node.state.allowName = false; + } + } + } + break; + case "[": + if (!node.state.allowArray) { + throwError(i); + } + node.type += c; + node.state.allowArray = false; + node.state.allowName = false; + node.state.readArray = true; + break; + case "]": + if (!node.state.readArray) { + throwError(i); + } + node.type += c; + node.state.readArray = false; + node.state.allowArray = true; + node.state.allowName = true; + break; + default: + if (node.state.allowType) { + node.type += c; + node.state.allowParams = true; + node.state.allowArray = true; + } + else if (node.state.allowName) { + node.name += c; + delete node.state.allowArray; + } + else if (node.state.readArray) { + node.type += c; + } + else { + throwError(i); + } + } } - - offset += 32; - buffer.writeUInt32BE(sourceVault, offset); - offset += 4; - buffer.writeUInt32BE(destinationVault, offset); - offset += 4; - Buffer.from(amountSell.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); - offset += 8; - Buffer.from(amountBuy.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); - offset += 8; - buffer.writeUInt32BE(nonce, offset); - offset += 4; - buffer.writeUInt32BE(timestamp, offset); - return this.transport.send(0xf0, 0x04, 0x03, 0x00, buffer).then(response => { - const r = response.slice(1, 1 + 32).toString("hex"); - const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); - return { - r, - s - }; - }); - } - /** - * sign a Stark transfer - * @param path a path in BIP 32 format - * @option transferTokenAddress contract address of the token to be transferred (not present for ETH) - * @param transferQuantization quantization used for the token to be transferred - * @param targetPublicKey target Stark public key - * @param sourceVault ID of the source vault - * @param destinationVault ID of the destination vault - * @param amountTransfer amount to transfer - * @param nonce transaction nonce - * @param timestamp transaction validity timestamp - * @return the signature - */ - - - starkSignTransfer(path, transferTokenAddress, transferQuantization, targetPublicKey, sourceVault, destinationVault, amountTransfer, nonce, timestamp) { - const transferTokenAddressHex = maybeHexBuffer(transferTokenAddress); - const targetPublicKeyHex = hexBuffer(targetPublicKey); - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4 + 20 + 32 + 32 + 4 + 4 + 8 + 4 + 4, 0); - let offset = 0; - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - offset = 1 + 4 * paths.length; - - if (transferTokenAddressHex) { - transferTokenAddressHex.copy(buffer, offset); - } - - offset += 20; - Buffer.from(transferQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); - offset += 32; - targetPublicKeyHex.copy(buffer, offset); - offset += 32; - buffer.writeUInt32BE(sourceVault, offset); - offset += 4; - buffer.writeUInt32BE(destinationVault, offset); - offset += 4; - Buffer.from(amountTransfer.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); - offset += 8; - buffer.writeUInt32BE(nonce, offset); - offset += 4; - buffer.writeUInt32BE(timestamp, offset); - return this.transport.send(0xf0, 0x04, 0x02, 0x00, buffer).then(response => { - const r = response.slice(1, 1 + 32).toString("hex"); - const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); - return { - r, - s - }; - }); - } - /** - * sign a Stark transfer or conditional transfer using the Starkex V2 protocol - * @param path a path in BIP 32 format - * @option transferTokenAddress contract address of the token to be transferred (not present for ETH) - * @param transferQuantizationType quantization type used for the token to be transferred - * @option transferQuantization quantization used for the token to be transferred (not present for erc 721 or mintable erc 721) - * @option transferMintableBlobOrTokenId mintable blob (mintable erc 20 / mintable erc 721) or token id (erc 721) associated to the token to be transferred - * @param targetPublicKey target Stark public key - * @param sourceVault ID of the source vault - * @param destinationVault ID of the destination vault - * @param amountTransfer amount to transfer - * @param nonce transaction nonce - * @param timestamp transaction validity timestamp - * @option conditionalTransferAddress onchain address of the condition for a conditional transfer - * @option conditionalTransferFact fact associated to the condition for a conditional transfer - * @return the signature - */ - - - starkSignTransfer_v2(path, transferTokenAddress, transferQuantizationType, transferQuantization, transferMintableBlobOrTokenId, targetPublicKey, sourceVault, destinationVault, amountTransfer, nonce, timestamp, conditionalTransferAddress, conditionalTransferFact) { - const transferTokenAddressHex = maybeHexBuffer(transferTokenAddress); - const targetPublicKeyHex = hexBuffer(targetPublicKey); - const conditionalTransferAddressHex = maybeHexBuffer(conditionalTransferAddress); - - if (!(transferQuantizationType in starkQuantizationTypeMap)) { - throw new Error("eth.starkSignTransferv2 invalid quantization type=" + transferQuantizationType); + if (node.parent) { + logger.throwArgumentError("unexpected eof", "param", param); } - - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4 + 1 + 20 + 32 + 32 + 32 + 4 + 4 + 8 + 4 + 4 + (conditionalTransferAddressHex ? 32 + 20 : 0), 0); - let offset = 0; - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - offset = 1 + 4 * paths.length; - buffer[offset] = starkQuantizationTypeMap[transferQuantizationType]; - offset++; - - if (transferTokenAddressHex) { - transferTokenAddressHex.copy(buffer, offset); + delete parent.state; + if (node.name === "indexed") { + if (!allowIndexed) { + throwError(originalParam.length - 7); + } + if (node.indexed) { + throwError(originalParam.length - 7); + } + node.indexed = true; + node.name = ""; } - - offset += 20; - - if (transferQuantization) { - Buffer.from(transferQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + else if (checkModifier(node.type, node.name)) { + node.name = ""; } - - offset += 32; - - if (transferMintableBlobOrTokenId) { - Buffer.from(transferMintableBlobOrTokenId.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + parent.type = verifyType(parent.type); + return parent; +} +function populate(object, params) { + for (var key in params) { + properties_1.defineReadOnly(object, key, params[key]); } - - offset += 32; - targetPublicKeyHex.copy(buffer, offset); - offset += 32; - buffer.writeUInt32BE(sourceVault, offset); - offset += 4; - buffer.writeUInt32BE(destinationVault, offset); - offset += 4; - Buffer.from(amountTransfer.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); - offset += 8; - buffer.writeUInt32BE(nonce, offset); - offset += 4; - buffer.writeUInt32BE(timestamp, offset); - - if (conditionalTransferAddressHex && conditionalTransferFact) { - offset += 4; - Buffer.from(conditionalTransferFact.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); - offset += 32; - conditionalTransferAddressHex.copy(buffer, offset); +} +exports.FormatTypes = Object.freeze({ + // Bare formatting, as is needed for computing a sighash of an event or function + sighash: "sighash", + // Human-Readable with Minimal spacing and without names (compact human-readable) + minimal: "minimal", + // Human-Readble with nice spacing, including all names + full: "full", + // JSON-format a la Solidity + json: "json" +}); +var paramTypeArray = new RegExp(/^(.*)\[([0-9]*)\]$/); +var ParamType = /** @class */ (function () { + function ParamType(constructorGuard, params) { + if (constructorGuard !== _constructorGuard) { + logger.throwError("use fromString", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "new ParamType()" + }); + } + populate(this, params); + var match = this.type.match(paramTypeArray); + if (match) { + populate(this, { + arrayLength: parseInt(match[2] || "-1"), + arrayChildren: ParamType.fromObject({ + type: match[1], + components: this.components + }), + baseType: "array" + }); + } + else { + populate(this, { + arrayLength: null, + arrayChildren: null, + baseType: ((this.components != null) ? "tuple" : this.type) + }); + } + this._isParamType = true; + Object.freeze(this); + } + // Format the parameter fragment + // - sighash: "(uint256,address)" + // - minimal: "tuple(uint256,address) indexed" + // - full: "tuple(uint256 foo, addres bar) indexed baz" + ParamType.prototype.format = function (format) { + if (!format) { + format = exports.FormatTypes.sighash; + } + if (!exports.FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === exports.FormatTypes.json) { + var result_1 = { + type: ((this.baseType === "tuple") ? "tuple" : this.type), + name: (this.name || undefined) + }; + if (typeof (this.indexed) === "boolean") { + result_1.indexed = this.indexed; + } + if (this.components) { + result_1.components = this.components.map(function (comp) { return JSON.parse(comp.format(format)); }); + } + return JSON.stringify(result_1); + } + var result = ""; + // Array + if (this.baseType === "array") { + result += this.arrayChildren.format(format); + result += "[" + (this.arrayLength < 0 ? "" : String(this.arrayLength)) + "]"; + } + else { + if (this.baseType === "tuple") { + if (format !== exports.FormatTypes.sighash) { + result += this.type; + } + result += "(" + this.components.map(function (comp) { return comp.format(format); }).join((format === exports.FormatTypes.full) ? ", " : ",") + ")"; + } + else { + result += this.type; + } + } + if (format !== exports.FormatTypes.sighash) { + if (this.indexed === true) { + result += " indexed"; + } + if (format === exports.FormatTypes.full && this.name) { + result += " " + this.name; + } + } + return result; + }; + ParamType.from = function (value, allowIndexed) { + if (typeof (value) === "string") { + return ParamType.fromString(value, allowIndexed); + } + return ParamType.fromObject(value); + }; + ParamType.fromObject = function (value) { + if (ParamType.isParamType(value)) { + return value; + } + return new ParamType(_constructorGuard, { + name: (value.name || null), + type: verifyType(value.type), + indexed: ((value.indexed == null) ? null : !!value.indexed), + components: (value.components ? value.components.map(ParamType.fromObject) : null) + }); + }; + ParamType.fromString = function (value, allowIndexed) { + function ParamTypify(node) { + return ParamType.fromObject({ + name: node.name, + type: node.type, + indexed: node.indexed, + components: node.components + }); + } + return ParamTypify(parseParamType(value, !!allowIndexed)); + }; + ParamType.isParamType = function (value) { + return !!(value != null && value._isParamType); + }; + return ParamType; +}()); +exports.ParamType = ParamType; +; +function parseParams(value, allowIndex) { + return splitNesting(value).map(function (param) { return ParamType.fromString(param, allowIndex); }); +} +var Fragment = /** @class */ (function () { + function Fragment(constructorGuard, params) { + if (constructorGuard !== _constructorGuard) { + logger.throwError("use a static from method", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "new Fragment()" + }); + } + populate(this, params); + this._isFragment = true; + Object.freeze(this); } - - return this.transport.send(0xf0, 0x04, conditionalTransferAddressHex ? 0x05 : 0x04, 0x00, buffer).then(response => { - const r = response.slice(1, 1 + 32).toString("hex"); - const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); - return { - r, - s - }; - }); - } - /** - * provide quantization information before singing a deposit or withdrawal Stark powered contract call - * - * It shall be run following a provideERC20TokenInformation call for the given contract - * - * @param operationContract contract address of the token to be transferred (not present for ETH) - * @param operationQuantization quantization used for the token to be transferred - */ - - - starkProvideQuantum(operationContract, operationQuantization) { - const operationContractHex = maybeHexBuffer(operationContract); - let buffer = Buffer.alloc(20 + 32, 0); - - if (operationContractHex) { - operationContractHex.copy(buffer, 0); + Fragment.from = function (value) { + if (Fragment.isFragment(value)) { + return value; + } + if (typeof (value) === "string") { + return Fragment.fromString(value); + } + return Fragment.fromObject(value); + }; + Fragment.fromObject = function (value) { + if (Fragment.isFragment(value)) { + return value; + } + switch (value.type) { + case "function": + return FunctionFragment.fromObject(value); + case "event": + return EventFragment.fromObject(value); + case "constructor": + return ConstructorFragment.fromObject(value); + case "error": + return ErrorFragment.fromObject(value); + case "fallback": + case "receive": + // @TODO: Something? Maybe return a FunctionFragment? A custom DefaultFunctionFragment? + return null; + } + return logger.throwArgumentError("invalid fragment object", "value", value); + }; + Fragment.fromString = function (value) { + // Make sure the "returns" is surrounded by a space and all whitespace is exactly one space + value = value.replace(/\s/g, " "); + value = value.replace(/\(/g, " (").replace(/\)/g, ") ").replace(/\s+/g, " "); + value = value.trim(); + if (value.split(" ")[0] === "event") { + return EventFragment.fromString(value.substring(5).trim()); + } + else if (value.split(" ")[0] === "function") { + return FunctionFragment.fromString(value.substring(8).trim()); + } + else if (value.split("(")[0].trim() === "constructor") { + return ConstructorFragment.fromString(value.trim()); + } + else if (value.split(" ")[0] === "error") { + return ErrorFragment.fromString(value.substring(5).trim()); + } + return logger.throwArgumentError("unsupported fragment", "value", value); + }; + Fragment.isFragment = function (value) { + return !!(value && value._isFragment); + }; + return Fragment; +}()); +exports.Fragment = Fragment; +var EventFragment = /** @class */ (function (_super) { + __extends(EventFragment, _super); + function EventFragment() { + return _super !== null && _super.apply(this, arguments) || this; + } + EventFragment.prototype.format = function (format) { + if (!format) { + format = exports.FormatTypes.sighash; + } + if (!exports.FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === exports.FormatTypes.json) { + return JSON.stringify({ + type: "event", + anonymous: this.anonymous, + name: this.name, + inputs: this.inputs.map(function (input) { return JSON.parse(input.format(format)); }) + }); + } + var result = ""; + if (format !== exports.FormatTypes.sighash) { + result += "event "; + } + result += this.name + "(" + this.inputs.map(function (input) { return input.format(format); }).join((format === exports.FormatTypes.full) ? ", " : ",") + ") "; + if (format !== exports.FormatTypes.sighash) { + if (this.anonymous) { + result += "anonymous "; + } + } + return result.trim(); + }; + EventFragment.from = function (value) { + if (typeof (value) === "string") { + return EventFragment.fromString(value); + } + return EventFragment.fromObject(value); + }; + EventFragment.fromObject = function (value) { + if (EventFragment.isEventFragment(value)) { + return value; + } + if (value.type !== "event") { + logger.throwArgumentError("invalid event object", "value", value); + } + var params = { + name: verifyIdentifier(value.name), + anonymous: value.anonymous, + inputs: (value.inputs ? value.inputs.map(ParamType.fromObject) : []), + type: "event" + }; + return new EventFragment(_constructorGuard, params); + }; + EventFragment.fromString = function (value) { + var match = value.match(regexParen); + if (!match) { + logger.throwArgumentError("invalid event string", "value", value); + } + var anonymous = false; + match[3].split(" ").forEach(function (modifier) { + switch (modifier.trim()) { + case "anonymous": + anonymous = true; + break; + case "": + break; + default: + logger.warn("unknown modifier: " + modifier); + } + }); + return EventFragment.fromObject({ + name: match[1].trim(), + anonymous: anonymous, + inputs: parseParams(match[2], true), + type: "event" + }); + }; + EventFragment.isEventFragment = function (value) { + return (value && value._isFragment && value.type === "event"); + }; + return EventFragment; +}(Fragment)); +exports.EventFragment = EventFragment; +function parseGas(value, params) { + params.gas = null; + var comps = value.split("@"); + if (comps.length !== 1) { + if (comps.length > 2) { + logger.throwArgumentError("invalid human-readable ABI signature", "value", value); + } + if (!comps[1].match(/^[0-9]+$/)) { + logger.throwArgumentError("invalid human-readable ABI signature gas", "value", value); + } + params.gas = bignumber_1.BigNumber.from(comps[1]); + return comps[0]; } - - Buffer.from(operationQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, 20); - return this.transport.send(0xf0, 0x08, 0x00, 0x00, buffer).then(() => true, e => { - if (e && e.statusCode === 0x6d00) { - // this case happen for ETH application versions not supporting Stark extensions - return false; - } - - throw e; + return value; +} +function parseModifiers(value, params) { + params.constant = false; + params.payable = false; + params.stateMutability = "nonpayable"; + value.split(" ").forEach(function (modifier) { + switch (modifier.trim()) { + case "constant": + params.constant = true; + break; + case "payable": + params.payable = true; + params.stateMutability = "payable"; + break; + case "nonpayable": + params.payable = false; + params.stateMutability = "nonpayable"; + break; + case "pure": + params.constant = true; + params.stateMutability = "pure"; + break; + case "view": + params.constant = true; + params.stateMutability = "view"; + break; + case "external": + case "public": + case "": + break; + default: + console.log("unknown modifier: " + modifier); + } }); - } - /** - * provide quantization information before singing a deposit or withdrawal Stark powered contract call using the Starkex V2 protocol - * - * It shall be run following a provideERC20TokenInformation call for the given contract - * - * @param operationContract contract address of the token to be transferred (not present for ETH) - * @param operationQuantizationType quantization type of the token to be transferred - * @option operationQuantization quantization used for the token to be transferred (not present for erc 721 or mintable erc 721) - * @option operationMintableBlobOrTokenId mintable blob (mintable erc 20 / mintable erc 721) or token id (erc 721) of the token to be transferred - */ - - - starkProvideQuantum_v2(operationContract, operationQuantizationType, operationQuantization, operationMintableBlobOrTokenId) { - const operationContractHex = maybeHexBuffer(operationContract); - - if (!(operationQuantizationType in starkQuantizationTypeMap)) { - throw new Error("eth.starkProvideQuantumV2 invalid quantization type=" + operationQuantizationType); +} +function verifyState(value) { + var result = { + constant: false, + payable: true, + stateMutability: "payable" + }; + if (value.stateMutability != null) { + result.stateMutability = value.stateMutability; + // Set (and check things are consistent) the constant property + result.constant = (result.stateMutability === "view" || result.stateMutability === "pure"); + if (value.constant != null) { + if ((!!value.constant) !== result.constant) { + logger.throwArgumentError("cannot have constant function with mutability " + result.stateMutability, "value", value); + } + } + // Set (and check things are consistent) the payable property + result.payable = (result.stateMutability === "payable"); + if (value.payable != null) { + if ((!!value.payable) !== result.payable) { + logger.throwArgumentError("cannot have payable function with mutability " + result.stateMutability, "value", value); + } + } } - - let buffer = Buffer.alloc(20 + 32 + 32, 0); - let offset = 0; - - if (operationContractHex) { - operationContractHex.copy(buffer, offset); + else if (value.payable != null) { + result.payable = !!value.payable; + // If payable we can assume non-constant; otherwise we can't assume + if (value.constant == null && !result.payable && value.type !== "constructor") { + logger.throwArgumentError("unable to determine stateMutability", "value", value); + } + result.constant = !!value.constant; + if (result.constant) { + result.stateMutability = "view"; + } + else { + result.stateMutability = (result.payable ? "payable" : "nonpayable"); + } + if (result.payable && result.constant) { + logger.throwArgumentError("cannot have constant payable function", "value", value); + } } - - offset += 20; - - if (operationQuantization) { - Buffer.from(operationQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + else if (value.constant != null) { + result.constant = !!value.constant; + result.payable = !result.constant; + result.stateMutability = (result.constant ? "view" : "payable"); } - - offset += 32; - - if (operationMintableBlobOrTokenId) { - Buffer.from(operationMintableBlobOrTokenId.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + else if (value.type !== "constructor") { + logger.throwArgumentError("unable to determine stateMutability", "value", value); } - - return this.transport.send(0xf0, 0x08, starkQuantizationTypeMap[operationQuantizationType], 0x00, buffer).then(() => true, e => { - if (e && e.statusCode === 0x6d00) { - // this case happen for ETH application versions not supporting Stark extensions - return false; - } - - throw e; - }); - } - /** - * sign the given hash over the Stark curve - * It is intended for speed of execution in case an unknown Stark model is pushed and should be avoided as much as possible. - * @param path a path in BIP 32 format - * @param hash hexadecimal hash to sign - * @return the signature - */ - - - starkUnsafeSign(path, hash) { - const hashHex = hexBuffer(hash); - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4 + 32); - let offset = 0; - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - offset = 1 + 4 * paths.length; - hashHex.copy(buffer, offset); - return this.transport.send(0xf0, 0x0a, 0x00, 0x00, buffer).then(response => { - const r = response.slice(1, 1 + 32).toString("hex"); - const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); - return { - r, - s - }; - }); - } - /** - * get an Ethereum 2 BLS-12 381 public key for a given BIP 32 path. - * @param path a path in BIP 32 format - * @option boolDisplay optionally enable or not the display - * @return an object with a publicKey - * @example - * eth.eth2GetPublicKey("12381/3600/0/0").then(o => o.publicKey) - */ - - - eth2GetPublicKey(path, boolDisplay) { - let paths = (0, _utils.splitPath)(path); - let buffer = Buffer.alloc(1 + paths.length * 4); - buffer[0] = paths.length; - paths.forEach((element, index) => { - buffer.writeUInt32BE(element, 1 + 4 * index); - }); - return this.transport.send(0xe0, 0x0e, boolDisplay ? 0x01 : 0x00, 0x00, buffer).then(response => { - let result = {}; - result.publicKey = response.slice(0, -2).toString("hex"); - return result; - }); - } - /** - * Set the index of a Withdrawal key used as withdrawal credentials in an ETH 2 deposit contract call signature - * - * It shall be run before the ETH 2 deposit transaction is signed. If not called, the index is set to 0 - * - * @param withdrawalIndex index path in the EIP 2334 path m/12381/3600/withdrawalIndex/0 - * @return True if the method was executed successfully - */ - - - eth2SetWithdrawalIndex(withdrawalIndex) { - let buffer = Buffer.alloc(4, 0); - buffer.writeUInt32BE(withdrawalIndex, 0); - return this.transport.send(0xe0, 0x10, 0x00, 0x00, buffer).then(() => true, e => { - if (e && e.statusCode === 0x6d00) { - // this case happen for ETH application versions not supporting ETH 2 - return false; - } - - throw e; - }); - } - + return result; } - -exports.default = Eth; - -}).call(this,require("buffer").Buffer) -},{"./utils":8,"@ledgerhq/errors":4,"bignumber.js":17,"buffer":20,"rlp":23}],7:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.list = exports.byContractAddress = void 0; - -var _erc20Signatures = _interopRequireDefault(require("@ledgerhq/cryptoassets/data/erc20-signatures")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Retrieve the token information by a given contract address if any - */ -const byContractAddress = contract => get().byContract(asContractAddress(contract)); -/** - * list all the ERC20 tokens informations - */ - - -exports.byContractAddress = byContractAddress; - -const list = () => get().list(); - -exports.list = list; - -const asContractAddress = addr => { - const a = addr.toLowerCase(); - return a.startsWith("0x") ? a : "0x" + a; -}; // this internal get() will lazy load and cache the data from the erc20 data blob - - -const get = (() => { - let cache; - return () => { - if (cache) return cache; - const buf = Buffer.from(_erc20Signatures.default, "base64"); - const byContract = {}; - const entries = []; - let i = 0; - - while (i < buf.length) { - const length = buf.readUInt32BE(i); - i += 4; - const item = buf.slice(i, i + length); - let j = 0; - const tickerLength = item.readUInt8(j); - j += 1; - const ticker = item.slice(j, j + tickerLength).toString("ascii"); - j += tickerLength; - const contractAddress = asContractAddress(item.slice(j, j + 20).toString("hex")); - j += 20; - const decimals = item.readUInt32BE(j); - j += 4; - const chainId = item.readUInt32BE(j); - j += 4; - const signature = item.slice(j); - const entry = { - ticker, - contractAddress, - decimals, - chainId, - signature, - data: item - }; - entries.push(entry); - byContract[contractAddress] = entry; - i += length; - } - - const api = { - list: () => entries, - byContract: contractAddress => byContract[contractAddress] +var ConstructorFragment = /** @class */ (function (_super) { + __extends(ConstructorFragment, _super); + function ConstructorFragment() { + return _super !== null && _super.apply(this, arguments) || this; + } + ConstructorFragment.prototype.format = function (format) { + if (!format) { + format = exports.FormatTypes.sighash; + } + if (!exports.FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === exports.FormatTypes.json) { + return JSON.stringify({ + type: "constructor", + stateMutability: ((this.stateMutability !== "nonpayable") ? this.stateMutability : undefined), + payable: this.payable, + gas: (this.gas ? this.gas.toNumber() : undefined), + inputs: this.inputs.map(function (input) { return JSON.parse(input.format(format)); }) + }); + } + if (format === exports.FormatTypes.sighash) { + logger.throwError("cannot format a constructor for sighash", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "format(sighash)" + }); + } + var result = "constructor(" + this.inputs.map(function (input) { return input.format(format); }).join((format === exports.FormatTypes.full) ? ", " : ",") + ") "; + if (this.stateMutability && this.stateMutability !== "nonpayable") { + result += this.stateMutability + " "; + } + return result.trim(); }; - cache = api; - return api; - }; -})(); - -}).call(this,require("buffer").Buffer) -},{"@ledgerhq/cryptoassets/data/erc20-signatures":3,"buffer":20}],8:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.defer = defer; -exports.splitPath = splitPath; -exports.eachSeries = eachSeries; -exports.foreach = foreach; -exports.doIf = doIf; -exports.asyncWhile = asyncWhile; - -/******************************************************************************** - * Ledger Node JS API - * (c) 2016-2017 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ********************************************************************************/ -function defer() { - let resolve, reject; - let promise = new Promise(function (success, failure) { - resolve = success; - reject = failure; - }); - if (!resolve || !reject) throw "defer() error"; // this never happens and is just to make flow happy - - return { - promise, - resolve, - reject - }; -} // TODO use bip32-path library - - -function splitPath(path) { - let result = []; - let components = path.split("/"); - components.forEach(element => { - let number = parseInt(element, 10); - - if (isNaN(number)) { - return; // FIXME shouldn't it throws instead? - } - - if (element.length > 1 && element[element.length - 1] === "'") { - number += 0x80000000; - } - - result.push(number); - }); - return result; -} // TODO use async await - - -function eachSeries(arr, fun) { - return arr.reduce((p, e) => p.then(() => fun(e)), Promise.resolve()); + ConstructorFragment.from = function (value) { + if (typeof (value) === "string") { + return ConstructorFragment.fromString(value); + } + return ConstructorFragment.fromObject(value); + }; + ConstructorFragment.fromObject = function (value) { + if (ConstructorFragment.isConstructorFragment(value)) { + return value; + } + if (value.type !== "constructor") { + logger.throwArgumentError("invalid constructor object", "value", value); + } + var state = verifyState(value); + if (state.constant) { + logger.throwArgumentError("constructor cannot be constant", "value", value); + } + var params = { + name: null, + type: value.type, + inputs: (value.inputs ? value.inputs.map(ParamType.fromObject) : []), + payable: state.payable, + stateMutability: state.stateMutability, + gas: (value.gas ? bignumber_1.BigNumber.from(value.gas) : null) + }; + return new ConstructorFragment(_constructorGuard, params); + }; + ConstructorFragment.fromString = function (value) { + var params = { type: "constructor" }; + value = parseGas(value, params); + var parens = value.match(regexParen); + if (!parens || parens[1].trim() !== "constructor") { + logger.throwArgumentError("invalid constructor string", "value", value); + } + params.inputs = parseParams(parens[2].trim(), false); + parseModifiers(parens[3].trim(), params); + return ConstructorFragment.fromObject(params); + }; + ConstructorFragment.isConstructorFragment = function (value) { + return (value && value._isFragment && value.type === "constructor"); + }; + return ConstructorFragment; +}(Fragment)); +exports.ConstructorFragment = ConstructorFragment; +var FunctionFragment = /** @class */ (function (_super) { + __extends(FunctionFragment, _super); + function FunctionFragment() { + return _super !== null && _super.apply(this, arguments) || this; + } + FunctionFragment.prototype.format = function (format) { + if (!format) { + format = exports.FormatTypes.sighash; + } + if (!exports.FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === exports.FormatTypes.json) { + return JSON.stringify({ + type: "function", + name: this.name, + constant: this.constant, + stateMutability: ((this.stateMutability !== "nonpayable") ? this.stateMutability : undefined), + payable: this.payable, + gas: (this.gas ? this.gas.toNumber() : undefined), + inputs: this.inputs.map(function (input) { return JSON.parse(input.format(format)); }), + outputs: this.outputs.map(function (output) { return JSON.parse(output.format(format)); }), + }); + } + var result = ""; + if (format !== exports.FormatTypes.sighash) { + result += "function "; + } + result += this.name + "(" + this.inputs.map(function (input) { return input.format(format); }).join((format === exports.FormatTypes.full) ? ", " : ",") + ") "; + if (format !== exports.FormatTypes.sighash) { + if (this.stateMutability) { + if (this.stateMutability !== "nonpayable") { + result += (this.stateMutability + " "); + } + } + else if (this.constant) { + result += "view "; + } + if (this.outputs && this.outputs.length) { + result += "returns (" + this.outputs.map(function (output) { return output.format(format); }).join(", ") + ") "; + } + if (this.gas != null) { + result += "@" + this.gas.toString() + " "; + } + } + return result.trim(); + }; + FunctionFragment.from = function (value) { + if (typeof (value) === "string") { + return FunctionFragment.fromString(value); + } + return FunctionFragment.fromObject(value); + }; + FunctionFragment.fromObject = function (value) { + if (FunctionFragment.isFunctionFragment(value)) { + return value; + } + if (value.type !== "function") { + logger.throwArgumentError("invalid function object", "value", value); + } + var state = verifyState(value); + var params = { + type: value.type, + name: verifyIdentifier(value.name), + constant: state.constant, + inputs: (value.inputs ? value.inputs.map(ParamType.fromObject) : []), + outputs: (value.outputs ? value.outputs.map(ParamType.fromObject) : []), + payable: state.payable, + stateMutability: state.stateMutability, + gas: (value.gas ? bignumber_1.BigNumber.from(value.gas) : null) + }; + return new FunctionFragment(_constructorGuard, params); + }; + FunctionFragment.fromString = function (value) { + var params = { type: "function" }; + value = parseGas(value, params); + var comps = value.split(" returns "); + if (comps.length > 2) { + logger.throwArgumentError("invalid function string", "value", value); + } + var parens = comps[0].match(regexParen); + if (!parens) { + logger.throwArgumentError("invalid function signature", "value", value); + } + params.name = parens[1].trim(); + if (params.name) { + verifyIdentifier(params.name); + } + params.inputs = parseParams(parens[2], false); + parseModifiers(parens[3].trim(), params); + // We have outputs + if (comps.length > 1) { + var returns = comps[1].match(regexParen); + if (returns[1].trim() != "" || returns[3].trim() != "") { + logger.throwArgumentError("unexpected tokens", "value", value); + } + params.outputs = parseParams(returns[2], false); + } + else { + params.outputs = []; + } + return FunctionFragment.fromObject(params); + }; + FunctionFragment.isFunctionFragment = function (value) { + return (value && value._isFragment && value.type === "function"); + }; + return FunctionFragment; +}(ConstructorFragment)); +exports.FunctionFragment = FunctionFragment; +//export class StructFragment extends Fragment { +//} +function checkForbidden(fragment) { + var sig = fragment.format(); + if (sig === "Error(string)" || sig === "Panic(uint256)") { + logger.throwArgumentError("cannot specify user defined " + sig + " error", "fragment", fragment); + } + return fragment; } - -function foreach(arr, callback) { - function iterate(index, array, result) { - if (index >= array.length) { - return result; - } else return callback(array[index], index).then(function (res) { - result.push(res); - return iterate(index + 1, array, result); - }); - } - - return Promise.resolve().then(() => iterate(0, arr, [])); +var ErrorFragment = /** @class */ (function (_super) { + __extends(ErrorFragment, _super); + function ErrorFragment() { + return _super !== null && _super.apply(this, arguments) || this; + } + ErrorFragment.prototype.format = function (format) { + if (!format) { + format = exports.FormatTypes.sighash; + } + if (!exports.FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === exports.FormatTypes.json) { + return JSON.stringify({ + type: "error", + name: this.name, + inputs: this.inputs.map(function (input) { return JSON.parse(input.format(format)); }), + }); + } + var result = ""; + if (format !== exports.FormatTypes.sighash) { + result += "error "; + } + result += this.name + "(" + this.inputs.map(function (input) { return input.format(format); }).join((format === exports.FormatTypes.full) ? ", " : ",") + ") "; + return result.trim(); + }; + ErrorFragment.from = function (value) { + if (typeof (value) === "string") { + return ErrorFragment.fromString(value); + } + return ErrorFragment.fromObject(value); + }; + ErrorFragment.fromObject = function (value) { + if (ErrorFragment.isErrorFragment(value)) { + return value; + } + if (value.type !== "error") { + logger.throwArgumentError("invalid error object", "value", value); + } + var params = { + type: value.type, + name: verifyIdentifier(value.name), + inputs: (value.inputs ? value.inputs.map(ParamType.fromObject) : []) + }; + return checkForbidden(new ErrorFragment(_constructorGuard, params)); + }; + ErrorFragment.fromString = function (value) { + var params = { type: "error" }; + var parens = value.match(regexParen); + if (!parens) { + logger.throwArgumentError("invalid error signature", "value", value); + } + params.name = parens[1].trim(); + if (params.name) { + verifyIdentifier(params.name); + } + params.inputs = parseParams(parens[2], false); + return checkForbidden(ErrorFragment.fromObject(params)); + }; + ErrorFragment.isErrorFragment = function (value) { + return (value && value._isFragment && value.type === "error"); + }; + return ErrorFragment; +}(Fragment)); +exports.ErrorFragment = ErrorFragment; +function verifyType(type) { + // These need to be transformed to their full description + if (type.match(/^uint($|[^1-9])/)) { + type = "uint256" + type.substring(4); + } + else if (type.match(/^int($|[^1-9])/)) { + type = "int256" + type.substring(3); + } + // @TODO: more verification + return type; } - -function doIf(condition, callback) { - return Promise.resolve().then(() => { - if (condition) { - return callback(); +// See: https://github.com/ethereum/solidity/blob/1f8f1a3db93a548d0555e3e14cfc55a10e25b60e/docs/grammar/SolidityLexer.g4#L234 +var regexIdentifier = new RegExp("^[a-zA-Z$_][a-zA-Z0-9$_]*$"); +function verifyIdentifier(value) { + if (!value || !value.match(regexIdentifier)) { + logger.throwArgumentError("invalid identifier \"" + value + "\"", "value", value); } - }); + return value; } - -function asyncWhile(predicate, callback) { - function iterate(result) { - if (!predicate()) { - return result; - } else { - return callback().then(res => { - result.push(res); - return iterate(result); - }); +var regexParen = new RegExp("^([^)(]*)\\((.*)\\)([^)(]*)$"); +function splitNesting(value) { + value = value.trim(); + var result = []; + var accum = ""; + var depth = 0; + for (var offset = 0; offset < value.length; offset++) { + var c = value[offset]; + if (c === "," && depth === 0) { + result.push(accum); + accum = ""; + } + else { + accum += c; + if (c === "(") { + depth++; + } + else if (c === ")") { + depth--; + if (depth === -1) { + logger.throwArgumentError("unbalanced parenthesis", "value", value); + } + } + } } - } - - return Promise.resolve([]).then(iterate); + if (accum) { + result.push(accum); + } + return result; } -},{}],9:[function(require,module,exports){ -(function (global,Buffer){ +},{"./_version":3,"@ethersproject/bignumber":31,"@ethersproject/logger":57,"@ethersproject/properties":63}],17:[function(require,module,exports){ "use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _hwTransport = _interopRequireDefault(require("@ledgerhq/hw-transport")); - -var _errors = require("@ledgerhq/errors"); - -var _logs = require("@ledgerhq/logs"); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const WebSocket = global.WebSocket || require("ws"); -/** - * WebSocket transport implementation - */ - - -class WebSocketTransport extends _hwTransport.default { - // this transport is not discoverable - static async open(url) { - const exchangeMethods = await new Promise((resolve, reject) => { - try { - const socket = new WebSocket(url); - const exchangeMethods = { - resolveExchange: _b => {}, - rejectExchange: _e => {}, - onDisconnect: () => {}, - close: () => socket.close(), - send: msg => socket.send(msg) - }; - - socket.onopen = () => { - socket.send("open"); - }; - - socket.onerror = e => { - exchangeMethods.onDisconnect(); - reject(e); - }; - - socket.onclose = () => { - exchangeMethods.onDisconnect(); - reject(new _errors.TransportError("OpenFailed", "OpenFailed")); - }; - - socket.onmessage = e => { - if (typeof e.data !== "string") return; - const data = JSON.parse(e.data); - - switch (data.type) { - case "opened": - return resolve(exchangeMethods); - - case "error": - reject(new Error(data.error)); - return exchangeMethods.rejectExchange(new _errors.TransportError(data.error, "WSError")); - - case "response": - return exchangeMethods.resolveExchange(Buffer.from(data.data, "hex")); - } - }; - } catch (e) { - reject(e); - } - }); - return new WebSocketTransport(exchangeMethods); - } - - constructor(hook) { - super(); - this.hook = void 0; - this.hook = hook; - - hook.onDisconnect = () => { - this.emit("disconnect"); - this.hook.rejectExchange(new _errors.TransportError("WebSocket disconnected", "WSDisconnect")); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TransactionDescription = exports.LogDescription = exports.checkResultErrors = exports.Indexed = exports.Interface = exports.defaultAbiCoder = exports.AbiCoder = exports.FormatTypes = exports.ParamType = exports.FunctionFragment = exports.Fragment = exports.EventFragment = exports.ErrorFragment = exports.ConstructorFragment = void 0; +var fragments_1 = require("./fragments"); +Object.defineProperty(exports, "ConstructorFragment", { enumerable: true, get: function () { return fragments_1.ConstructorFragment; } }); +Object.defineProperty(exports, "ErrorFragment", { enumerable: true, get: function () { return fragments_1.ErrorFragment; } }); +Object.defineProperty(exports, "EventFragment", { enumerable: true, get: function () { return fragments_1.EventFragment; } }); +Object.defineProperty(exports, "FormatTypes", { enumerable: true, get: function () { return fragments_1.FormatTypes; } }); +Object.defineProperty(exports, "Fragment", { enumerable: true, get: function () { return fragments_1.Fragment; } }); +Object.defineProperty(exports, "FunctionFragment", { enumerable: true, get: function () { return fragments_1.FunctionFragment; } }); +Object.defineProperty(exports, "ParamType", { enumerable: true, get: function () { return fragments_1.ParamType; } }); +var abi_coder_1 = require("./abi-coder"); +Object.defineProperty(exports, "AbiCoder", { enumerable: true, get: function () { return abi_coder_1.AbiCoder; } }); +Object.defineProperty(exports, "defaultAbiCoder", { enumerable: true, get: function () { return abi_coder_1.defaultAbiCoder; } }); +var interface_1 = require("./interface"); +Object.defineProperty(exports, "checkResultErrors", { enumerable: true, get: function () { return interface_1.checkResultErrors; } }); +Object.defineProperty(exports, "Indexed", { enumerable: true, get: function () { return interface_1.Indexed; } }); +Object.defineProperty(exports, "Interface", { enumerable: true, get: function () { return interface_1.Interface; } }); +Object.defineProperty(exports, "LogDescription", { enumerable: true, get: function () { return interface_1.LogDescription; } }); +Object.defineProperty(exports, "TransactionDescription", { enumerable: true, get: function () { return interface_1.TransactionDescription; } }); + +},{"./abi-coder":4,"./fragments":16,"./interface":18}],18:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); }; - } - - async exchange(apdu) { - const hex = apdu.toString("hex"); - (0, _logs.log)("apdu", "=> " + hex); - const res = await new Promise((resolve, reject) => { - this.hook.rejectExchange = e => reject(e); - - this.hook.resolveExchange = b => resolve(b); - - this.hook.send(hex); - }); - (0, _logs.log)("apdu", "<= " + res.toString("hex")); - return res; - } - - setScrambleKey() {} - - async close() { - this.hook.close(); - return new Promise(success => { - setTimeout(success, 200); - }); - } - + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Interface = exports.Indexed = exports.ErrorDescription = exports.TransactionDescription = exports.LogDescription = exports.checkResultErrors = void 0; +var address_1 = require("@ethersproject/address"); +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var hash_1 = require("@ethersproject/hash"); +var keccak256_1 = require("@ethersproject/keccak256"); +var properties_1 = require("@ethersproject/properties"); +var abi_coder_1 = require("./abi-coder"); +var abstract_coder_1 = require("./coders/abstract-coder"); +Object.defineProperty(exports, "checkResultErrors", { enumerable: true, get: function () { return abstract_coder_1.checkResultErrors; } }); +var fragments_1 = require("./fragments"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var LogDescription = /** @class */ (function (_super) { + __extends(LogDescription, _super); + function LogDescription() { + return _super !== null && _super.apply(this, arguments) || this; + } + return LogDescription; +}(properties_1.Description)); +exports.LogDescription = LogDescription; +var TransactionDescription = /** @class */ (function (_super) { + __extends(TransactionDescription, _super); + function TransactionDescription() { + return _super !== null && _super.apply(this, arguments) || this; + } + return TransactionDescription; +}(properties_1.Description)); +exports.TransactionDescription = TransactionDescription; +var ErrorDescription = /** @class */ (function (_super) { + __extends(ErrorDescription, _super); + function ErrorDescription() { + return _super !== null && _super.apply(this, arguments) || this; + } + return ErrorDescription; +}(properties_1.Description)); +exports.ErrorDescription = ErrorDescription; +var Indexed = /** @class */ (function (_super) { + __extends(Indexed, _super); + function Indexed() { + return _super !== null && _super.apply(this, arguments) || this; + } + Indexed.isIndexed = function (value) { + return !!(value && value._isIndexed); + }; + return Indexed; +}(properties_1.Description)); +exports.Indexed = Indexed; +var BuiltinErrors = { + "0x08c379a0": { signature: "Error(string)", name: "Error", inputs: ["string"], reason: true }, + "0x4e487b71": { signature: "Panic(uint256)", name: "Panic", inputs: ["uint256"] } +}; +function wrapAccessError(property, error) { + var wrap = new Error("deferred error during ABI decoding triggered accessing " + property); + wrap.error = error; + return wrap; } +/* +function checkNames(fragment: Fragment, type: "input" | "output", params: Array): void { + params.reduce((accum, param) => { + if (param.name) { + if (accum[param.name]) { + logger.throwArgumentError(`duplicate ${ type } parameter ${ JSON.stringify(param.name) } in ${ fragment.format("full") }`, "fragment", fragment); + } + accum[param.name] = true; + } + return accum; + }, <{ [ name: string ]: boolean }>{ }); +} +*/ +var Interface = /** @class */ (function () { + function Interface(fragments) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, Interface); + var abi = []; + if (typeof (fragments) === "string") { + abi = JSON.parse(fragments); + } + else { + abi = fragments; + } + properties_1.defineReadOnly(this, "fragments", abi.map(function (fragment) { + return fragments_1.Fragment.from(fragment); + }).filter(function (fragment) { return (fragment != null); })); + properties_1.defineReadOnly(this, "_abiCoder", properties_1.getStatic((_newTarget), "getAbiCoder")()); + properties_1.defineReadOnly(this, "functions", {}); + properties_1.defineReadOnly(this, "errors", {}); + properties_1.defineReadOnly(this, "events", {}); + properties_1.defineReadOnly(this, "structs", {}); + // Add all fragments by their signature + this.fragments.forEach(function (fragment) { + var bucket = null; + switch (fragment.type) { + case "constructor": + if (_this.deploy) { + logger.warn("duplicate definition - constructor"); + return; + } + //checkNames(fragment, "input", fragment.inputs); + properties_1.defineReadOnly(_this, "deploy", fragment); + return; + case "function": + //checkNames(fragment, "input", fragment.inputs); + //checkNames(fragment, "output", (fragment).outputs); + bucket = _this.functions; + break; + case "event": + //checkNames(fragment, "input", fragment.inputs); + bucket = _this.events; + break; + case "error": + bucket = _this.errors; + break; + default: + return; + } + var signature = fragment.format(); + if (bucket[signature]) { + logger.warn("duplicate definition - " + signature); + return; + } + bucket[signature] = fragment; + }); + // If we do not have a constructor add a default + if (!this.deploy) { + properties_1.defineReadOnly(this, "deploy", fragments_1.ConstructorFragment.from({ + payable: false, + type: "constructor" + })); + } + properties_1.defineReadOnly(this, "_isInterface", true); + } + Interface.prototype.format = function (format) { + if (!format) { + format = fragments_1.FormatTypes.full; + } + if (format === fragments_1.FormatTypes.sighash) { + logger.throwArgumentError("interface does not support formatting sighash", "format", format); + } + var abi = this.fragments.map(function (fragment) { return fragment.format(format); }); + // We need to re-bundle the JSON fragments a bit + if (format === fragments_1.FormatTypes.json) { + return JSON.stringify(abi.map(function (j) { return JSON.parse(j); })); + } + return abi; + }; + // Sub-classes can override these to handle other blockchains + Interface.getAbiCoder = function () { + return abi_coder_1.defaultAbiCoder; + }; + Interface.getAddress = function (address) { + return address_1.getAddress(address); + }; + Interface.getSighash = function (fragment) { + return bytes_1.hexDataSlice(hash_1.id(fragment.format()), 0, 4); + }; + Interface.getEventTopic = function (eventFragment) { + return hash_1.id(eventFragment.format()); + }; + // Find a function definition by any means necessary (unless it is ambiguous) + Interface.prototype.getFunction = function (nameOrSignatureOrSighash) { + if (bytes_1.isHexString(nameOrSignatureOrSighash)) { + for (var name_1 in this.functions) { + if (nameOrSignatureOrSighash === this.getSighash(name_1)) { + return this.functions[name_1]; + } + } + logger.throwArgumentError("no matching function", "sighash", nameOrSignatureOrSighash); + } + // It is a bare name, look up the function (will return null if ambiguous) + if (nameOrSignatureOrSighash.indexOf("(") === -1) { + var name_2 = nameOrSignatureOrSighash.trim(); + var matching = Object.keys(this.functions).filter(function (f) { return (f.split("(" /* fix:) */)[0] === name_2); }); + if (matching.length === 0) { + logger.throwArgumentError("no matching function", "name", name_2); + } + else if (matching.length > 1) { + logger.throwArgumentError("multiple matching functions", "name", name_2); + } + return this.functions[matching[0]]; + } + // Normlize the signature and lookup the function + var result = this.functions[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()]; + if (!result) { + logger.throwArgumentError("no matching function", "signature", nameOrSignatureOrSighash); + } + return result; + }; + // Find an event definition by any means necessary (unless it is ambiguous) + Interface.prototype.getEvent = function (nameOrSignatureOrTopic) { + if (bytes_1.isHexString(nameOrSignatureOrTopic)) { + var topichash = nameOrSignatureOrTopic.toLowerCase(); + for (var name_3 in this.events) { + if (topichash === this.getEventTopic(name_3)) { + return this.events[name_3]; + } + } + logger.throwArgumentError("no matching event", "topichash", topichash); + } + // It is a bare name, look up the function (will return null if ambiguous) + if (nameOrSignatureOrTopic.indexOf("(") === -1) { + var name_4 = nameOrSignatureOrTopic.trim(); + var matching = Object.keys(this.events).filter(function (f) { return (f.split("(" /* fix:) */)[0] === name_4); }); + if (matching.length === 0) { + logger.throwArgumentError("no matching event", "name", name_4); + } + else if (matching.length > 1) { + logger.throwArgumentError("multiple matching events", "name", name_4); + } + return this.events[matching[0]]; + } + // Normlize the signature and lookup the function + var result = this.events[fragments_1.EventFragment.fromString(nameOrSignatureOrTopic).format()]; + if (!result) { + logger.throwArgumentError("no matching event", "signature", nameOrSignatureOrTopic); + } + return result; + }; + // Find a function definition by any means necessary (unless it is ambiguous) + Interface.prototype.getError = function (nameOrSignatureOrSighash) { + if (bytes_1.isHexString(nameOrSignatureOrSighash)) { + var getSighash = properties_1.getStatic(this.constructor, "getSighash"); + for (var name_5 in this.errors) { + var error = this.errors[name_5]; + if (nameOrSignatureOrSighash === getSighash(error)) { + return this.errors[name_5]; + } + } + logger.throwArgumentError("no matching error", "sighash", nameOrSignatureOrSighash); + } + // It is a bare name, look up the function (will return null if ambiguous) + if (nameOrSignatureOrSighash.indexOf("(") === -1) { + var name_6 = nameOrSignatureOrSighash.trim(); + var matching = Object.keys(this.errors).filter(function (f) { return (f.split("(" /* fix:) */)[0] === name_6); }); + if (matching.length === 0) { + logger.throwArgumentError("no matching error", "name", name_6); + } + else if (matching.length > 1) { + logger.throwArgumentError("multiple matching errors", "name", name_6); + } + return this.errors[matching[0]]; + } + // Normlize the signature and lookup the function + var result = this.errors[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()]; + if (!result) { + logger.throwArgumentError("no matching error", "signature", nameOrSignatureOrSighash); + } + return result; + }; + // Get the sighash (the bytes4 selector) used by Solidity to identify a function + Interface.prototype.getSighash = function (fragment) { + if (typeof (fragment) === "string") { + try { + fragment = this.getFunction(fragment); + } + catch (error) { + try { + fragment = this.getError(fragment); + } + catch (_) { + throw error; + } + } + } + return properties_1.getStatic(this.constructor, "getSighash")(fragment); + }; + // Get the topic (the bytes32 hash) used by Solidity to identify an event + Interface.prototype.getEventTopic = function (eventFragment) { + if (typeof (eventFragment) === "string") { + eventFragment = this.getEvent(eventFragment); + } + return properties_1.getStatic(this.constructor, "getEventTopic")(eventFragment); + }; + Interface.prototype._decodeParams = function (params, data) { + return this._abiCoder.decode(params, data); + }; + Interface.prototype._encodeParams = function (params, values) { + return this._abiCoder.encode(params, values); + }; + Interface.prototype.encodeDeploy = function (values) { + return this._encodeParams(this.deploy.inputs, values || []); + }; + Interface.prototype.decodeErrorResult = function (fragment, data) { + if (typeof (fragment) === "string") { + fragment = this.getError(fragment); + } + var bytes = bytes_1.arrayify(data); + if (bytes_1.hexlify(bytes.slice(0, 4)) !== this.getSighash(fragment)) { + logger.throwArgumentError("data signature does not match error " + fragment.name + ".", "data", bytes_1.hexlify(bytes)); + } + return this._decodeParams(fragment.inputs, bytes.slice(4)); + }; + Interface.prototype.encodeErrorResult = function (fragment, values) { + if (typeof (fragment) === "string") { + fragment = this.getError(fragment); + } + return bytes_1.hexlify(bytes_1.concat([ + this.getSighash(fragment), + this._encodeParams(fragment.inputs, values || []) + ])); + }; + // Decode the data for a function call (e.g. tx.data) + Interface.prototype.decodeFunctionData = function (functionFragment, data) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + var bytes = bytes_1.arrayify(data); + if (bytes_1.hexlify(bytes.slice(0, 4)) !== this.getSighash(functionFragment)) { + logger.throwArgumentError("data signature does not match function " + functionFragment.name + ".", "data", bytes_1.hexlify(bytes)); + } + return this._decodeParams(functionFragment.inputs, bytes.slice(4)); + }; + // Encode the data for a function call (e.g. tx.data) + Interface.prototype.encodeFunctionData = function (functionFragment, values) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + return bytes_1.hexlify(bytes_1.concat([ + this.getSighash(functionFragment), + this._encodeParams(functionFragment.inputs, values || []) + ])); + }; + // Decode the result from a function call (e.g. from eth_call) + Interface.prototype.decodeFunctionResult = function (functionFragment, data) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + var bytes = bytes_1.arrayify(data); + var reason = null; + var errorArgs = null; + var errorName = null; + var errorSignature = null; + switch (bytes.length % this._abiCoder._getWordSize()) { + case 0: + try { + return this._abiCoder.decode(functionFragment.outputs, bytes); + } + catch (error) { } + break; + case 4: { + var selector = bytes_1.hexlify(bytes.slice(0, 4)); + var builtin = BuiltinErrors[selector]; + if (builtin) { + errorArgs = this._abiCoder.decode(builtin.inputs, bytes.slice(4)); + errorName = builtin.name; + errorSignature = builtin.signature; + if (builtin.reason) { + reason = errorArgs[0]; + } + } + else { + try { + var error = this.getError(selector); + errorArgs = this._abiCoder.decode(error.inputs, bytes.slice(4)); + errorName = error.name; + errorSignature = error.format(); + } + catch (error) { + console.log(error); + } + } + break; + } + } + return logger.throwError("call revert exception", logger_1.Logger.errors.CALL_EXCEPTION, { + method: functionFragment.format(), + errorArgs: errorArgs, errorName: errorName, errorSignature: errorSignature, reason: reason + }); + }; + // Encode the result for a function call (e.g. for eth_call) + Interface.prototype.encodeFunctionResult = function (functionFragment, values) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + return bytes_1.hexlify(this._abiCoder.encode(functionFragment.outputs, values || [])); + }; + // Create the filter for the event with search criteria (e.g. for eth_filterLog) + Interface.prototype.encodeFilterTopics = function (eventFragment, values) { + var _this = this; + if (typeof (eventFragment) === "string") { + eventFragment = this.getEvent(eventFragment); + } + if (values.length > eventFragment.inputs.length) { + logger.throwError("too many arguments for " + eventFragment.format(), logger_1.Logger.errors.UNEXPECTED_ARGUMENT, { + argument: "values", + value: values + }); + } + var topics = []; + if (!eventFragment.anonymous) { + topics.push(this.getEventTopic(eventFragment)); + } + var encodeTopic = function (param, value) { + if (param.type === "string") { + return hash_1.id(value); + } + else if (param.type === "bytes") { + return keccak256_1.keccak256(bytes_1.hexlify(value)); + } + // Check addresses are valid + if (param.type === "address") { + _this._abiCoder.encode(["address"], [value]); + } + return bytes_1.hexZeroPad(bytes_1.hexlify(value), 32); + }; + values.forEach(function (value, index) { + var param = eventFragment.inputs[index]; + if (!param.indexed) { + if (value != null) { + logger.throwArgumentError("cannot filter non-indexed parameters; must be null", ("contract." + param.name), value); + } + return; + } + if (value == null) { + topics.push(null); + } + else if (param.baseType === "array" || param.baseType === "tuple") { + logger.throwArgumentError("filtering with tuples or arrays not supported", ("contract." + param.name), value); + } + else if (Array.isArray(value)) { + topics.push(value.map(function (value) { return encodeTopic(param, value); })); + } + else { + topics.push(encodeTopic(param, value)); + } + }); + // Trim off trailing nulls + while (topics.length && topics[topics.length - 1] === null) { + topics.pop(); + } + return topics; + }; + Interface.prototype.encodeEventLog = function (eventFragment, values) { + var _this = this; + if (typeof (eventFragment) === "string") { + eventFragment = this.getEvent(eventFragment); + } + var topics = []; + var dataTypes = []; + var dataValues = []; + if (!eventFragment.anonymous) { + topics.push(this.getEventTopic(eventFragment)); + } + if (values.length !== eventFragment.inputs.length) { + logger.throwArgumentError("event arguments/values mismatch", "values", values); + } + eventFragment.inputs.forEach(function (param, index) { + var value = values[index]; + if (param.indexed) { + if (param.type === "string") { + topics.push(hash_1.id(value)); + } + else if (param.type === "bytes") { + topics.push(keccak256_1.keccak256(value)); + } + else if (param.baseType === "tuple" || param.baseType === "array") { + // @TOOD + throw new Error("not implemented"); + } + else { + topics.push(_this._abiCoder.encode([param.type], [value])); + } + } + else { + dataTypes.push(param); + dataValues.push(value); + } + }); + return { + data: this._abiCoder.encode(dataTypes, dataValues), + topics: topics + }; + }; + // Decode a filter for the event and the search criteria + Interface.prototype.decodeEventLog = function (eventFragment, data, topics) { + if (typeof (eventFragment) === "string") { + eventFragment = this.getEvent(eventFragment); + } + if (topics != null && !eventFragment.anonymous) { + var topicHash = this.getEventTopic(eventFragment); + if (!bytes_1.isHexString(topics[0], 32) || topics[0].toLowerCase() !== topicHash) { + logger.throwError("fragment/topic mismatch", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: "topics[0]", expected: topicHash, value: topics[0] }); + } + topics = topics.slice(1); + } + var indexed = []; + var nonIndexed = []; + var dynamic = []; + eventFragment.inputs.forEach(function (param, index) { + if (param.indexed) { + if (param.type === "string" || param.type === "bytes" || param.baseType === "tuple" || param.baseType === "array") { + indexed.push(fragments_1.ParamType.fromObject({ type: "bytes32", name: param.name })); + dynamic.push(true); + } + else { + indexed.push(param); + dynamic.push(false); + } + } + else { + nonIndexed.push(param); + dynamic.push(false); + } + }); + var resultIndexed = (topics != null) ? this._abiCoder.decode(indexed, bytes_1.concat(topics)) : null; + var resultNonIndexed = this._abiCoder.decode(nonIndexed, data, true); + var result = []; + var nonIndexedIndex = 0, indexedIndex = 0; + eventFragment.inputs.forEach(function (param, index) { + if (param.indexed) { + if (resultIndexed == null) { + result[index] = new Indexed({ _isIndexed: true, hash: null }); + } + else if (dynamic[index]) { + result[index] = new Indexed({ _isIndexed: true, hash: resultIndexed[indexedIndex++] }); + } + else { + try { + result[index] = resultIndexed[indexedIndex++]; + } + catch (error) { + result[index] = error; + } + } + } + else { + try { + result[index] = resultNonIndexed[nonIndexedIndex++]; + } + catch (error) { + result[index] = error; + } + } + // Add the keyword argument if named and safe + if (param.name && result[param.name] == null) { + var value_1 = result[index]; + // Make error named values throw on access + if (value_1 instanceof Error) { + Object.defineProperty(result, param.name, { + get: function () { throw wrapAccessError("property " + JSON.stringify(param.name), value_1); } + }); + } + else { + result[param.name] = value_1; + } + } + }); + var _loop_1 = function (i) { + var value = result[i]; + if (value instanceof Error) { + Object.defineProperty(result, i, { + get: function () { throw wrapAccessError("index " + i, value); } + }); + } + }; + // Make all error indexed values throw on access + for (var i = 0; i < result.length; i++) { + _loop_1(i); + } + return Object.freeze(result); + }; + // Given a transaction, find the matching function fragment (if any) and + // determine all its properties and call parameters + Interface.prototype.parseTransaction = function (tx) { + var fragment = this.getFunction(tx.data.substring(0, 10).toLowerCase()); + if (!fragment) { + return null; + } + return new TransactionDescription({ + args: this._abiCoder.decode(fragment.inputs, "0x" + tx.data.substring(10)), + functionFragment: fragment, + name: fragment.name, + signature: fragment.format(), + sighash: this.getSighash(fragment), + value: bignumber_1.BigNumber.from(tx.value || "0"), + }); + }; + // @TODO + //parseCallResult(data: BytesLike): ?? + // Given an event log, find the matching event fragment (if any) and + // determine all its properties and values + Interface.prototype.parseLog = function (log) { + var fragment = this.getEvent(log.topics[0]); + if (!fragment || fragment.anonymous) { + return null; + } + // @TODO: If anonymous, and the only method, and the input count matches, should we parse? + // Probably not, because just because it is the only event in the ABI does + // not mean we have the full ABI; maybe jsut a fragment? + return new LogDescription({ + eventFragment: fragment, + name: fragment.name, + signature: fragment.format(), + topic: this.getEventTopic(fragment), + args: this.decodeEventLog(fragment, log.data, log.topics) + }); + }; + Interface.prototype.parseError = function (data) { + var hexData = bytes_1.hexlify(data); + var fragment = this.getError(hexData.substring(0, 10).toLowerCase()); + if (!fragment) { + return null; + } + return new ErrorDescription({ + args: this._abiCoder.decode(fragment.inputs, "0x" + hexData.substring(10)), + errorFragment: fragment, + name: fragment.name, + signature: fragment.format(), + sighash: this.getSighash(fragment), + }); + }; + /* + static from(value: Array | string | Interface) { + if (Interface.isInterface(value)) { + return value; + } + if (typeof(value) === "string") { + return new Interface(JSON.parse(value)); + } + return new Interface(value); + } + */ + Interface.isInterface = function (value) { + return !!(value && value._isInterface); + }; + return Interface; +}()); +exports.Interface = Interface; -exports.default = WebSocketTransport; - -WebSocketTransport.isSupported = () => Promise.resolve(typeof WebSocket === "function"); - -WebSocketTransport.list = () => Promise.resolve([]); - -WebSocketTransport.listen = _observer => ({ - unsubscribe: () => {} -}); - -WebSocketTransport.check = async (url, timeout = 5000) => new Promise((resolve, reject) => { - const socket = new WebSocket(url); - let success = false; - setTimeout(() => { - socket.close(); - }, timeout); - - socket.onopen = () => { - success = true; - socket.close(); - }; - - socket.onclose = () => { - if (success) resolve();else { - reject(new _errors.TransportError("failed to access WebSocketTransport(" + url + ")", "WebSocketTransportNotAccessible")); - } - }; - - socket.onerror = () => { - reject(new _errors.TransportError("failed to access WebSocketTransport(" + url + "): error", "WebSocketTransportNotAccessible")); - }; -}); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) -},{"@ledgerhq/errors":10,"@ledgerhq/hw-transport":11,"@ledgerhq/logs":12,"buffer":20,"ws":27}],10:[function(require,module,exports){ -arguments[4][4][0].apply(exports,arguments) -},{"dup":4}],11:[function(require,module,exports){ -(function (Buffer){ +},{"./_version":3,"./abi-coder":4,"./coders/abstract-coder":5,"./fragments":16,"@ethersproject/address":24,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/hash":43,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/properties":63}],19:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "abstract-provider/5.4.1"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "TransportError", { - enumerable: true, - get: function () { - return _errors.TransportError; - } -}); -Object.defineProperty(exports, "StatusCodes", { - enumerable: true, - get: function () { - return _errors.StatusCodes; - } -}); -Object.defineProperty(exports, "getAltStatusMessage", { - enumerable: true, - get: function () { - return _errors.getAltStatusMessage; - } -}); -Object.defineProperty(exports, "TransportStatusError", { - enumerable: true, - get: function () { - return _errors.TransportStatusError; - } -}); -exports.default = void 0; - -var _events = _interopRequireDefault(require("events")); - -var _errors = require("@ledgerhq/errors"); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Transport defines the generic interface to share between node/u2f impl - * A **Descriptor** is a parametric type that is up to be determined for the implementation. - * it can be for instance an ID, an file path, a URL,... - */ -class Transport { - constructor() { - this.exchangeTimeout = 30000; - this.unresponsiveTimeout = 15000; - this.deviceModel = null; - this._events = new _events.default(); - - this.send = async (cla, ins, p1, p2, data = Buffer.alloc(0), statusList = [_errors.StatusCodes.OK]) => { - if (data.length >= 256) { - throw new _errors.TransportError("data.length exceed 256 bytes limit. Got: " + data.length, "DataLengthTooBig"); - } - - const response = await this.exchange(Buffer.concat([Buffer.from([cla, ins, p1, p2]), Buffer.from([data.length]), data])); - const sw = response.readUInt16BE(response.length - 2); - - if (!statusList.some(s => s === sw)) { - throw new _errors.TransportStatusError(sw); - } - - return response; +},{}],20:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Provider = exports.TransactionOrderForkEvent = exports.TransactionForkEvent = exports.BlockForkEvent = exports.ForkEvent = void 0; +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +; +; +//export type CallTransactionable = { +// call(transaction: TransactionRequest): Promise; +//}; +var ForkEvent = /** @class */ (function (_super) { + __extends(ForkEvent, _super); + function ForkEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + ForkEvent.isForkEvent = function (value) { + return !!(value && value._isForkEvent); + }; + return ForkEvent; +}(properties_1.Description)); +exports.ForkEvent = ForkEvent; +var BlockForkEvent = /** @class */ (function (_super) { + __extends(BlockForkEvent, _super); + function BlockForkEvent(blockHash, expiry) { + var _this = this; + if (!bytes_1.isHexString(blockHash, 32)) { + logger.throwArgumentError("invalid blockHash", "blockHash", blockHash); + } + _this = _super.call(this, { + _isForkEvent: true, + _isBlockForkEvent: true, + expiry: (expiry || 0), + blockHash: blockHash + }) || this; + return _this; + } + return BlockForkEvent; +}(ForkEvent)); +exports.BlockForkEvent = BlockForkEvent; +var TransactionForkEvent = /** @class */ (function (_super) { + __extends(TransactionForkEvent, _super); + function TransactionForkEvent(hash, expiry) { + var _this = this; + if (!bytes_1.isHexString(hash, 32)) { + logger.throwArgumentError("invalid transaction hash", "hash", hash); + } + _this = _super.call(this, { + _isForkEvent: true, + _isTransactionForkEvent: true, + expiry: (expiry || 0), + hash: hash + }) || this; + return _this; + } + return TransactionForkEvent; +}(ForkEvent)); +exports.TransactionForkEvent = TransactionForkEvent; +var TransactionOrderForkEvent = /** @class */ (function (_super) { + __extends(TransactionOrderForkEvent, _super); + function TransactionOrderForkEvent(beforeHash, afterHash, expiry) { + var _this = this; + if (!bytes_1.isHexString(beforeHash, 32)) { + logger.throwArgumentError("invalid transaction hash", "beforeHash", beforeHash); + } + if (!bytes_1.isHexString(afterHash, 32)) { + logger.throwArgumentError("invalid transaction hash", "afterHash", afterHash); + } + _this = _super.call(this, { + _isForkEvent: true, + _isTransactionOrderForkEvent: true, + expiry: (expiry || 0), + beforeHash: beforeHash, + afterHash: afterHash + }) || this; + return _this; + } + return TransactionOrderForkEvent; +}(ForkEvent)); +exports.TransactionOrderForkEvent = TransactionOrderForkEvent; +/////////////////////////////// +// Exported Abstracts +var Provider = /** @class */ (function () { + function Provider() { + var _newTarget = this.constructor; + logger.checkAbstract(_newTarget, Provider); + properties_1.defineReadOnly(this, "_isProvider", true); + } + Provider.prototype.getFeeData = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, block, gasPrice, maxFeePerGas, maxPriorityFeePerGas; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, properties_1.resolveProperties({ + block: this.getBlock("latest"), + gasPrice: this.getGasPrice().catch(function (error) { + // @TODO: Why is this now failing on Calaveras? + //console.log(error); + return null; + }) + })]; + case 1: + _a = _b.sent(), block = _a.block, gasPrice = _a.gasPrice; + maxFeePerGas = null, maxPriorityFeePerGas = null; + if (block && block.baseFeePerGas) { + // We may want to compute this more accurately in the future, + // using the formula "check if the base fee is correct". + // See: https://eips.ethereum.org/EIPS/eip-1559 + maxPriorityFeePerGas = bignumber_1.BigNumber.from("2500000000"); + maxFeePerGas = block.baseFeePerGas.mul(2).add(maxPriorityFeePerGas); + } + return [2 /*return*/, { maxFeePerGas: maxFeePerGas, maxPriorityFeePerGas: maxPriorityFeePerGas, gasPrice: gasPrice }]; + } + }); + }); + }; + // Alias for "on" + Provider.prototype.addListener = function (eventName, listener) { + return this.on(eventName, listener); + }; + // Alias for "off" + Provider.prototype.removeListener = function (eventName, listener) { + return this.off(eventName, listener); + }; + Provider.isProvider = function (value) { + return !!(value && value._isProvider); + }; + return Provider; +}()); +exports.Provider = Provider; - this.exchangeBusyPromise = void 0; - - this.exchangeAtomicImpl = async f => { - if (this.exchangeBusyPromise) { - throw new _errors.TransportRaceCondition("An action was already pending on the Ledger device. Please deny or reconnect."); - } +},{"./_version":19,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/properties":63}],21:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "abstract-signer/5.4.1"; - let resolveBusy; - const busyPromise = new Promise(r => { - resolveBusy = r; - }); - this.exchangeBusyPromise = busyPromise; - let unresponsiveReached = false; - const timeout = setTimeout(() => { - unresponsiveReached = true; - this.emit("unresponsive"); - }, this.unresponsiveTimeout); - - try { - const res = await f(); - - if (unresponsiveReached) { - this.emit("responsive"); +},{}],22:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VoidSigner = exports.Signer = void 0; +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var allowedTransactionKeys = [ + "accessList", "chainId", "data", "from", "gasLimit", "gasPrice", "maxFeePerGas", "maxPriorityFeePerGas", "nonce", "to", "type", "value" +]; +var forwardErrors = [ + logger_1.Logger.errors.INSUFFICIENT_FUNDS, + logger_1.Logger.errors.NONCE_EXPIRED, + logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, +]; +; +; +var Signer = /** @class */ (function () { + /////////////////// + // Sub-classes MUST call super + function Signer() { + var _newTarget = this.constructor; + logger.checkAbstract(_newTarget, Signer); + properties_1.defineReadOnly(this, "_isSigner", true); + } + /////////////////// + // Sub-classes MAY override these + Signer.prototype.getBalance = function (blockTag) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("getBalance"); + return [4 /*yield*/, this.provider.getBalance(this.getAddress(), blockTag)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + Signer.prototype.getTransactionCount = function (blockTag) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("getTransactionCount"); + return [4 /*yield*/, this.provider.getTransactionCount(this.getAddress(), blockTag)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + // Populates "from" if unspecified, and estimates the gas for the transation + Signer.prototype.estimateGas = function (transaction) { + return __awaiter(this, void 0, void 0, function () { + var tx; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("estimateGas"); + return [4 /*yield*/, properties_1.resolveProperties(this.checkTransaction(transaction))]; + case 1: + tx = _a.sent(); + return [4 /*yield*/, this.provider.estimateGas(tx)]; + case 2: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + // Populates "from" if unspecified, and calls with the transation + Signer.prototype.call = function (transaction, blockTag) { + return __awaiter(this, void 0, void 0, function () { + var tx; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("call"); + return [4 /*yield*/, properties_1.resolveProperties(this.checkTransaction(transaction))]; + case 1: + tx = _a.sent(); + return [4 /*yield*/, this.provider.call(tx, blockTag)]; + case 2: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + // Populates all fields in a transaction, signs it and sends it to the network + Signer.prototype.sendTransaction = function (transaction) { + return __awaiter(this, void 0, void 0, function () { + var tx, signedTx; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("sendTransaction"); + return [4 /*yield*/, this.populateTransaction(transaction)]; + case 1: + tx = _a.sent(); + return [4 /*yield*/, this.signTransaction(tx)]; + case 2: + signedTx = _a.sent(); + return [4 /*yield*/, this.provider.sendTransaction(signedTx)]; + case 3: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + Signer.prototype.getChainId = function () { + return __awaiter(this, void 0, void 0, function () { + var network; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("getChainId"); + return [4 /*yield*/, this.provider.getNetwork()]; + case 1: + network = _a.sent(); + return [2 /*return*/, network.chainId]; + } + }); + }); + }; + Signer.prototype.getGasPrice = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("getGasPrice"); + return [4 /*yield*/, this.provider.getGasPrice()]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + Signer.prototype.getFeeData = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("getFeeData"); + return [4 /*yield*/, this.provider.getFeeData()]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + Signer.prototype.resolveName = function (name) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this._checkProvider("resolveName"); + return [4 /*yield*/, this.provider.resolveName(name)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + // Checks a transaction does not contain invalid keys and if + // no "from" is provided, populates it. + // - does NOT require a provider + // - adds "from" is not present + // - returns a COPY (safe to mutate the result) + // By default called from: (overriding these prevents it) + // - call + // - estimateGas + // - populateTransaction (and therefor sendTransaction) + Signer.prototype.checkTransaction = function (transaction) { + for (var key in transaction) { + if (allowedTransactionKeys.indexOf(key) === -1) { + logger.throwArgumentError("invalid transaction key: " + key, "transaction", transaction); + } } - - return res; - } finally { - clearTimeout(timeout); - if (resolveBusy) resolveBusy(); - this.exchangeBusyPromise = null; - } + var tx = properties_1.shallowCopy(transaction); + if (tx.from == null) { + tx.from = this.getAddress(); + } + else { + // Make sure any provided address matches this signer + tx.from = Promise.all([ + Promise.resolve(tx.from), + this.getAddress() + ]).then(function (result) { + if (result[0].toLowerCase() !== result[1].toLowerCase()) { + logger.throwArgumentError("from address mismatch", "transaction", transaction); + } + return result[0]; + }); + } + return tx; }; + // Populates ALL keys for a transaction and checks that "from" matches + // this Signer. Should be used by sendTransaction but NOT by signTransaction. + // By default called from: (overriding these prevents it) + // - sendTransaction + // + // Notes: + // - We allow gasPrice for EIP-1559 as long as it matches maxFeePerGas + Signer.prototype.populateTransaction = function (transaction) { + return __awaiter(this, void 0, void 0, function () { + var tx, hasEip1559, feeData, gasPrice; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, properties_1.resolveProperties(this.checkTransaction(transaction))]; + case 1: + tx = _a.sent(); + if (tx.to != null) { + tx.to = Promise.resolve(tx.to).then(function (to) { return __awaiter(_this, void 0, void 0, function () { + var address; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (to == null) { + return [2 /*return*/, null]; + } + return [4 /*yield*/, this.resolveName(to)]; + case 1: + address = _a.sent(); + if (address == null) { + logger.throwArgumentError("provided ENS name resolves to null", "tx.to", to); + } + return [2 /*return*/, address]; + } + }); + }); }); + // Prevent this error from causing an UnhandledPromiseException + tx.to.catch(function (error) { }); + } + hasEip1559 = (tx.maxFeePerGas != null || tx.maxPriorityFeePerGas != null); + if (tx.gasPrice != null && (tx.type === 2 || hasEip1559)) { + logger.throwArgumentError("eip-1559 transaction do not support gasPrice", "transaction", transaction); + } + else if ((tx.type === 0 || tx.type === 1) && hasEip1559) { + logger.throwArgumentError("pre-eip-1559 transaction do not support maxFeePerGas/maxPriorityFeePerGas", "transaction", transaction); + } + if (!((tx.type === 2 || tx.type == null) && (tx.maxFeePerGas != null && tx.maxPriorityFeePerGas != null))) return [3 /*break*/, 2]; + // Fully-formed EIP-1559 transaction (skip getFeeData) + tx.type = 2; + return [3 /*break*/, 5]; + case 2: + if (!(tx.type === 0 || tx.type === 1)) return [3 /*break*/, 3]; + // Explicit Legacy or EIP-2930 transaction + // Populate missing gasPrice + if (tx.gasPrice == null) { + tx.gasPrice = this.getGasPrice(); + } + return [3 /*break*/, 5]; + case 3: return [4 /*yield*/, this.getFeeData()]; + case 4: + feeData = _a.sent(); + if (tx.type == null) { + // We need to auto-detect the intended type of this transaction... + if (feeData.maxFeePerGas != null && feeData.maxPriorityFeePerGas != null) { + // The network supports EIP-1559! + // Upgrade transaction from null to eip-1559 + tx.type = 2; + if (tx.gasPrice != null) { + gasPrice = tx.gasPrice; + delete tx.gasPrice; + tx.maxFeePerGas = gasPrice; + tx.maxPriorityFeePerGas = gasPrice; + } + else { + // Populate missing fee data + if (tx.maxFeePerGas == null) { + tx.maxFeePerGas = feeData.maxFeePerGas; + } + if (tx.maxPriorityFeePerGas == null) { + tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas; + } + } + } + else if (feeData.gasPrice != null) { + // Network doesn't support EIP-1559... + // ...but they are trying to use EIP-1559 properties + if (hasEip1559) { + logger.throwError("network does not support EIP-1559", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "populateTransaction" + }); + } + // Populate missing fee data + if (tx.gasPrice == null) { + tx.gasPrice = feeData.gasPrice; + } + // Explicitly set untyped transaction to legacy + tx.type = 0; + } + else { + // getFeeData has failed us. + logger.throwError("failed to get consistent fee data", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "signer.getFeeData" + }); + } + } + else if (tx.type === 2) { + // Explicitly using EIP-1559 + // Populate missing fee data + if (tx.maxFeePerGas == null) { + tx.maxFeePerGas = feeData.maxFeePerGas; + } + if (tx.maxPriorityFeePerGas == null) { + tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas; + } + } + _a.label = 5; + case 5: + if (tx.nonce == null) { + tx.nonce = this.getTransactionCount("pending"); + } + if (tx.gasLimit == null) { + tx.gasLimit = this.estimateGas(tx).catch(function (error) { + if (forwardErrors.indexOf(error.code) >= 0) { + throw error; + } + return logger.throwError("cannot estimate gas; transaction may fail or may require manual gas limit", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, { + error: error, + tx: tx + }); + }); + } + if (tx.chainId == null) { + tx.chainId = this.getChainId(); + } + else { + tx.chainId = Promise.all([ + Promise.resolve(tx.chainId), + this.getChainId() + ]).then(function (results) { + if (results[1] !== 0 && results[0] !== results[1]) { + logger.throwArgumentError("chainId address mismatch", "transaction", transaction); + } + return results[0]; + }); + } + return [4 /*yield*/, properties_1.resolveProperties(tx)]; + case 6: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + /////////////////// + // Sub-classes SHOULD leave these alone + Signer.prototype._checkProvider = function (operation) { + if (!this.provider) { + logger.throwError("missing provider", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: (operation || "_checkProvider") + }); + } + }; + Signer.isSigner = function (value) { + return !!(value && value._isSigner); + }; + return Signer; +}()); +exports.Signer = Signer; +var VoidSigner = /** @class */ (function (_super) { + __extends(VoidSigner, _super); + function VoidSigner(address, provider) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, VoidSigner); + _this = _super.call(this) || this; + properties_1.defineReadOnly(_this, "address", address); + properties_1.defineReadOnly(_this, "provider", provider || null); + return _this; + } + VoidSigner.prototype.getAddress = function () { + return Promise.resolve(this.address); + }; + VoidSigner.prototype._fail = function (message, operation) { + return Promise.resolve().then(function () { + logger.throwError(message, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: operation }); + }); + }; + VoidSigner.prototype.signMessage = function (message) { + return this._fail("VoidSigner cannot sign messages", "signMessage"); + }; + VoidSigner.prototype.signTransaction = function (transaction) { + return this._fail("VoidSigner cannot sign transactions", "signTransaction"); + }; + VoidSigner.prototype._signTypedData = function (domain, types, value) { + return this._fail("VoidSigner cannot sign typed data", "signTypedData"); + }; + VoidSigner.prototype.connect = function (provider) { + return new VoidSigner(this.address, provider); + }; + return VoidSigner; +}(Signer)); +exports.VoidSigner = VoidSigner; - this._appAPIlock = null; - } - - /** - * low level api to communicate with the device - * This method is for implementations to implement but should not be directly called. - * Instead, the recommanded way is to use send() method - * @param apdu the data to send - * @return a Promise of response data - */ - exchange(_apdu) { - throw new Error("exchange not implemented"); - } - /** - * set the "scramble key" for the next exchanges with the device. - * Each App can have a different scramble key and they internally will set it at instanciation. - * @param key the scramble key - */ - - - setScrambleKey(_key) {} - /** - * close the exchange with the device. - * @return a Promise that ends when the transport is closed. - */ - - - close() { - return Promise.resolve(); - } - - /** - * Listen to an event on an instance of transport. - * Transport implementation can have specific events. Here is the common events: - * * `"disconnect"` : triggered if Transport is disconnected - */ - on(eventName, cb) { - this._events.on(eventName, cb); - } - /** - * Stop listening to an event on an instance of transport. - */ - - - off(eventName, cb) { - this._events.removeListener(eventName, cb); - } - - emit(event, ...args) { - this._events.emit(event, ...args); - } - /** - * Enable or not logs of the binary exchange - */ - - - setDebugMode() { - console.warn("setDebugMode is deprecated. use @ledgerhq/logs instead. No logs are emitted in this anymore."); - } - /** - * Set a timeout (in milliseconds) for the exchange call. Only some transport might implement it. (e.g. U2F) - */ - - - setExchangeTimeout(exchangeTimeout) { - this.exchangeTimeout = exchangeTimeout; - } - /** - * Define the delay before emitting "unresponsive" on an exchange that does not respond - */ - - - setExchangeUnresponsiveTimeout(unresponsiveTimeout) { - this.unresponsiveTimeout = unresponsiveTimeout; - } - /** - * wrapper on top of exchange to simplify work of the implementation. - * @param cla - * @param ins - * @param p1 - * @param p2 - * @param data - * @param statusList is a list of accepted status code (shorts). [0x9000] by default - * @return a Promise of response buffer - */ - - - /** - * create() allows to open the first descriptor available or - * throw if there is none or if timeout is reached. - * This is a light helper, alternative to using listen() and open() (that you may need for any more advanced usecase) - * @example - TransportFoo.create().then(transport => ...) - */ - static create(openTimeout = 3000, listenTimeout) { - return new Promise((resolve, reject) => { - let found = false; - const sub = this.listen({ - next: e => { - found = true; - if (sub) sub.unsubscribe(); - if (listenTimeoutId) clearTimeout(listenTimeoutId); - this.open(e.descriptor, openTimeout).then(resolve, reject); - }, - error: e => { - if (listenTimeoutId) clearTimeout(listenTimeoutId); - reject(e); - }, - complete: () => { - if (listenTimeoutId) clearTimeout(listenTimeoutId); +},{"./_version":21,"@ethersproject/logger":57,"@ethersproject/properties":63}],23:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "address/5.4.0"; - if (!found) { - reject(new _errors.TransportError(this.ErrorMessage_NoDeviceFound, "NoDeviceFound")); - } +},{}],24:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getCreate2Address = exports.getContractAddress = exports.getIcapAddress = exports.isAddress = exports.getAddress = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var bignumber_1 = require("@ethersproject/bignumber"); +var keccak256_1 = require("@ethersproject/keccak256"); +var rlp_1 = require("@ethersproject/rlp"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +function getChecksumAddress(address) { + if (!bytes_1.isHexString(address, 20)) { + logger.throwArgumentError("invalid address", "address", address); + } + address = address.toLowerCase(); + var chars = address.substring(2).split(""); + var expanded = new Uint8Array(40); + for (var i = 0; i < 40; i++) { + expanded[i] = chars[i].charCodeAt(0); + } + var hashed = bytes_1.arrayify(keccak256_1.keccak256(expanded)); + for (var i = 0; i < 40; i += 2) { + if ((hashed[i >> 1] >> 4) >= 8) { + chars[i] = chars[i].toUpperCase(); } - }); - const listenTimeoutId = listenTimeout ? setTimeout(() => { - sub.unsubscribe(); - reject(new _errors.TransportError(this.ErrorMessage_ListenTimeout, "ListenTimeout")); - }, listenTimeout) : null; - }); - } + if ((hashed[i >> 1] & 0x0f) >= 8) { + chars[i + 1] = chars[i + 1].toUpperCase(); + } + } + return "0x" + chars.join(""); +} +// Shims for environments that are missing some required constants and functions +var MAX_SAFE_INTEGER = 0x1fffffffffffff; +function log10(x) { + if (Math.log10) { + return Math.log10(x); + } + return Math.log(x) / Math.LN10; +} +// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number +// Create lookup table +var ibanLookup = {}; +for (var i = 0; i < 10; i++) { + ibanLookup[String(i)] = String(i); +} +for (var i = 0; i < 26; i++) { + ibanLookup[String.fromCharCode(65 + i)] = String(10 + i); +} +// How many decimal digits can we process? (for 64-bit float, this is 15) +var safeDigits = Math.floor(log10(MAX_SAFE_INTEGER)); +function ibanChecksum(address) { + address = address.toUpperCase(); + address = address.substring(4) + address.substring(0, 2) + "00"; + var expanded = address.split("").map(function (c) { return ibanLookup[c]; }).join(""); + // Javascript can handle integers safely up to 15 (decimal) digits + while (expanded.length >= safeDigits) { + var block = expanded.substring(0, safeDigits); + expanded = parseInt(block, 10) % 97 + expanded.substring(block.length); + } + var checksum = String(98 - (parseInt(expanded, 10) % 97)); + while (checksum.length < 2) { + checksum = "0" + checksum; + } + return checksum; +} +; +function getAddress(address) { + var result = null; + if (typeof (address) !== "string") { + logger.throwArgumentError("invalid address", "address", address); + } + if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) { + // Missing the 0x prefix + if (address.substring(0, 2) !== "0x") { + address = "0x" + address; + } + result = getChecksumAddress(address); + // It is a checksummed address with a bad checksum + if (address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) && result !== address) { + logger.throwArgumentError("bad address checksum", "address", address); + } + // Maybe ICAP? (we only support direct mode) + } + else if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) { + // It is an ICAP address with a bad checksum + if (address.substring(2, 4) !== ibanChecksum(address)) { + logger.throwArgumentError("bad icap checksum", "address", address); + } + result = bignumber_1._base36To16(address.substring(4)); + while (result.length < 40) { + result = "0" + result; + } + result = getChecksumAddress("0x" + result); + } + else { + logger.throwArgumentError("invalid address", "address", address); + } + return result; +} +exports.getAddress = getAddress; +function isAddress(address) { + try { + getAddress(address); + return true; + } + catch (error) { } + return false; +} +exports.isAddress = isAddress; +function getIcapAddress(address) { + var base36 = bignumber_1._base16To36(getAddress(address).substring(2)).toUpperCase(); + while (base36.length < 30) { + base36 = "0" + base36; + } + return "XE" + ibanChecksum("XE00" + base36) + base36; +} +exports.getIcapAddress = getIcapAddress; +// http://ethereum.stackexchange.com/questions/760/how-is-the-address-of-an-ethereum-contract-computed +function getContractAddress(transaction) { + var from = null; + try { + from = getAddress(transaction.from); + } + catch (error) { + logger.throwArgumentError("missing from address", "transaction", transaction); + } + var nonce = bytes_1.stripZeros(bytes_1.arrayify(bignumber_1.BigNumber.from(transaction.nonce).toHexString())); + return getAddress(bytes_1.hexDataSlice(keccak256_1.keccak256(rlp_1.encode([from, nonce])), 12)); +} +exports.getContractAddress = getContractAddress; +function getCreate2Address(from, salt, initCodeHash) { + if (bytes_1.hexDataLength(salt) !== 32) { + logger.throwArgumentError("salt must be 32 bytes", "salt", salt); + } + if (bytes_1.hexDataLength(initCodeHash) !== 32) { + logger.throwArgumentError("initCodeHash must be 32 bytes", "initCodeHash", initCodeHash); + } + return getAddress(bytes_1.hexDataSlice(keccak256_1.keccak256(bytes_1.concat(["0xff", getAddress(from), salt, initCodeHash])), 12)); +} +exports.getCreate2Address = getCreate2Address; - decorateAppAPIMethods(self, methods, scrambleKey) { - for (let methodName of methods) { - self[methodName] = this.decorateAppAPIMethod(methodName, self[methodName], self, scrambleKey); +},{"./_version":23,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/rlp":87}],25:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.encode = exports.decode = void 0; +var bytes_1 = require("@ethersproject/bytes"); +function decode(textData) { + textData = atob(textData); + var data = []; + for (var i = 0; i < textData.length; i++) { + data.push(textData.charCodeAt(i)); + } + return bytes_1.arrayify(data); +} +exports.decode = decode; +function encode(data) { + data = bytes_1.arrayify(data); + var textData = ""; + for (var i = 0; i < data.length; i++) { + textData += String.fromCharCode(data[i]); } - } + return btoa(textData); +} +exports.encode = encode; - decorateAppAPIMethod(methodName, f, ctx, scrambleKey) { - return async (...args) => { - const { - _appAPIlock - } = this; +},{"@ethersproject/bytes":33}],26:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.encode = exports.decode = void 0; +var base64_1 = require("./base64"); +Object.defineProperty(exports, "decode", { enumerable: true, get: function () { return base64_1.decode; } }); +Object.defineProperty(exports, "encode", { enumerable: true, get: function () { return base64_1.encode; } }); - if (_appAPIlock) { - return Promise.reject(new _errors.TransportError("Ledger Device is busy (lock " + _appAPIlock + ")", "TransportLocked")); - } - - try { - this._appAPIlock = methodName; - this.setScrambleKey(scrambleKey); - return await f.apply(ctx, args); - } finally { - this._appAPIlock = null; - } - }; - } - -} - -exports.default = Transport; -Transport.isSupported = void 0; -Transport.list = void 0; -Transport.listen = void 0; -Transport.open = void 0; -Transport.ErrorMessage_ListenTimeout = "No Ledger device found (timeout)"; -Transport.ErrorMessage_NoDeviceFound = "No Ledger device found"; - -}).call(this,require("buffer").Buffer) -},{"@ledgerhq/errors":10,"buffer":20,"events":21}],12:[function(require,module,exports){ +},{"./base64":25}],27:[function(require,module,exports){ "use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.listen = exports.log = void 0; - -/** - * A Log object - */ -let id = 0; -const subscribers = []; /** - * log something - * @param type a namespaced identifier of the log (it is not a level like "debug", "error" but more like "apdu-in", "apdu-out", etc...) - * @param message a clear message of the log associated to the type + * var basex = require("base-x"); + * + * This implementation is heavily based on base-x. The main reason to + * deviate was to prevent the dependency of Buffer. + * + * Contributors: + * + * base-x encoding + * Forked from https://github.com/cryptocoinjs/bs58 + * Originally written by Mike Hearn for BitcoinJ + * Copyright (c) 2011 Google Inc + * Ported to JavaScript by Stefan Thomas + * Merged Buffer refactorings from base58-native by Stephen Pair + * Copyright (c) 2013 BitPay Inc + * + * The MIT License (MIT) + * + * Copyright base-x contributors (c) 2016 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Base58 = exports.Base32 = exports.BaseX = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var properties_1 = require("@ethersproject/properties"); +var BaseX = /** @class */ (function () { + function BaseX(alphabet) { + properties_1.defineReadOnly(this, "alphabet", alphabet); + properties_1.defineReadOnly(this, "base", alphabet.length); + properties_1.defineReadOnly(this, "_alphabetMap", {}); + properties_1.defineReadOnly(this, "_leader", alphabet.charAt(0)); + // pre-compute lookup table + for (var i = 0; i < alphabet.length; i++) { + this._alphabetMap[alphabet.charAt(i)] = i; + } + } + BaseX.prototype.encode = function (value) { + var source = bytes_1.arrayify(value); + if (source.length === 0) { + return ""; + } + var digits = [0]; + for (var i = 0; i < source.length; ++i) { + var carry = source[i]; + for (var j = 0; j < digits.length; ++j) { + carry += digits[j] << 8; + digits[j] = carry % this.base; + carry = (carry / this.base) | 0; + } + while (carry > 0) { + digits.push(carry % this.base); + carry = (carry / this.base) | 0; + } + } + var string = ""; + // deal with leading zeros + for (var k = 0; source[k] === 0 && k < source.length - 1; ++k) { + string += this._leader; + } + // convert digits to a string + for (var q = digits.length - 1; q >= 0; --q) { + string += this.alphabet[digits[q]]; + } + return string; + }; + BaseX.prototype.decode = function (value) { + if (typeof (value) !== "string") { + throw new TypeError("Expected String"); + } + var bytes = []; + if (value.length === 0) { + return new Uint8Array(bytes); + } + bytes.push(0); + for (var i = 0; i < value.length; i++) { + var byte = this._alphabetMap[value[i]]; + if (byte === undefined) { + throw new Error("Non-base" + this.base + " character"); + } + var carry = byte; + for (var j = 0; j < bytes.length; ++j) { + carry += bytes[j] * this.base; + bytes[j] = carry & 0xff; + carry >>= 8; + } + while (carry > 0) { + bytes.push(carry & 0xff); + carry >>= 8; + } + } + // deal with leading zeros + for (var k = 0; value[k] === this._leader && k < value.length - 1; ++k) { + bytes.push(0); + } + return bytes_1.arrayify(new Uint8Array(bytes.reverse())); + }; + return BaseX; +}()); +exports.BaseX = BaseX; +var Base32 = new BaseX("abcdefghijklmnopqrstuvwxyz234567"); +exports.Base32 = Base32; +var Base58 = new BaseX("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"); +exports.Base58 = Base58; +//console.log(Base58.decode("Qmd2V777o5XvJbYMeMb8k2nU5f8d3ciUQ5YpYuWhzv8iDj")) +//console.log(Base58.encode(Base58.decode("Qmd2V777o5XvJbYMeMb8k2nU5f8d3ciUQ5YpYuWhzv8iDj"))) + +},{"@ethersproject/bytes":33,"@ethersproject/properties":63}],28:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "bignumber/5.4.1"; -const log = (type, message, data) => { - const obj = { - type, - id: String(++id), - date: new Date() - }; - if (message) obj.message = message; - if (data) obj.data = data; - dispatch(obj); +},{}],29:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; }; +Object.defineProperty(exports, "__esModule", { value: true }); +exports._base16To36 = exports._base36To16 = exports.BigNumber = exports.isBigNumberish = void 0; /** - * listen to logs. - * @param cb that is called for each future log() with the Log object - * @return a function that can be called to unsubscribe the listener + * BigNumber + * + * A wrapper around the BN.js object. We use the BN.js library + * because it is used by elliptic, so it is required regardless. + * */ - - -exports.log = log; - -const listen = cb => { - subscribers.push(cb); - return () => { - const i = subscribers.indexOf(cb); - - if (i !== -1) { - // equivalent of subscribers.splice(i, 1) // https://twitter.com/Rich_Harris/status/1125850391155965952 - subscribers[i] = subscribers[subscribers.length - 1]; - subscribers.pop(); +var bn_js_1 = __importDefault(require("bn.js")); +var BN = bn_js_1.default.BN; +var bytes_1 = require("@ethersproject/bytes"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var _constructorGuard = {}; +var MAX_SAFE = 0x1fffffffffffff; +function isBigNumberish(value) { + return (value != null) && (BigNumber.isBigNumber(value) || + (typeof (value) === "number" && (value % 1) === 0) || + (typeof (value) === "string" && !!value.match(/^-?[0-9]+$/)) || + bytes_1.isHexString(value) || + (typeof (value) === "bigint") || + bytes_1.isBytes(value)); +} +exports.isBigNumberish = isBigNumberish; +// Only warn about passing 10 into radix once +var _warnedToStringRadix = false; +var BigNumber = /** @class */ (function () { + function BigNumber(constructorGuard, hex) { + var _newTarget = this.constructor; + logger.checkNew(_newTarget, BigNumber); + if (constructorGuard !== _constructorGuard) { + logger.throwError("cannot call constructor directly; use BigNumber.from", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "new (BigNumber)" + }); + } + this._hex = hex; + this._isBigNumber = true; + Object.freeze(this); } - }; -}; - -exports.listen = listen; - -function dispatch(log) { - for (let i = 0; i < subscribers.length; i++) { - try { - subscribers[i](log); - } catch (e) { - console.error(e); + BigNumber.prototype.fromTwos = function (value) { + return toBigNumber(toBN(this).fromTwos(value)); + }; + BigNumber.prototype.toTwos = function (value) { + return toBigNumber(toBN(this).toTwos(value)); + }; + BigNumber.prototype.abs = function () { + if (this._hex[0] === "-") { + return BigNumber.from(this._hex.substring(1)); + } + return this; + }; + BigNumber.prototype.add = function (other) { + return toBigNumber(toBN(this).add(toBN(other))); + }; + BigNumber.prototype.sub = function (other) { + return toBigNumber(toBN(this).sub(toBN(other))); + }; + BigNumber.prototype.div = function (other) { + var o = BigNumber.from(other); + if (o.isZero()) { + throwFault("division by zero", "div"); + } + return toBigNumber(toBN(this).div(toBN(other))); + }; + BigNumber.prototype.mul = function (other) { + return toBigNumber(toBN(this).mul(toBN(other))); + }; + BigNumber.prototype.mod = function (other) { + var value = toBN(other); + if (value.isNeg()) { + throwFault("cannot modulo negative values", "mod"); + } + return toBigNumber(toBN(this).umod(value)); + }; + BigNumber.prototype.pow = function (other) { + var value = toBN(other); + if (value.isNeg()) { + throwFault("cannot raise to negative values", "pow"); + } + return toBigNumber(toBN(this).pow(value)); + }; + BigNumber.prototype.and = function (other) { + var value = toBN(other); + if (this.isNegative() || value.isNeg()) { + throwFault("cannot 'and' negative values", "and"); + } + return toBigNumber(toBN(this).and(value)); + }; + BigNumber.prototype.or = function (other) { + var value = toBN(other); + if (this.isNegative() || value.isNeg()) { + throwFault("cannot 'or' negative values", "or"); + } + return toBigNumber(toBN(this).or(value)); + }; + BigNumber.prototype.xor = function (other) { + var value = toBN(other); + if (this.isNegative() || value.isNeg()) { + throwFault("cannot 'xor' negative values", "xor"); + } + return toBigNumber(toBN(this).xor(value)); + }; + BigNumber.prototype.mask = function (value) { + if (this.isNegative() || value < 0) { + throwFault("cannot mask negative values", "mask"); + } + return toBigNumber(toBN(this).maskn(value)); + }; + BigNumber.prototype.shl = function (value) { + if (this.isNegative() || value < 0) { + throwFault("cannot shift negative values", "shl"); + } + return toBigNumber(toBN(this).shln(value)); + }; + BigNumber.prototype.shr = function (value) { + if (this.isNegative() || value < 0) { + throwFault("cannot shift negative values", "shr"); + } + return toBigNumber(toBN(this).shrn(value)); + }; + BigNumber.prototype.eq = function (other) { + return toBN(this).eq(toBN(other)); + }; + BigNumber.prototype.lt = function (other) { + return toBN(this).lt(toBN(other)); + }; + BigNumber.prototype.lte = function (other) { + return toBN(this).lte(toBN(other)); + }; + BigNumber.prototype.gt = function (other) { + return toBN(this).gt(toBN(other)); + }; + BigNumber.prototype.gte = function (other) { + return toBN(this).gte(toBN(other)); + }; + BigNumber.prototype.isNegative = function () { + return (this._hex[0] === "-"); + }; + BigNumber.prototype.isZero = function () { + return toBN(this).isZero(); + }; + BigNumber.prototype.toNumber = function () { + try { + return toBN(this).toNumber(); + } + catch (error) { + throwFault("overflow", "toNumber", this.toString()); + } + return null; + }; + BigNumber.prototype.toBigInt = function () { + try { + return BigInt(this.toString()); + } + catch (e) { } + return logger.throwError("this platform does not support BigInt", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + value: this.toString() + }); + }; + BigNumber.prototype.toString = function () { + // Lots of people expect this, which we do not support, so check (See: #889) + if (arguments.length > 0) { + if (arguments[0] === 10) { + if (!_warnedToStringRadix) { + _warnedToStringRadix = true; + logger.warn("BigNumber.toString does not accept any parameters; base-10 is assumed"); + } + } + else if (arguments[0] === 16) { + logger.throwError("BigNumber.toString does not accept any parameters; use bigNumber.toHexString()", logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {}); + } + else { + logger.throwError("BigNumber.toString does not accept parameters", logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {}); + } + } + return toBN(this).toString(10); + }; + BigNumber.prototype.toHexString = function () { + return this._hex; + }; + BigNumber.prototype.toJSON = function (key) { + return { type: "BigNumber", hex: this.toHexString() }; + }; + BigNumber.from = function (value) { + if (value instanceof BigNumber) { + return value; + } + if (typeof (value) === "string") { + if (value.match(/^-?0x[0-9a-f]+$/i)) { + return new BigNumber(_constructorGuard, toHex(value)); + } + if (value.match(/^-?[0-9]+$/)) { + return new BigNumber(_constructorGuard, toHex(new BN(value))); + } + return logger.throwArgumentError("invalid BigNumber string", "value", value); + } + if (typeof (value) === "number") { + if (value % 1) { + throwFault("underflow", "BigNumber.from", value); + } + if (value >= MAX_SAFE || value <= -MAX_SAFE) { + throwFault("overflow", "BigNumber.from", value); + } + return BigNumber.from(String(value)); + } + var anyValue = value; + if (typeof (anyValue) === "bigint") { + return BigNumber.from(anyValue.toString()); + } + if (bytes_1.isBytes(anyValue)) { + return BigNumber.from(bytes_1.hexlify(anyValue)); + } + if (anyValue) { + // Hexable interface (takes piority) + if (anyValue.toHexString) { + var hex = anyValue.toHexString(); + if (typeof (hex) === "string") { + return BigNumber.from(hex); + } + } + else { + // For now, handle legacy JSON-ified values (goes away in v6) + var hex = anyValue._hex; + // New-form JSON + if (hex == null && anyValue.type === "BigNumber") { + hex = anyValue.hex; + } + if (typeof (hex) === "string") { + if (bytes_1.isHexString(hex) || (hex[0] === "-" && bytes_1.isHexString(hex.substring(1)))) { + return BigNumber.from(hex); + } + } + } + } + return logger.throwArgumentError("invalid BigNumber value", "value", value); + }; + BigNumber.isBigNumber = function (value) { + return !!(value && value._isBigNumber); + }; + return BigNumber; +}()); +exports.BigNumber = BigNumber; +// Normalize the hex string +function toHex(value) { + // For BN, call on the hex string + if (typeof (value) !== "string") { + return toHex(value.toString(16)); + } + // If negative, prepend the negative sign to the normalized positive value + if (value[0] === "-") { + // Strip off the negative sign + value = value.substring(1); + // Cannot have mulitple negative signs (e.g. "--0x04") + if (value[0] === "-") { + logger.throwArgumentError("invalid hex", "value", value); + } + // Call toHex on the positive component + value = toHex(value); + // Do not allow "-0x00" + if (value === "0x00") { + return value; + } + // Negate the value + return "-" + value; } - } -} // for debug purpose - - -if (typeof window !== "undefined") { - window.__ledgerLogsListen = listen; + // Add a "0x" prefix if missing + if (value.substring(0, 2) !== "0x") { + value = "0x" + value; + } + // Normalize zero + if (value === "0x") { + return "0x00"; + } + // Make the string even length + if (value.length % 2) { + value = "0x0" + value.substring(2); + } + // Trim to smallest even-length string + while (value.length > 4 && value.substring(0, 4) === "0x00") { + value = "0x" + value.substring(4); + } + return value; +} +function toBigNumber(value) { + return BigNumber.from(toHex(value)); +} +function toBN(value) { + var hex = BigNumber.from(value).toHexString(); + if (hex[0] === "-") { + return (new BN("-" + hex.substring(3), 16)); + } + return new BN(hex.substring(2), 16); } +function throwFault(fault, operation, value) { + var params = { fault: fault, operation: operation }; + if (value != null) { + params.value = value; + } + return logger.throwError(fault, logger_1.Logger.errors.NUMERIC_FAULT, params); +} +// value should have no prefix +function _base36To16(value) { + return (new BN(value, 36)).toString(16); +} +exports._base36To16 = _base36To16; +// value should have no prefix +function _base16To36(value) { + return (new BN(value, 16)).toString(36); +} +exports._base16To36 = _base16To36; -},{}],13:[function(require,module,exports){ -(function (Buffer){ +},{"./_version":28,"@ethersproject/bytes":33,"@ethersproject/logger":57,"bn.js":169}],30:[function(require,module,exports){ "use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _u2fApi = require("u2f-api"); - -var _hwTransport = _interopRequireDefault(require("@ledgerhq/hw-transport")); - -var _logs = require("@ledgerhq/logs"); - -var _errors = require("@ledgerhq/errors"); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function wrapU2FTransportError(originalError, message, id) { - const err = new _errors.TransportError(message, id); // $FlowFixMe - - err.originalError = originalError; - return err; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FixedNumber = exports.FixedFormat = exports.parseFixed = exports.formatFixed = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var bignumber_1 = require("./bignumber"); +var _constructorGuard = {}; +var Zero = bignumber_1.BigNumber.from(0); +var NegativeOne = bignumber_1.BigNumber.from(-1); +function throwFault(message, fault, operation, value) { + var params = { fault: fault, operation: operation }; + if (value !== undefined) { + params.value = value; + } + return logger.throwError(message, logger_1.Logger.errors.NUMERIC_FAULT, params); } - -function wrapApdu(apdu, key) { - const result = Buffer.alloc(apdu.length); - - for (let i = 0; i < apdu.length; i++) { - result[i] = apdu[i] ^ key[i % key.length]; - } - - return result; -} // Convert from normal to web-safe, strip trailing "="s - - -const webSafe64 = base64 => base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); // Convert from web-safe to normal, add trailing "="s - - -const normal64 = base64 => base64.replace(/-/g, "+").replace(/_/g, "/") + "==".substring(0, 3 * base64.length % 4); - -function attemptExchange(apdu, timeoutMillis, scrambleKey, unwrap) { - const keyHandle = wrapApdu(apdu, scrambleKey); - const challenge = Buffer.from("0000000000000000000000000000000000000000000000000000000000000000", "hex"); - const signRequest = { - version: "U2F_V2", - keyHandle: webSafe64(keyHandle.toString("base64")), - challenge: webSafe64(challenge.toString("base64")), - appId: location.origin - }; - (0, _logs.log)("apdu", "=> " + apdu.toString("hex")); - return (0, _u2fApi.sign)(signRequest, timeoutMillis / 1000).then(response => { - const { - signatureData - } = response; - - if (typeof signatureData === "string") { - const data = Buffer.from(normal64(signatureData), "base64"); - let result; - - if (!unwrap) { - result = data; - } else { - result = data.slice(5); - } - - (0, _logs.log)("apdu", "<= " + result.toString("hex")); - return result; - } else { - throw response; - } - }); -} - -let transportInstances = []; - -function emitDisconnect() { - transportInstances.forEach(t => t.emit("disconnect")); - transportInstances = []; +// Constant to pull zeros from for multipliers +var zeros = "0"; +while (zeros.length < 256) { + zeros += zeros; } - -function isTimeoutU2FError(u2fError) { - return u2fError.metaData.code === 5; +// Returns a string "1" followed by decimal "0"s +function getMultiplier(decimals) { + if (typeof (decimals) !== "number") { + try { + decimals = bignumber_1.BigNumber.from(decimals).toNumber(); + } + catch (e) { } + } + if (typeof (decimals) === "number" && decimals >= 0 && decimals <= 256 && !(decimals % 1)) { + return ("1" + zeros.substring(0, decimals)); + } + return logger.throwArgumentError("invalid decimal size", "decimals", decimals); } -/** - * U2F web Transport implementation - * @example - * import TransportU2F from "@ledgerhq/hw-transport-u2f"; - * ... - * TransportU2F.create().then(transport => ...) - */ - - -class TransportU2F extends _hwTransport.default { - /* - */ - - /* - */ - - /** - * static function to create a new Transport from a connected Ledger device discoverable via U2F (browser support) - */ - static async open(_, _openTimeout = 5000) { - return new TransportU2F(); - } - - constructor() { - super(); - this.scrambleKey = void 0; - this.unwrap = true; - transportInstances.push(this); - } - /** - * Exchange with the device using APDU protocol. - * @param apdu - * @returns a promise of apdu response - */ - - - async exchange(apdu) { - try { - return await attemptExchange(apdu, this.exchangeTimeout, this.scrambleKey, this.unwrap); - } catch (e) { - const isU2FError = typeof e.metaData === "object"; - - if (isU2FError) { - if (isTimeoutU2FError(e)) { - emitDisconnect(); - } // the wrapping make error more usable and "printable" to the end user. - - - throw wrapU2FTransportError(e, "Failed to sign with Ledger device: U2F " + e.metaData.type, "U2F_" + e.metaData.code); - } else { - throw e; - } +function formatFixed(value, decimals) { + if (decimals == null) { + decimals = 0; + } + var multiplier = getMultiplier(decimals); + // Make sure wei is a big number (convert as necessary) + value = bignumber_1.BigNumber.from(value); + var negative = value.lt(Zero); + if (negative) { + value = value.mul(NegativeOne); + } + var fraction = value.mod(multiplier).toString(); + while (fraction.length < multiplier.length - 1) { + fraction = "0" + fraction; + } + // Strip training 0 + fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1]; + var whole = value.div(multiplier).toString(); + if (multiplier.length === 1) { + value = whole; } - } - /** - */ - - - setScrambleKey(scrambleKey) { - this.scrambleKey = Buffer.from(scrambleKey, "ascii"); - } - /** - */ - - - setUnwrap(unwrap) { - this.unwrap = unwrap; - } - - close() { - // u2f have no way to clean things up - return Promise.resolve(); - } - + else { + value = whole + "." + fraction; + } + if (negative) { + value = "-" + value; + } + return value; } - -exports.default = TransportU2F; -TransportU2F.isSupported = _u2fApi.isSupported; - -TransportU2F.list = () => // this transport is not discoverable but we are going to guess if it is here with isSupported() -(0, _u2fApi.isSupported)().then(supported => supported ? [null] : []); - -TransportU2F.listen = observer => { - let unsubscribed = false; - (0, _u2fApi.isSupported)().then(supported => { - if (unsubscribed) return; - - if (supported) { - observer.next({ - type: "add", - descriptor: null - }); - observer.complete(); - } else { - observer.error(new _errors.TransportError("U2F browser support is needed for Ledger. " + "Please use Chrome, Opera or Firefox with a U2F extension. " + "Also make sure you're on an HTTPS connection", "U2FNotSupported")); +exports.formatFixed = formatFixed; +function parseFixed(value, decimals) { + if (decimals == null) { + decimals = 0; } - }); - return { - unsubscribe: () => { - unsubscribed = true; + var multiplier = getMultiplier(decimals); + if (typeof (value) !== "string" || !value.match(/^-?[0-9.,]+$/)) { + logger.throwArgumentError("invalid decimal value", "value", value); } - }; -}; - -}).call(this,require("buffer").Buffer) -},{"@ledgerhq/errors":4,"@ledgerhq/hw-transport":14,"@ledgerhq/logs":15,"buffer":20,"u2f-api":24}],14:[function(require,module,exports){ -arguments[4][11][0].apply(exports,arguments) -},{"@ledgerhq/errors":4,"buffer":20,"dup":11,"events":21}],15:[function(require,module,exports){ -arguments[4][12][0].apply(exports,arguments) -},{"dup":12}],16:[function(require,module,exports){ -'use strict' - -exports.byteLength = byteLength -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array - -var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i + // Is it negative? + var negative = (value.substring(0, 1) === "-"); + if (negative) { + value = value.substring(1); + } + if (value === ".") { + logger.throwArgumentError("missing value", "value", value); + } + // Split it into a whole and fractional part + var comps = value.split("."); + if (comps.length > 2) { + logger.throwArgumentError("too many decimal points", "value", value); + } + var whole = comps[0], fraction = comps[1]; + if (!whole) { + whole = "0"; + } + if (!fraction) { + fraction = "0"; + } + // Get significant digits to check truncation for underflow + { + var sigFraction = fraction.replace(/^([0-9]*?)(0*)$/, function (all, sig, zeros) { return (sig); }); + if (sigFraction.length > multiplier.length - 1) { + throwFault("fractional component exceeds decimals", "underflow", "parseFixed"); + } + } + // Fully pad the string with zeros to get to wei + while (fraction.length < multiplier.length - 1) { + fraction += "0"; + } + var wholeValue = bignumber_1.BigNumber.from(whole); + var fractionValue = bignumber_1.BigNumber.from(fraction); + var wei = (wholeValue.mul(multiplier)).add(fractionValue); + if (negative) { + wei = wei.mul(NegativeOne); + } + return wei; } +exports.parseFixed = parseFixed; +var FixedFormat = /** @class */ (function () { + function FixedFormat(constructorGuard, signed, width, decimals) { + if (constructorGuard !== _constructorGuard) { + logger.throwError("cannot use FixedFormat constructor; use FixedFormat.from", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "new FixedFormat" + }); + } + this.signed = signed; + this.width = width; + this.decimals = decimals; + this.name = (signed ? "" : "u") + "fixed" + String(width) + "x" + String(decimals); + this._multiplier = getMultiplier(decimals); + Object.freeze(this); + } + FixedFormat.from = function (value) { + if (value instanceof FixedFormat) { + return value; + } + if (typeof (value) === "number") { + value = "fixed128x" + value; + } + var signed = true; + var width = 128; + var decimals = 18; + if (typeof (value) === "string") { + if (value === "fixed") { + // defaults... + } + else if (value === "ufixed") { + signed = false; + } + else { + var match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/); + if (!match) { + logger.throwArgumentError("invalid fixed format", "format", value); + } + signed = (match[1] !== "u"); + width = parseInt(match[2]); + decimals = parseInt(match[3]); + } + } + else if (value) { + var check = function (key, type, defaultValue) { + if (value[key] == null) { + return defaultValue; + } + if (typeof (value[key]) !== type) { + logger.throwArgumentError("invalid fixed format (" + key + " not " + type + ")", "format." + key, value[key]); + } + return value[key]; + }; + signed = check("signed", "boolean", signed); + width = check("width", "number", width); + decimals = check("decimals", "number", decimals); + } + if (width % 8) { + logger.throwArgumentError("invalid fixed format width (not byte aligned)", "format.width", width); + } + if (decimals > 80) { + logger.throwArgumentError("invalid fixed format (decimals too large)", "format.decimals", decimals); + } + return new FixedFormat(_constructorGuard, signed, width, decimals); + }; + return FixedFormat; +}()); +exports.FixedFormat = FixedFormat; +var FixedNumber = /** @class */ (function () { + function FixedNumber(constructorGuard, hex, value, format) { + var _newTarget = this.constructor; + logger.checkNew(_newTarget, FixedNumber); + if (constructorGuard !== _constructorGuard) { + logger.throwError("cannot use FixedNumber constructor; use FixedNumber.from", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "new FixedFormat" + }); + } + this.format = format; + this._hex = hex; + this._value = value; + this._isFixedNumber = true; + Object.freeze(this); + } + FixedNumber.prototype._checkFormat = function (other) { + if (this.format.name !== other.format.name) { + logger.throwArgumentError("incompatible format; use fixedNumber.toFormat", "other", other); + } + }; + FixedNumber.prototype.addUnsafe = function (other) { + this._checkFormat(other); + var a = parseFixed(this._value, this.format.decimals); + var b = parseFixed(other._value, other.format.decimals); + return FixedNumber.fromValue(a.add(b), this.format.decimals, this.format); + }; + FixedNumber.prototype.subUnsafe = function (other) { + this._checkFormat(other); + var a = parseFixed(this._value, this.format.decimals); + var b = parseFixed(other._value, other.format.decimals); + return FixedNumber.fromValue(a.sub(b), this.format.decimals, this.format); + }; + FixedNumber.prototype.mulUnsafe = function (other) { + this._checkFormat(other); + var a = parseFixed(this._value, this.format.decimals); + var b = parseFixed(other._value, other.format.decimals); + return FixedNumber.fromValue(a.mul(b).div(this.format._multiplier), this.format.decimals, this.format); + }; + FixedNumber.prototype.divUnsafe = function (other) { + this._checkFormat(other); + var a = parseFixed(this._value, this.format.decimals); + var b = parseFixed(other._value, other.format.decimals); + return FixedNumber.fromValue(a.mul(this.format._multiplier).div(b), this.format.decimals, this.format); + }; + FixedNumber.prototype.floor = function () { + var comps = this.toString().split("."); + if (comps.length === 1) { + comps.push("0"); + } + var result = FixedNumber.from(comps[0], this.format); + var hasFraction = !comps[1].match(/^(0*)$/); + if (this.isNegative() && hasFraction) { + result = result.subUnsafe(ONE.toFormat(result.format)); + } + return result; + }; + FixedNumber.prototype.ceiling = function () { + var comps = this.toString().split("."); + if (comps.length === 1) { + comps.push("0"); + } + var result = FixedNumber.from(comps[0], this.format); + var hasFraction = !comps[1].match(/^(0*)$/); + if (!this.isNegative() && hasFraction) { + result = result.addUnsafe(ONE.toFormat(result.format)); + } + return result; + }; + // @TODO: Support other rounding algorithms + FixedNumber.prototype.round = function (decimals) { + if (decimals == null) { + decimals = 0; + } + // If we are already in range, we're done + var comps = this.toString().split("."); + if (comps.length === 1) { + comps.push("0"); + } + if (decimals < 0 || decimals > 80 || (decimals % 1)) { + logger.throwArgumentError("invalid decimal count", "decimals", decimals); + } + if (comps[1].length <= decimals) { + return this; + } + var factor = FixedNumber.from("1" + zeros.substring(0, decimals), this.format); + var bump = BUMP.toFormat(this.format); + return this.mulUnsafe(factor).addUnsafe(bump).floor().divUnsafe(factor); + }; + FixedNumber.prototype.isZero = function () { + return (this._value === "0.0" || this._value === "0"); + }; + FixedNumber.prototype.isNegative = function () { + return (this._value[0] === "-"); + }; + FixedNumber.prototype.toString = function () { return this._value; }; + FixedNumber.prototype.toHexString = function (width) { + if (width == null) { + return this._hex; + } + if (width % 8) { + logger.throwArgumentError("invalid byte width", "width", width); + } + var hex = bignumber_1.BigNumber.from(this._hex).fromTwos(this.format.width).toTwos(width).toHexString(); + return bytes_1.hexZeroPad(hex, width / 8); + }; + FixedNumber.prototype.toUnsafeFloat = function () { return parseFloat(this.toString()); }; + FixedNumber.prototype.toFormat = function (format) { + return FixedNumber.fromString(this._value, format); + }; + FixedNumber.fromValue = function (value, decimals, format) { + // If decimals looks more like a format, and there is no format, shift the parameters + if (format == null && decimals != null && !bignumber_1.isBigNumberish(decimals)) { + format = decimals; + decimals = null; + } + if (decimals == null) { + decimals = 0; + } + if (format == null) { + format = "fixed"; + } + return FixedNumber.fromString(formatFixed(value, decimals), FixedFormat.from(format)); + }; + FixedNumber.fromString = function (value, format) { + if (format == null) { + format = "fixed"; + } + var fixedFormat = FixedFormat.from(format); + var numeric = parseFixed(value, fixedFormat.decimals); + if (!fixedFormat.signed && numeric.lt(Zero)) { + throwFault("unsigned value cannot be negative", "overflow", "value", value); + } + var hex = null; + if (fixedFormat.signed) { + hex = numeric.toTwos(fixedFormat.width).toHexString(); + } + else { + hex = numeric.toHexString(); + hex = bytes_1.hexZeroPad(hex, fixedFormat.width / 8); + } + var decimal = formatFixed(numeric, fixedFormat.decimals); + return new FixedNumber(_constructorGuard, hex, decimal, fixedFormat); + }; + FixedNumber.fromBytes = function (value, format) { + if (format == null) { + format = "fixed"; + } + var fixedFormat = FixedFormat.from(format); + if (bytes_1.arrayify(value).length > fixedFormat.width / 8) { + throw new Error("overflow"); + } + var numeric = bignumber_1.BigNumber.from(value); + if (fixedFormat.signed) { + numeric = numeric.fromTwos(fixedFormat.width); + } + var hex = numeric.toTwos((fixedFormat.signed ? 0 : 1) + fixedFormat.width).toHexString(); + var decimal = formatFixed(numeric, fixedFormat.decimals); + return new FixedNumber(_constructorGuard, hex, decimal, fixedFormat); + }; + FixedNumber.from = function (value, format) { + if (typeof (value) === "string") { + return FixedNumber.fromString(value, format); + } + if (bytes_1.isBytes(value)) { + return FixedNumber.fromBytes(value, format); + } + try { + return FixedNumber.fromValue(value, 0, format); + } + catch (error) { + // Allow NUMERIC_FAULT to bubble up + if (error.code !== logger_1.Logger.errors.INVALID_ARGUMENT) { + throw error; + } + } + return logger.throwArgumentError("invalid FixedNumber value", "value", value); + }; + FixedNumber.isFixedNumber = function (value) { + return !!(value && value._isFixedNumber); + }; + return FixedNumber; +}()); +exports.FixedNumber = FixedNumber; +var ONE = FixedNumber.from(1); +var BUMP = FixedNumber.from("0.5"); -// Support decoding URL-safe base64 strings, as Node.js does. -// See: https://en.wikipedia.org/wiki/Base64#URL_applications -revLookup['-'.charCodeAt(0)] = 62 -revLookup['_'.charCodeAt(0)] = 63 - -function getLens (b64) { - var len = b64.length - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // Trim off extra bytes after placeholder bytes are found - // See: https://github.com/beatgammit/base64-js/issues/42 - var validLen = b64.indexOf('=') - if (validLen === -1) validLen = len - - var placeHoldersLen = validLen === len - ? 0 - : 4 - (validLen % 4) +},{"./_version":28,"./bignumber":29,"@ethersproject/bytes":33,"@ethersproject/logger":57}],31:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports._base36To16 = exports._base16To36 = exports.parseFixed = exports.FixedNumber = exports.FixedFormat = exports.formatFixed = exports.BigNumber = void 0; +var bignumber_1 = require("./bignumber"); +Object.defineProperty(exports, "BigNumber", { enumerable: true, get: function () { return bignumber_1.BigNumber; } }); +var fixednumber_1 = require("./fixednumber"); +Object.defineProperty(exports, "formatFixed", { enumerable: true, get: function () { return fixednumber_1.formatFixed; } }); +Object.defineProperty(exports, "FixedFormat", { enumerable: true, get: function () { return fixednumber_1.FixedFormat; } }); +Object.defineProperty(exports, "FixedNumber", { enumerable: true, get: function () { return fixednumber_1.FixedNumber; } }); +Object.defineProperty(exports, "parseFixed", { enumerable: true, get: function () { return fixednumber_1.parseFixed; } }); +// Internal methods used by address +var bignumber_2 = require("./bignumber"); +Object.defineProperty(exports, "_base16To36", { enumerable: true, get: function () { return bignumber_2._base16To36; } }); +Object.defineProperty(exports, "_base36To16", { enumerable: true, get: function () { return bignumber_2._base36To16; } }); + +},{"./bignumber":29,"./fixednumber":30}],32:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "bytes/5.4.0"; - return [validLen, placeHoldersLen] +},{}],33:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.joinSignature = exports.splitSignature = exports.hexZeroPad = exports.hexStripZeros = exports.hexValue = exports.hexConcat = exports.hexDataSlice = exports.hexDataLength = exports.hexlify = exports.isHexString = exports.zeroPad = exports.stripZeros = exports.concat = exports.arrayify = exports.isBytes = exports.isBytesLike = void 0; +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +/////////////////////////////// +function isHexable(value) { + return !!(value.toHexString); } - -// base64 is 4/3 + up to two characters of the original data -function byteLength (b64) { - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +function addSlice(array) { + if (array.slice) { + return array; + } + array.slice = function () { + var args = Array.prototype.slice.call(arguments); + return addSlice(new Uint8Array(Array.prototype.slice.apply(array, args))); + }; + return array; } - -function _byteLength (b64, validLen, placeHoldersLen) { - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +function isBytesLike(value) { + return ((isHexString(value) && !(value.length % 2)) || isBytes(value)); } - -function toByteArray (b64) { - var tmp - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - - var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) - - var curByte = 0 - - // if there are placeholders, only get up to the last complete 4 chars - var len = placeHoldersLen > 0 - ? validLen - 4 - : validLen - - for (var i = 0; i < len; i += 4) { - tmp = - (revLookup[b64.charCodeAt(i)] << 18) | - (revLookup[b64.charCodeAt(i + 1)] << 12) | - (revLookup[b64.charCodeAt(i + 2)] << 6) | - revLookup[b64.charCodeAt(i + 3)] - arr[curByte++] = (tmp >> 16) & 0xFF - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } - - if (placeHoldersLen === 2) { - tmp = - (revLookup[b64.charCodeAt(i)] << 2) | - (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[curByte++] = tmp & 0xFF - } - - if (placeHoldersLen === 1) { - tmp = - (revLookup[b64.charCodeAt(i)] << 10) | - (revLookup[b64.charCodeAt(i + 1)] << 4) | - (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } - - return arr +exports.isBytesLike = isBytesLike; +function isBytes(value) { + if (value == null) { + return false; + } + if (value.constructor === Uint8Array) { + return true; + } + if (typeof (value) === "string") { + return false; + } + if (value.length == null) { + return false; + } + for (var i = 0; i < value.length; i++) { + var v = value[i]; + if (typeof (v) !== "number" || v < 0 || v >= 256 || (v % 1)) { + return false; + } + } + return true; } - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + - lookup[num >> 12 & 0x3F] + - lookup[num >> 6 & 0x3F] + - lookup[num & 0x3F] +exports.isBytes = isBytes; +function arrayify(value, options) { + if (!options) { + options = {}; + } + if (typeof (value) === "number") { + logger.checkSafeUint53(value, "invalid arrayify value"); + var result = []; + while (value) { + result.unshift(value & 0xff); + value = parseInt(String(value / 256)); + } + if (result.length === 0) { + result.push(0); + } + return addSlice(new Uint8Array(result)); + } + if (options.allowMissingPrefix && typeof (value) === "string" && value.substring(0, 2) !== "0x") { + value = "0x" + value; + } + if (isHexable(value)) { + value = value.toHexString(); + } + if (isHexString(value)) { + var hex = value.substring(2); + if (hex.length % 2) { + if (options.hexPad === "left") { + hex = "0x0" + hex.substring(2); + } + else if (options.hexPad === "right") { + hex += "0"; + } + else { + logger.throwArgumentError("hex data is odd-length", "value", value); + } + } + var result = []; + for (var i = 0; i < hex.length; i += 2) { + result.push(parseInt(hex.substring(i, i + 2), 16)); + } + return addSlice(new Uint8Array(result)); + } + if (isBytes(value)) { + return addSlice(new Uint8Array(value)); + } + return logger.throwArgumentError("invalid arrayify value", "value", value); } - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = - ((uint8[i] << 16) & 0xFF0000) + - ((uint8[i + 1] << 8) & 0xFF00) + - (uint8[i + 2] & 0xFF) - output.push(tripletToBase64(tmp)) - } - return output.join('') +exports.arrayify = arrayify; +function concat(items) { + var objects = items.map(function (item) { return arrayify(item); }); + var length = objects.reduce(function (accum, item) { return (accum + item.length); }, 0); + var result = new Uint8Array(length); + objects.reduce(function (offset, object) { + result.set(object, offset); + return offset + object.length; + }, 0); + return addSlice(result); +} +exports.concat = concat; +function stripZeros(value) { + var result = arrayify(value); + if (result.length === 0) { + return result; + } + // Find the first non-zero entry + var start = 0; + while (start < result.length && result[start] === 0) { + start++; + } + // If we started with zeros, strip them + if (start) { + result = result.slice(start); + } + return result; +} +exports.stripZeros = stripZeros; +function zeroPad(value, length) { + value = arrayify(value); + if (value.length > length) { + logger.throwArgumentError("value out of range", "value", arguments[0]); + } + var result = new Uint8Array(length); + result.set(value, length - value.length); + return addSlice(result); +} +exports.zeroPad = zeroPad; +function isHexString(value, length) { + if (typeof (value) !== "string" || !value.match(/^0x[0-9A-Fa-f]*$/)) { + return false; + } + if (length && value.length !== 2 + 2 * length) { + return false; + } + return true; +} +exports.isHexString = isHexString; +var HexCharacters = "0123456789abcdef"; +function hexlify(value, options) { + if (!options) { + options = {}; + } + if (typeof (value) === "number") { + logger.checkSafeUint53(value, "invalid hexlify value"); + var hex = ""; + while (value) { + hex = HexCharacters[value & 0xf] + hex; + value = Math.floor(value / 16); + } + if (hex.length) { + if (hex.length % 2) { + hex = "0" + hex; + } + return "0x" + hex; + } + return "0x00"; + } + if (typeof (value) === "bigint") { + value = value.toString(16); + if (value.length % 2) { + return ("0x0" + value); + } + return "0x" + value; + } + if (options.allowMissingPrefix && typeof (value) === "string" && value.substring(0, 2) !== "0x") { + value = "0x" + value; + } + if (isHexable(value)) { + return value.toHexString(); + } + if (isHexString(value)) { + if (value.length % 2) { + if (options.hexPad === "left") { + value = "0x0" + value.substring(2); + } + else if (options.hexPad === "right") { + value += "0"; + } + else { + logger.throwArgumentError("hex data is odd-length", "value", value); + } + } + return value.toLowerCase(); + } + if (isBytes(value)) { + var result = "0x"; + for (var i = 0; i < value.length; i++) { + var v = value[i]; + result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f]; + } + return result; + } + return logger.throwArgumentError("invalid hexlify value", "value", value); +} +exports.hexlify = hexlify; +/* +function unoddify(value: BytesLike | Hexable | number): BytesLike | Hexable | number { + if (typeof(value) === "string" && value.length % 2 && value.substring(0, 2) === "0x") { + return "0x0" + value.substring(2); + } + return value; +} +*/ +function hexDataLength(data) { + if (typeof (data) !== "string") { + data = hexlify(data); + } + else if (!isHexString(data) || (data.length % 2)) { + return null; + } + return (data.length - 2) / 2; +} +exports.hexDataLength = hexDataLength; +function hexDataSlice(data, offset, endOffset) { + if (typeof (data) !== "string") { + data = hexlify(data); + } + else if (!isHexString(data) || (data.length % 2)) { + logger.throwArgumentError("invalid hexData", "value", data); + } + offset = 2 + 2 * offset; + if (endOffset != null) { + return "0x" + data.substring(offset, 2 + 2 * endOffset); + } + return "0x" + data.substring(offset); +} +exports.hexDataSlice = hexDataSlice; +function hexConcat(items) { + var result = "0x"; + items.forEach(function (item) { + result += hexlify(item).substring(2); + }); + return result; +} +exports.hexConcat = hexConcat; +function hexValue(value) { + var trimmed = hexStripZeros(hexlify(value, { hexPad: "left" })); + if (trimmed === "0x") { + return "0x0"; + } + return trimmed; +} +exports.hexValue = hexValue; +function hexStripZeros(value) { + if (typeof (value) !== "string") { + value = hexlify(value); + } + if (!isHexString(value)) { + logger.throwArgumentError("invalid hex string", "value", value); + } + value = value.substring(2); + var offset = 0; + while (offset < value.length && value[offset] === "0") { + offset++; + } + return "0x" + value.substring(offset); } +exports.hexStripZeros = hexStripZeros; +function hexZeroPad(value, length) { + if (typeof (value) !== "string") { + value = hexlify(value); + } + else if (!isHexString(value)) { + logger.throwArgumentError("invalid hex string", "value", value); + } + if (value.length > 2 * length + 2) { + logger.throwArgumentError("value out of range", "value", arguments[1]); + } + while (value.length < 2 * length + 2) { + value = "0x0" + value.substring(2); + } + return value; +} +exports.hexZeroPad = hexZeroPad; +function splitSignature(signature) { + var result = { + r: "0x", + s: "0x", + _vs: "0x", + recoveryParam: 0, + v: 0 + }; + if (isBytesLike(signature)) { + var bytes = arrayify(signature); + if (bytes.length !== 65) { + logger.throwArgumentError("invalid signature string; must be 65 bytes", "signature", signature); + } + // Get the r, s and v + result.r = hexlify(bytes.slice(0, 32)); + result.s = hexlify(bytes.slice(32, 64)); + result.v = bytes[64]; + // Allow a recid to be used as the v + if (result.v < 27) { + if (result.v === 0 || result.v === 1) { + result.v += 27; + } + else { + logger.throwArgumentError("signature invalid v byte", "signature", signature); + } + } + // Compute recoveryParam from v + result.recoveryParam = 1 - (result.v % 2); + // Compute _vs from recoveryParam and s + if (result.recoveryParam) { + bytes[32] |= 0x80; + } + result._vs = hexlify(bytes.slice(32, 64)); + } + else { + result.r = signature.r; + result.s = signature.s; + result.v = signature.v; + result.recoveryParam = signature.recoveryParam; + result._vs = signature._vs; + // If the _vs is available, use it to populate missing s, v and recoveryParam + // and verify non-missing s, v and recoveryParam + if (result._vs != null) { + var vs_1 = zeroPad(arrayify(result._vs), 32); + result._vs = hexlify(vs_1); + // Set or check the recid + var recoveryParam = ((vs_1[0] >= 128) ? 1 : 0); + if (result.recoveryParam == null) { + result.recoveryParam = recoveryParam; + } + else if (result.recoveryParam !== recoveryParam) { + logger.throwArgumentError("signature recoveryParam mismatch _vs", "signature", signature); + } + // Set or check the s + vs_1[0] &= 0x7f; + var s = hexlify(vs_1); + if (result.s == null) { + result.s = s; + } + else if (result.s !== s) { + logger.throwArgumentError("signature v mismatch _vs", "signature", signature); + } + } + // Use recid and v to populate each other + if (result.recoveryParam == null) { + if (result.v == null) { + logger.throwArgumentError("signature missing v and recoveryParam", "signature", signature); + } + else if (result.v === 0 || result.v === 1) { + result.recoveryParam = result.v; + } + else { + result.recoveryParam = 1 - (result.v % 2); + } + } + else { + if (result.v == null) { + result.v = 27 + result.recoveryParam; + } + else if (result.recoveryParam !== (1 - (result.v % 2))) { + logger.throwArgumentError("signature recoveryParam mismatch v", "signature", signature); + } + } + if (result.r == null || !isHexString(result.r)) { + logger.throwArgumentError("signature missing or invalid r", "signature", signature); + } + else { + result.r = hexZeroPad(result.r, 32); + } + if (result.s == null || !isHexString(result.s)) { + logger.throwArgumentError("signature missing or invalid s", "signature", signature); + } + else { + result.s = hexZeroPad(result.s, 32); + } + var vs = arrayify(result.s); + if (vs[0] >= 128) { + logger.throwArgumentError("signature s out of range", "signature", signature); + } + if (result.recoveryParam) { + vs[0] |= 0x80; + } + var _vs = hexlify(vs); + if (result._vs) { + if (!isHexString(result._vs)) { + logger.throwArgumentError("signature invalid _vs", "signature", signature); + } + result._vs = hexZeroPad(result._vs, 32); + } + // Set or check the _vs + if (result._vs == null) { + result._vs = _vs; + } + else if (result._vs !== _vs) { + logger.throwArgumentError("signature _vs mismatch v and s", "signature", signature); + } + } + return result; +} +exports.splitSignature = splitSignature; +function joinSignature(signature) { + signature = splitSignature(signature); + return hexlify(concat([ + signature.r, + signature.s, + (signature.recoveryParam ? "0x1c" : "0x1b") + ])); +} +exports.joinSignature = joinSignature; -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 +},{"./_version":32,"@ethersproject/logger":57}],34:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AddressZero = void 0; +exports.AddressZero = "0x0000000000000000000000000000000000000000"; - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk( - uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) - )) - } +},{}],35:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaxInt256 = exports.MinInt256 = exports.MaxUint256 = exports.WeiPerEther = exports.Two = exports.One = exports.Zero = exports.NegativeOne = void 0; +var bignumber_1 = require("@ethersproject/bignumber"); +var NegativeOne = ( /*#__PURE__*/bignumber_1.BigNumber.from(-1)); +exports.NegativeOne = NegativeOne; +var Zero = ( /*#__PURE__*/bignumber_1.BigNumber.from(0)); +exports.Zero = Zero; +var One = ( /*#__PURE__*/bignumber_1.BigNumber.from(1)); +exports.One = One; +var Two = ( /*#__PURE__*/bignumber_1.BigNumber.from(2)); +exports.Two = Two; +var WeiPerEther = ( /*#__PURE__*/bignumber_1.BigNumber.from("1000000000000000000")); +exports.WeiPerEther = WeiPerEther; +var MaxUint256 = ( /*#__PURE__*/bignumber_1.BigNumber.from("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); +exports.MaxUint256 = MaxUint256; +var MinInt256 = ( /*#__PURE__*/bignumber_1.BigNumber.from("-0x8000000000000000000000000000000000000000000000000000000000000000")); +exports.MinInt256 = MinInt256; +var MaxInt256 = ( /*#__PURE__*/bignumber_1.BigNumber.from("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); +exports.MaxInt256 = MaxInt256; + +},{"@ethersproject/bignumber":31}],36:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HashZero = void 0; +exports.HashZero = "0x0000000000000000000000000000000000000000000000000000000000000000"; - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - parts.push( - lookup[tmp >> 2] + - lookup[(tmp << 4) & 0x3F] + - '==' - ) - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + uint8[len - 1] - parts.push( - lookup[tmp >> 10] + - lookup[(tmp >> 4) & 0x3F] + - lookup[(tmp << 2) & 0x3F] + - '=' - ) - } +},{}],37:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EtherSymbol = exports.HashZero = exports.MaxInt256 = exports.MinInt256 = exports.MaxUint256 = exports.WeiPerEther = exports.Two = exports.One = exports.Zero = exports.NegativeOne = exports.AddressZero = void 0; +var addresses_1 = require("./addresses"); +Object.defineProperty(exports, "AddressZero", { enumerable: true, get: function () { return addresses_1.AddressZero; } }); +var bignumbers_1 = require("./bignumbers"); +Object.defineProperty(exports, "NegativeOne", { enumerable: true, get: function () { return bignumbers_1.NegativeOne; } }); +Object.defineProperty(exports, "Zero", { enumerable: true, get: function () { return bignumbers_1.Zero; } }); +Object.defineProperty(exports, "One", { enumerable: true, get: function () { return bignumbers_1.One; } }); +Object.defineProperty(exports, "Two", { enumerable: true, get: function () { return bignumbers_1.Two; } }); +Object.defineProperty(exports, "WeiPerEther", { enumerable: true, get: function () { return bignumbers_1.WeiPerEther; } }); +Object.defineProperty(exports, "MaxUint256", { enumerable: true, get: function () { return bignumbers_1.MaxUint256; } }); +Object.defineProperty(exports, "MinInt256", { enumerable: true, get: function () { return bignumbers_1.MinInt256; } }); +Object.defineProperty(exports, "MaxInt256", { enumerable: true, get: function () { return bignumbers_1.MaxInt256; } }); +var hashes_1 = require("./hashes"); +Object.defineProperty(exports, "HashZero", { enumerable: true, get: function () { return hashes_1.HashZero; } }); +var strings_1 = require("./strings"); +Object.defineProperty(exports, "EtherSymbol", { enumerable: true, get: function () { return strings_1.EtherSymbol; } }); + +},{"./addresses":34,"./bignumbers":35,"./hashes":36,"./strings":38}],38:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EtherSymbol = void 0; +// NFKC (composed) // (decomposed) +exports.EtherSymbol = "\u039e"; // "\uD835\uDF63"; - return parts.join('') -} +},{}],39:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "contracts/5.4.1"; -},{}],17:[function(require,module,exports){ -;(function (globalObject) { - 'use strict'; - -/* - * bignumber.js v9.0.1 - * A JavaScript library for arbitrary-precision arithmetic. - * https://github.com/MikeMcl/bignumber.js - * Copyright (c) 2020 Michael Mclaughlin - * MIT Licensed. - * - * BigNumber.prototype methods | BigNumber methods - * | - * absoluteValue abs | clone - * comparedTo | config set - * decimalPlaces dp | DECIMAL_PLACES - * dividedBy div | ROUNDING_MODE - * dividedToIntegerBy idiv | EXPONENTIAL_AT - * exponentiatedBy pow | RANGE - * integerValue | CRYPTO - * isEqualTo eq | MODULO_MODE - * isFinite | POW_PRECISION - * isGreaterThan gt | FORMAT - * isGreaterThanOrEqualTo gte | ALPHABET - * isInteger | isBigNumber - * isLessThan lt | maximum max - * isLessThanOrEqualTo lte | minimum min - * isNaN | random - * isNegative | sum - * isPositive | - * isZero | - * minus | - * modulo mod | - * multipliedBy times | - * negated | - * plus | - * precision sd | - * shiftedBy | - * squareRoot sqrt | - * toExponential | - * toFixed | - * toFormat | - * toFraction | +},{}],40:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from) { + for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) + to[j] = from[i]; + return to; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractFactory = exports.Contract = exports.BaseContract = void 0; +var abi_1 = require("@ethersproject/abi"); +var abstract_provider_1 = require("@ethersproject/abstract-provider"); +var abstract_signer_1 = require("@ethersproject/abstract-signer"); +var address_1 = require("@ethersproject/address"); +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var properties_1 = require("@ethersproject/properties"); +var transactions_1 = require("@ethersproject/transactions"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +; +; +/////////////////////////////// +var allowedTransactionKeys = { + chainId: true, data: true, from: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true, + type: true, accessList: true, + maxFeePerGas: true, maxPriorityFeePerGas: true +}; +function resolveName(resolver, nameOrPromise) { + return __awaiter(this, void 0, void 0, function () { + var name, address; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, nameOrPromise]; + case 1: + name = _a.sent(); + // If it is already an address, just use it (after adding checksum) + try { + return [2 /*return*/, address_1.getAddress(name)]; + } + catch (error) { } + if (!resolver) { + logger.throwError("a provider or signer is needed to resolve ENS names", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "resolveName" + }); + } + return [4 /*yield*/, resolver.resolveName(name)]; + case 2: + address = _a.sent(); + if (address == null) { + logger.throwArgumentError("resolver or addr is not configured for ENS name", "name", name); + } + return [2 /*return*/, address]; + } + }); + }); +} +// Recursively replaces ENS names with promises to resolve the name and resolves all properties +function resolveAddresses(resolver, value, paramType) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!Array.isArray(paramType)) return [3 /*break*/, 2]; + return [4 /*yield*/, Promise.all(paramType.map(function (paramType, index) { + return resolveAddresses(resolver, ((Array.isArray(value)) ? value[index] : value[paramType.name]), paramType); + }))]; + case 1: return [2 /*return*/, _a.sent()]; + case 2: + if (!(paramType.type === "address")) return [3 /*break*/, 4]; + return [4 /*yield*/, resolveName(resolver, value)]; + case 3: return [2 /*return*/, _a.sent()]; + case 4: + if (!(paramType.type === "tuple")) return [3 /*break*/, 6]; + return [4 /*yield*/, resolveAddresses(resolver, value, paramType.components)]; + case 5: return [2 /*return*/, _a.sent()]; + case 6: + if (!(paramType.baseType === "array")) return [3 /*break*/, 8]; + if (!Array.isArray(value)) { + return [2 /*return*/, Promise.reject(new Error("invalid value for array"))]; + } + return [4 /*yield*/, Promise.all(value.map(function (v) { return resolveAddresses(resolver, v, paramType.arrayChildren); }))]; + case 7: return [2 /*return*/, _a.sent()]; + case 8: return [2 /*return*/, value]; + } + }); + }); +} +function populateTransaction(contract, fragment, args) { + return __awaiter(this, void 0, void 0, function () { + var overrides, resolved, data, tx, ro, intrinsic, bytes, i, roValue, leftovers; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + overrides = {}; + if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { + overrides = properties_1.shallowCopy(args.pop()); + } + // Make sure the parameter count matches + logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); + // Populate "from" override (allow promises) + if (contract.signer) { + if (overrides.from) { + // Contracts with a Signer are from the Signer's frame-of-reference; + // but we allow overriding "from" if it matches the signer + overrides.from = properties_1.resolveProperties({ + override: resolveName(contract.signer, overrides.from), + signer: contract.signer.getAddress() + }).then(function (check) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + if (address_1.getAddress(check.signer) !== check.override) { + logger.throwError("Contract with a Signer cannot override from", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "overrides.from" + }); + } + return [2 /*return*/, check.override]; + }); + }); }); + } + else { + overrides.from = contract.signer.getAddress(); + } + } + else if (overrides.from) { + overrides.from = resolveName(contract.provider, overrides.from); + //} else { + // Contracts without a signer can override "from", and if + // unspecified the zero address is used + //overrides.from = AddressZero; + } + return [4 /*yield*/, properties_1.resolveProperties({ + args: resolveAddresses(contract.signer || contract.provider, args, fragment.inputs), + address: contract.resolvedAddress, + overrides: (properties_1.resolveProperties(overrides) || {}) + })]; + case 1: + resolved = _a.sent(); + data = contract.interface.encodeFunctionData(fragment, resolved.args); + tx = { + data: data, + to: resolved.address + }; + ro = resolved.overrides; + // Populate simple overrides + if (ro.nonce != null) { + tx.nonce = bignumber_1.BigNumber.from(ro.nonce).toNumber(); + } + if (ro.gasLimit != null) { + tx.gasLimit = bignumber_1.BigNumber.from(ro.gasLimit); + } + if (ro.gasPrice != null) { + tx.gasPrice = bignumber_1.BigNumber.from(ro.gasPrice); + } + if (ro.maxFeePerGas != null) { + tx.maxFeePerGas = bignumber_1.BigNumber.from(ro.maxFeePerGas); + } + if (ro.maxPriorityFeePerGas != null) { + tx.maxPriorityFeePerGas = bignumber_1.BigNumber.from(ro.maxPriorityFeePerGas); + } + if (ro.from != null) { + tx.from = ro.from; + } + if (ro.type != null) { + tx.type = ro.type; + } + if (ro.accessList != null) { + tx.accessList = transactions_1.accessListify(ro.accessList); + } + // If there was no "gasLimit" override, but the ABI specifies a default, use it + if (tx.gasLimit == null && fragment.gas != null) { + intrinsic = 21000; + bytes = bytes_1.arrayify(data); + for (i = 0; i < bytes.length; i++) { + intrinsic += 4; + if (bytes[i]) { + intrinsic += 64; + } + } + tx.gasLimit = bignumber_1.BigNumber.from(fragment.gas).add(intrinsic); + } + // Populate "value" override + if (ro.value) { + roValue = bignumber_1.BigNumber.from(ro.value); + if (!roValue.isZero() && !fragment.payable) { + logger.throwError("non-payable method cannot override value", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "overrides.value", + value: overrides.value + }); + } + tx.value = roValue; + } + // Remvoe the overrides + delete overrides.nonce; + delete overrides.gasLimit; + delete overrides.gasPrice; + delete overrides.from; + delete overrides.value; + delete overrides.type; + delete overrides.accessList; + delete overrides.maxFeePerGas; + delete overrides.maxPriorityFeePerGas; + leftovers = Object.keys(overrides).filter(function (key) { return (overrides[key] != null); }); + if (leftovers.length) { + logger.throwError("cannot override " + leftovers.map(function (l) { return JSON.stringify(l); }).join(","), logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "overrides", + overrides: leftovers + }); + } + return [2 /*return*/, tx]; + } + }); + }); +} +function buildPopulate(contract, fragment) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return populateTransaction(contract, fragment, args); + }; +} +function buildEstimate(contract, fragment) { + var signerOrProvider = (contract.signer || contract.provider); + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return __awaiter(this, void 0, void 0, function () { + var tx; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!signerOrProvider) { + logger.throwError("estimate require a provider or signer", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "estimateGas" + }); + } + return [4 /*yield*/, populateTransaction(contract, fragment, args)]; + case 1: + tx = _a.sent(); + return [4 /*yield*/, signerOrProvider.estimateGas(tx)]; + case 2: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; +} +function buildCall(contract, fragment, collapseSimple) { + var signerOrProvider = (contract.signer || contract.provider); + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return __awaiter(this, void 0, void 0, function () { + var blockTag, overrides, tx, result, value; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + blockTag = undefined; + if (!(args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object")) return [3 /*break*/, 3]; + overrides = properties_1.shallowCopy(args.pop()); + if (!(overrides.blockTag != null)) return [3 /*break*/, 2]; + return [4 /*yield*/, overrides.blockTag]; + case 1: + blockTag = _a.sent(); + _a.label = 2; + case 2: + delete overrides.blockTag; + args.push(overrides); + _a.label = 3; + case 3: + if (!(contract.deployTransaction != null)) return [3 /*break*/, 5]; + return [4 /*yield*/, contract._deployed(blockTag)]; + case 4: + _a.sent(); + _a.label = 5; + case 5: return [4 /*yield*/, populateTransaction(contract, fragment, args)]; + case 6: + tx = _a.sent(); + return [4 /*yield*/, signerOrProvider.call(tx, blockTag)]; + case 7: + result = _a.sent(); + try { + value = contract.interface.decodeFunctionResult(fragment, result); + if (collapseSimple && fragment.outputs.length === 1) { + value = value[0]; + } + return [2 /*return*/, value]; + } + catch (error) { + if (error.code === logger_1.Logger.errors.CALL_EXCEPTION) { + error.address = contract.address; + error.args = args; + error.transaction = tx; + } + throw error; + } + return [2 /*return*/]; + } + }); + }); + }; +} +function buildSend(contract, fragment) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return __awaiter(this, void 0, void 0, function () { + var txRequest, tx, wait; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!contract.signer) { + logger.throwError("sending a transaction requires a signer", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "sendTransaction" + }); + } + if (!(contract.deployTransaction != null)) return [3 /*break*/, 2]; + return [4 /*yield*/, contract._deployed()]; + case 1: + _a.sent(); + _a.label = 2; + case 2: return [4 /*yield*/, populateTransaction(contract, fragment, args)]; + case 3: + txRequest = _a.sent(); + return [4 /*yield*/, contract.signer.sendTransaction(txRequest)]; + case 4: + tx = _a.sent(); + wait = tx.wait.bind(tx); + tx.wait = function (confirmations) { + return wait(confirmations).then(function (receipt) { + receipt.events = receipt.logs.map(function (log) { + var event = properties_1.deepCopy(log); + var parsed = null; + try { + parsed = contract.interface.parseLog(log); + } + catch (e) { } + // Successfully parsed the event log; include it + if (parsed) { + event.args = parsed.args; + event.decode = function (data, topics) { + return contract.interface.decodeEventLog(parsed.eventFragment, data, topics); + }; + event.event = parsed.name; + event.eventSignature = parsed.signature; + } + // Useful operations + event.removeListener = function () { return contract.provider; }; + event.getBlock = function () { + return contract.provider.getBlock(receipt.blockHash); + }; + event.getTransaction = function () { + return contract.provider.getTransaction(receipt.transactionHash); + }; + event.getTransactionReceipt = function () { + return Promise.resolve(receipt); + }; + return event; + }); + return receipt; + }); + }; + return [2 /*return*/, tx]; + } + }); + }); + }; +} +function buildDefault(contract, fragment, collapseSimple) { + if (fragment.constant) { + return buildCall(contract, fragment, collapseSimple); + } + return buildSend(contract, fragment); +} +function getEventTag(filter) { + if (filter.address && (filter.topics == null || filter.topics.length === 0)) { + return "*"; + } + return (filter.address || "*") + "@" + (filter.topics ? filter.topics.map(function (topic) { + if (Array.isArray(topic)) { + return topic.join("|"); + } + return topic; + }).join(":") : ""); +} +var RunningEvent = /** @class */ (function () { + function RunningEvent(tag, filter) { + properties_1.defineReadOnly(this, "tag", tag); + properties_1.defineReadOnly(this, "filter", filter); + this._listeners = []; + } + RunningEvent.prototype.addListener = function (listener, once) { + this._listeners.push({ listener: listener, once: once }); + }; + RunningEvent.prototype.removeListener = function (listener) { + var done = false; + this._listeners = this._listeners.filter(function (item) { + if (done || item.listener !== listener) { + return true; + } + done = true; + return false; + }); + }; + RunningEvent.prototype.removeAllListeners = function () { + this._listeners = []; + }; + RunningEvent.prototype.listeners = function () { + return this._listeners.map(function (i) { return i.listener; }); + }; + RunningEvent.prototype.listenerCount = function () { + return this._listeners.length; + }; + RunningEvent.prototype.run = function (args) { + var _this = this; + var listenerCount = this.listenerCount(); + this._listeners = this._listeners.filter(function (item) { + var argsCopy = args.slice(); + // Call the callback in the next event loop + setTimeout(function () { + item.listener.apply(_this, argsCopy); + }, 0); + // Reschedule it if it not "once" + return !(item.once); + }); + return listenerCount; + }; + RunningEvent.prototype.prepareEvent = function (event) { + }; + // Returns the array that will be applied to an emit + RunningEvent.prototype.getEmit = function (event) { + return [event]; + }; + return RunningEvent; +}()); +var ErrorRunningEvent = /** @class */ (function (_super) { + __extends(ErrorRunningEvent, _super); + function ErrorRunningEvent() { + return _super.call(this, "error", null) || this; + } + return ErrorRunningEvent; +}(RunningEvent)); +// @TODO Fragment should inherit Wildcard? and just override getEmit? +// or have a common abstract super class, with enough constructor +// options to configure both. +// A Fragment Event will populate all the properties that Wildcard +// will, and additioanlly dereference the arguments when emitting +var FragmentRunningEvent = /** @class */ (function (_super) { + __extends(FragmentRunningEvent, _super); + function FragmentRunningEvent(address, contractInterface, fragment, topics) { + var _this = this; + var filter = { + address: address + }; + var topic = contractInterface.getEventTopic(fragment); + if (topics) { + if (topic !== topics[0]) { + logger.throwArgumentError("topic mismatch", "topics", topics); + } + filter.topics = topics.slice(); + } + else { + filter.topics = [topic]; + } + _this = _super.call(this, getEventTag(filter), filter) || this; + properties_1.defineReadOnly(_this, "address", address); + properties_1.defineReadOnly(_this, "interface", contractInterface); + properties_1.defineReadOnly(_this, "fragment", fragment); + return _this; + } + FragmentRunningEvent.prototype.prepareEvent = function (event) { + var _this = this; + _super.prototype.prepareEvent.call(this, event); + event.event = this.fragment.name; + event.eventSignature = this.fragment.format(); + event.decode = function (data, topics) { + return _this.interface.decodeEventLog(_this.fragment, data, topics); + }; + try { + event.args = this.interface.decodeEventLog(this.fragment, event.data, event.topics); + } + catch (error) { + event.args = null; + event.decodeError = error; + } + }; + FragmentRunningEvent.prototype.getEmit = function (event) { + var errors = abi_1.checkResultErrors(event.args); + if (errors.length) { + throw errors[0].error; + } + var args = (event.args || []).slice(); + args.push(event); + return args; + }; + return FragmentRunningEvent; +}(RunningEvent)); +// A Wildard Event will attempt to populate: +// - event The name of the event name +// - eventSignature The full signature of the event +// - decode A function to decode data and topics +// - args The decoded data and topics +var WildcardRunningEvent = /** @class */ (function (_super) { + __extends(WildcardRunningEvent, _super); + function WildcardRunningEvent(address, contractInterface) { + var _this = _super.call(this, "*", { address: address }) || this; + properties_1.defineReadOnly(_this, "address", address); + properties_1.defineReadOnly(_this, "interface", contractInterface); + return _this; + } + WildcardRunningEvent.prototype.prepareEvent = function (event) { + var _this = this; + _super.prototype.prepareEvent.call(this, event); + try { + var parsed_1 = this.interface.parseLog(event); + event.event = parsed_1.name; + event.eventSignature = parsed_1.signature; + event.decode = function (data, topics) { + return _this.interface.decodeEventLog(parsed_1.eventFragment, data, topics); + }; + event.args = parsed_1.args; + } + catch (error) { + // No matching event + } + }; + return WildcardRunningEvent; +}(RunningEvent)); +var BaseContract = /** @class */ (function () { + function BaseContract(addressOrName, contractInterface, signerOrProvider) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, Contract); + // @TODO: Maybe still check the addressOrName looks like a valid address or name? + //address = getAddress(address); + properties_1.defineReadOnly(this, "interface", properties_1.getStatic((_newTarget), "getInterface")(contractInterface)); + if (signerOrProvider == null) { + properties_1.defineReadOnly(this, "provider", null); + properties_1.defineReadOnly(this, "signer", null); + } + else if (abstract_signer_1.Signer.isSigner(signerOrProvider)) { + properties_1.defineReadOnly(this, "provider", signerOrProvider.provider || null); + properties_1.defineReadOnly(this, "signer", signerOrProvider); + } + else if (abstract_provider_1.Provider.isProvider(signerOrProvider)) { + properties_1.defineReadOnly(this, "provider", signerOrProvider); + properties_1.defineReadOnly(this, "signer", null); + } + else { + logger.throwArgumentError("invalid signer or provider", "signerOrProvider", signerOrProvider); + } + properties_1.defineReadOnly(this, "callStatic", {}); + properties_1.defineReadOnly(this, "estimateGas", {}); + properties_1.defineReadOnly(this, "functions", {}); + properties_1.defineReadOnly(this, "populateTransaction", {}); + properties_1.defineReadOnly(this, "filters", {}); + { + var uniqueFilters_1 = {}; + Object.keys(this.interface.events).forEach(function (eventSignature) { + var event = _this.interface.events[eventSignature]; + properties_1.defineReadOnly(_this.filters, eventSignature, function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return { + address: _this.address, + topics: _this.interface.encodeFilterTopics(event, args) + }; + }); + if (!uniqueFilters_1[event.name]) { + uniqueFilters_1[event.name] = []; + } + uniqueFilters_1[event.name].push(eventSignature); + }); + Object.keys(uniqueFilters_1).forEach(function (name) { + var filters = uniqueFilters_1[name]; + if (filters.length === 1) { + properties_1.defineReadOnly(_this.filters, name, _this.filters[filters[0]]); + } + else { + logger.warn("Duplicate definition of " + name + " (" + filters.join(", ") + ")"); + } + }); + } + properties_1.defineReadOnly(this, "_runningEvents", {}); + properties_1.defineReadOnly(this, "_wrappedEmits", {}); + if (addressOrName == null) { + logger.throwArgumentError("invalid contract address or ENS name", "addressOrName", addressOrName); + } + properties_1.defineReadOnly(this, "address", addressOrName); + if (this.provider) { + properties_1.defineReadOnly(this, "resolvedAddress", resolveName(this.provider, addressOrName)); + } + else { + try { + properties_1.defineReadOnly(this, "resolvedAddress", Promise.resolve(address_1.getAddress(addressOrName))); + } + catch (error) { + // Without a provider, we cannot use ENS names + logger.throwError("provider is required to use ENS name as contract address", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "new Contract" + }); + } + } + var uniqueNames = {}; + var uniqueSignatures = {}; + Object.keys(this.interface.functions).forEach(function (signature) { + var fragment = _this.interface.functions[signature]; + // Check that the signature is unique; if not the ABI generation has + // not been cleaned or may be incorrectly generated + if (uniqueSignatures[signature]) { + logger.warn("Duplicate ABI entry for " + JSON.stringify(signature)); + return; + } + uniqueSignatures[signature] = true; + // Track unique names; we only expose bare named functions if they + // are ambiguous + { + var name_1 = fragment.name; + if (!uniqueNames[name_1]) { + uniqueNames[name_1] = []; + } + uniqueNames[name_1].push(signature); + } + if (_this[signature] == null) { + properties_1.defineReadOnly(_this, signature, buildDefault(_this, fragment, true)); + } + // We do not collapse simple calls on this bucket, which allows + // frameworks to safely use this without introspection as well as + // allows decoding error recovery. + if (_this.functions[signature] == null) { + properties_1.defineReadOnly(_this.functions, signature, buildDefault(_this, fragment, false)); + } + if (_this.callStatic[signature] == null) { + properties_1.defineReadOnly(_this.callStatic, signature, buildCall(_this, fragment, true)); + } + if (_this.populateTransaction[signature] == null) { + properties_1.defineReadOnly(_this.populateTransaction, signature, buildPopulate(_this, fragment)); + } + if (_this.estimateGas[signature] == null) { + properties_1.defineReadOnly(_this.estimateGas, signature, buildEstimate(_this, fragment)); + } + }); + Object.keys(uniqueNames).forEach(function (name) { + // Ambiguous names to not get attached as bare names + var signatures = uniqueNames[name]; + if (signatures.length > 1) { + return; + } + var signature = signatures[0]; + // If overwriting a member property that is null, swallow the error + try { + if (_this[name] == null) { + properties_1.defineReadOnly(_this, name, _this[signature]); + } + } + catch (e) { } + if (_this.functions[name] == null) { + properties_1.defineReadOnly(_this.functions, name, _this.functions[signature]); + } + if (_this.callStatic[name] == null) { + properties_1.defineReadOnly(_this.callStatic, name, _this.callStatic[signature]); + } + if (_this.populateTransaction[name] == null) { + properties_1.defineReadOnly(_this.populateTransaction, name, _this.populateTransaction[signature]); + } + if (_this.estimateGas[name] == null) { + properties_1.defineReadOnly(_this.estimateGas, name, _this.estimateGas[signature]); + } + }); + } + BaseContract.getContractAddress = function (transaction) { + return address_1.getContractAddress(transaction); + }; + BaseContract.getInterface = function (contractInterface) { + if (abi_1.Interface.isInterface(contractInterface)) { + return contractInterface; + } + return new abi_1.Interface(contractInterface); + }; + // @TODO: Allow timeout? + BaseContract.prototype.deployed = function () { + return this._deployed(); + }; + BaseContract.prototype._deployed = function (blockTag) { + var _this = this; + if (!this._deployedPromise) { + // If we were just deployed, we know the transaction we should occur in + if (this.deployTransaction) { + this._deployedPromise = this.deployTransaction.wait().then(function () { + return _this; + }); + } + else { + // @TODO: Once we allow a timeout to be passed in, we will wait + // up to that many blocks for getCode + // Otherwise, poll for our code to be deployed + this._deployedPromise = this.provider.getCode(this.address, blockTag).then(function (code) { + if (code === "0x") { + logger.throwError("contract not deployed", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + contractAddress: _this.address, + operation: "getDeployed" + }); + } + return _this; + }); + } + } + return this._deployedPromise; + }; + // @TODO: + // estimateFallback(overrides?: TransactionRequest): Promise + // @TODO: + // estimateDeploy(bytecode: string, ...args): Promise + BaseContract.prototype.fallback = function (overrides) { + var _this = this; + if (!this.signer) { + logger.throwError("sending a transactions require a signer", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: "sendTransaction(fallback)" }); + } + var tx = properties_1.shallowCopy(overrides || {}); + ["from", "to"].forEach(function (key) { + if (tx[key] == null) { + return; + } + logger.throwError("cannot override " + key, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: key }); + }); + tx.to = this.resolvedAddress; + return this.deployed().then(function () { + return _this.signer.sendTransaction(tx); + }); + }; + // Reconnect to a different signer or provider + BaseContract.prototype.connect = function (signerOrProvider) { + if (typeof (signerOrProvider) === "string") { + signerOrProvider = new abstract_signer_1.VoidSigner(signerOrProvider, this.provider); + } + var contract = new (this.constructor)(this.address, this.interface, signerOrProvider); + if (this.deployTransaction) { + properties_1.defineReadOnly(contract, "deployTransaction", this.deployTransaction); + } + return contract; + }; + // Re-attach to a different on-chain instance of this contract + BaseContract.prototype.attach = function (addressOrName) { + return new (this.constructor)(addressOrName, this.interface, this.signer || this.provider); + }; + BaseContract.isIndexed = function (value) { + return abi_1.Indexed.isIndexed(value); + }; + BaseContract.prototype._normalizeRunningEvent = function (runningEvent) { + // Already have an instance of this event running; we can re-use it + if (this._runningEvents[runningEvent.tag]) { + return this._runningEvents[runningEvent.tag]; + } + return runningEvent; + }; + BaseContract.prototype._getRunningEvent = function (eventName) { + if (typeof (eventName) === "string") { + // Listen for "error" events (if your contract has an error event, include + // the full signature to bypass this special event keyword) + if (eventName === "error") { + return this._normalizeRunningEvent(new ErrorRunningEvent()); + } + // Listen for any event that is registered + if (eventName === "event") { + return this._normalizeRunningEvent(new RunningEvent("event", null)); + } + // Listen for any event + if (eventName === "*") { + return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface)); + } + // Get the event Fragment (throws if ambiguous/unknown event) + var fragment = this.interface.getEvent(eventName); + return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment)); + } + // We have topics to filter by... + if (eventName.topics && eventName.topics.length > 0) { + // Is it a known topichash? (throws if no matching topichash) + try { + var topic = eventName.topics[0]; + if (typeof (topic) !== "string") { + throw new Error("invalid topic"); // @TODO: May happen for anonymous events + } + var fragment = this.interface.getEvent(topic); + return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment, eventName.topics)); + } + catch (error) { } + // Filter by the unknown topichash + var filter = { + address: this.address, + topics: eventName.topics + }; + return this._normalizeRunningEvent(new RunningEvent(getEventTag(filter), filter)); + } + return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface)); + }; + BaseContract.prototype._checkRunningEvents = function (runningEvent) { + if (runningEvent.listenerCount() === 0) { + delete this._runningEvents[runningEvent.tag]; + // If we have a poller for this, remove it + var emit = this._wrappedEmits[runningEvent.tag]; + if (emit && runningEvent.filter) { + this.provider.off(runningEvent.filter, emit); + delete this._wrappedEmits[runningEvent.tag]; + } + } + }; + // Subclasses can override this to gracefully recover + // from parse errors if they wish + BaseContract.prototype._wrapEvent = function (runningEvent, log, listener) { + var _this = this; + var event = properties_1.deepCopy(log); + event.removeListener = function () { + if (!listener) { + return; + } + runningEvent.removeListener(listener); + _this._checkRunningEvents(runningEvent); + }; + event.getBlock = function () { return _this.provider.getBlock(log.blockHash); }; + event.getTransaction = function () { return _this.provider.getTransaction(log.transactionHash); }; + event.getTransactionReceipt = function () { return _this.provider.getTransactionReceipt(log.transactionHash); }; + // This may throw if the topics and data mismatch the signature + runningEvent.prepareEvent(event); + return event; + }; + BaseContract.prototype._addEventListener = function (runningEvent, listener, once) { + var _this = this; + if (!this.provider) { + logger.throwError("events require a provider or a signer with a provider", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: "once" }); + } + runningEvent.addListener(listener, once); + // Track this running event and its listeners (may already be there; but no hard in updating) + this._runningEvents[runningEvent.tag] = runningEvent; + // If we are not polling the provider, start polling + if (!this._wrappedEmits[runningEvent.tag]) { + var wrappedEmit = function (log) { + var event = _this._wrapEvent(runningEvent, log, listener); + // Try to emit the result for the parameterized event... + if (event.decodeError == null) { + try { + var args = runningEvent.getEmit(event); + _this.emit.apply(_this, __spreadArray([runningEvent.filter], args)); + } + catch (error) { + event.decodeError = error.error; + } + } + // Always emit "event" for fragment-base events + if (runningEvent.filter != null) { + _this.emit("event", event); + } + // Emit "error" if there was an error + if (event.decodeError != null) { + _this.emit("error", event.decodeError, event); + } + }; + this._wrappedEmits[runningEvent.tag] = wrappedEmit; + // Special events, like "error" do not have a filter + if (runningEvent.filter != null) { + this.provider.on(runningEvent.filter, wrappedEmit); + } + } + }; + BaseContract.prototype.queryFilter = function (event, fromBlockOrBlockhash, toBlock) { + var _this = this; + var runningEvent = this._getRunningEvent(event); + var filter = properties_1.shallowCopy(runningEvent.filter); + if (typeof (fromBlockOrBlockhash) === "string" && bytes_1.isHexString(fromBlockOrBlockhash, 32)) { + if (toBlock != null) { + logger.throwArgumentError("cannot specify toBlock with blockhash", "toBlock", toBlock); + } + filter.blockHash = fromBlockOrBlockhash; + } + else { + filter.fromBlock = ((fromBlockOrBlockhash != null) ? fromBlockOrBlockhash : 0); + filter.toBlock = ((toBlock != null) ? toBlock : "latest"); + } + return this.provider.getLogs(filter).then(function (logs) { + return logs.map(function (log) { return _this._wrapEvent(runningEvent, log, null); }); + }); + }; + BaseContract.prototype.on = function (event, listener) { + this._addEventListener(this._getRunningEvent(event), listener, false); + return this; + }; + BaseContract.prototype.once = function (event, listener) { + this._addEventListener(this._getRunningEvent(event), listener, true); + return this; + }; + BaseContract.prototype.emit = function (eventName) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this.provider) { + return false; + } + var runningEvent = this._getRunningEvent(eventName); + var result = (runningEvent.run(args) > 0); + // May have drained all the "once" events; check for living events + this._checkRunningEvents(runningEvent); + return result; + }; + BaseContract.prototype.listenerCount = function (eventName) { + var _this = this; + if (!this.provider) { + return 0; + } + if (eventName == null) { + return Object.keys(this._runningEvents).reduce(function (accum, key) { + return accum + _this._runningEvents[key].listenerCount(); + }, 0); + } + return this._getRunningEvent(eventName).listenerCount(); + }; + BaseContract.prototype.listeners = function (eventName) { + if (!this.provider) { + return []; + } + if (eventName == null) { + var result_1 = []; + for (var tag in this._runningEvents) { + this._runningEvents[tag].listeners().forEach(function (listener) { + result_1.push(listener); + }); + } + return result_1; + } + return this._getRunningEvent(eventName).listeners(); + }; + BaseContract.prototype.removeAllListeners = function (eventName) { + if (!this.provider) { + return this; + } + if (eventName == null) { + for (var tag in this._runningEvents) { + var runningEvent_1 = this._runningEvents[tag]; + runningEvent_1.removeAllListeners(); + this._checkRunningEvents(runningEvent_1); + } + return this; + } + // Delete any listeners + var runningEvent = this._getRunningEvent(eventName); + runningEvent.removeAllListeners(); + this._checkRunningEvents(runningEvent); + return this; + }; + BaseContract.prototype.off = function (eventName, listener) { + if (!this.provider) { + return this; + } + var runningEvent = this._getRunningEvent(eventName); + runningEvent.removeListener(listener); + this._checkRunningEvents(runningEvent); + return this; + }; + BaseContract.prototype.removeListener = function (eventName, listener) { + return this.off(eventName, listener); + }; + return BaseContract; +}()); +exports.BaseContract = BaseContract; +var Contract = /** @class */ (function (_super) { + __extends(Contract, _super); + function Contract() { + return _super !== null && _super.apply(this, arguments) || this; + } + return Contract; +}(BaseContract)); +exports.Contract = Contract; +var ContractFactory = /** @class */ (function () { + function ContractFactory(contractInterface, bytecode, signer) { + var _newTarget = this.constructor; + var bytecodeHex = null; + if (typeof (bytecode) === "string") { + bytecodeHex = bytecode; + } + else if (bytes_1.isBytes(bytecode)) { + bytecodeHex = bytes_1.hexlify(bytecode); + } + else if (bytecode && typeof (bytecode.object) === "string") { + // Allow the bytecode object from the Solidity compiler + bytecodeHex = bytecode.object; + } + else { + // Crash in the next verification step + bytecodeHex = "!"; + } + // Make sure it is 0x prefixed + if (bytecodeHex.substring(0, 2) !== "0x") { + bytecodeHex = "0x" + bytecodeHex; + } + // Make sure the final result is valid bytecode + if (!bytes_1.isHexString(bytecodeHex) || (bytecodeHex.length % 2)) { + logger.throwArgumentError("invalid bytecode", "bytecode", bytecode); + } + // If we have a signer, make sure it is valid + if (signer && !abstract_signer_1.Signer.isSigner(signer)) { + logger.throwArgumentError("invalid signer", "signer", signer); + } + properties_1.defineReadOnly(this, "bytecode", bytecodeHex); + properties_1.defineReadOnly(this, "interface", properties_1.getStatic((_newTarget), "getInterface")(contractInterface)); + properties_1.defineReadOnly(this, "signer", signer || null); + } + // @TODO: Future; rename to populteTransaction? + ContractFactory.prototype.getDeployTransaction = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var tx = {}; + // If we have 1 additional argument, we allow transaction overrides + if (args.length === this.interface.deploy.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { + tx = properties_1.shallowCopy(args.pop()); + for (var key in tx) { + if (!allowedTransactionKeys[key]) { + throw new Error("unknown transaction override " + key); + } + } + } + // Do not allow these to be overridden in a deployment transaction + ["data", "from", "to"].forEach(function (key) { + if (tx[key] == null) { + return; + } + logger.throwError("cannot override " + key, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: key }); + }); + if (tx.value) { + var value = bignumber_1.BigNumber.from(tx.value); + if (!value.isZero() && !this.interface.deploy.payable) { + logger.throwError("non-payable constructor cannot override value", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "overrides.value", + value: tx.value + }); + } + } + // Make sure the call matches the constructor signature + logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, " in Contract constructor"); + // Set the data to the bytecode + the encoded constructor arguments + tx.data = bytes_1.hexlify(bytes_1.concat([ + this.bytecode, + this.interface.encodeDeploy(args) + ])); + return tx; + }; + ContractFactory.prototype.deploy = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return __awaiter(this, void 0, void 0, function () { + var overrides, params, unsignedTx, tx, address, contract; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + overrides = {}; + // If 1 extra parameter was passed in, it contains overrides + if (args.length === this.interface.deploy.inputs.length + 1) { + overrides = args.pop(); + } + // Make sure the call matches the constructor signature + logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, " in Contract constructor"); + return [4 /*yield*/, resolveAddresses(this.signer, args, this.interface.deploy.inputs)]; + case 1: + params = _a.sent(); + params.push(overrides); + unsignedTx = this.getDeployTransaction.apply(this, params); + return [4 /*yield*/, this.signer.sendTransaction(unsignedTx)]; + case 2: + tx = _a.sent(); + address = properties_1.getStatic(this.constructor, "getContractAddress")(tx); + contract = properties_1.getStatic(this.constructor, "getContract")(address, this.interface, this.signer); + properties_1.defineReadOnly(contract, "deployTransaction", tx); + return [2 /*return*/, contract]; + } + }); + }); + }; + ContractFactory.prototype.attach = function (address) { + return (this.constructor).getContract(address, this.interface, this.signer); + }; + ContractFactory.prototype.connect = function (signer) { + return new (this.constructor)(this.interface, this.bytecode, signer); + }; + ContractFactory.fromSolidity = function (compilerOutput, signer) { + if (compilerOutput == null) { + logger.throwError("missing compiler output", logger_1.Logger.errors.MISSING_ARGUMENT, { argument: "compilerOutput" }); + } + if (typeof (compilerOutput) === "string") { + compilerOutput = JSON.parse(compilerOutput); + } + var abi = compilerOutput.abi; + var bytecode = null; + if (compilerOutput.bytecode) { + bytecode = compilerOutput.bytecode; + } + else if (compilerOutput.evm && compilerOutput.evm.bytecode) { + bytecode = compilerOutput.evm.bytecode; + } + return new this(abi, bytecode, signer); + }; + ContractFactory.getInterface = function (contractInterface) { + return Contract.getInterface(contractInterface); + }; + ContractFactory.getContractAddress = function (tx) { + return address_1.getContractAddress(tx); + }; + ContractFactory.getContract = function (address, contractInterface, signer) { + return new Contract(address, contractInterface, signer); + }; + return ContractFactory; +}()); +exports.ContractFactory = ContractFactory; + +},{"./_version":39,"@ethersproject/abi":17,"@ethersproject/abstract-provider":20,"@ethersproject/abstract-signer":22,"@ethersproject/address":24,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/transactions":102}],41:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "hash/5.4.0"; + +},{}],42:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.id = void 0; +var keccak256_1 = require("@ethersproject/keccak256"); +var strings_1 = require("@ethersproject/strings"); +function id(text) { + return keccak256_1.keccak256(strings_1.toUtf8Bytes(text)); +} +exports.id = id; + +},{"@ethersproject/keccak256":55,"@ethersproject/strings":99}],43:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports._TypedDataEncoder = exports.hashMessage = exports.messagePrefix = exports.isValidName = exports.namehash = exports.id = void 0; +var id_1 = require("./id"); +Object.defineProperty(exports, "id", { enumerable: true, get: function () { return id_1.id; } }); +var namehash_1 = require("./namehash"); +Object.defineProperty(exports, "isValidName", { enumerable: true, get: function () { return namehash_1.isValidName; } }); +Object.defineProperty(exports, "namehash", { enumerable: true, get: function () { return namehash_1.namehash; } }); +var message_1 = require("./message"); +Object.defineProperty(exports, "hashMessage", { enumerable: true, get: function () { return message_1.hashMessage; } }); +Object.defineProperty(exports, "messagePrefix", { enumerable: true, get: function () { return message_1.messagePrefix; } }); +var typed_data_1 = require("./typed-data"); +Object.defineProperty(exports, "_TypedDataEncoder", { enumerable: true, get: function () { return typed_data_1.TypedDataEncoder; } }); + +},{"./id":42,"./message":44,"./namehash":45,"./typed-data":46}],44:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.hashMessage = exports.messagePrefix = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var keccak256_1 = require("@ethersproject/keccak256"); +var strings_1 = require("@ethersproject/strings"); +exports.messagePrefix = "\x19Ethereum Signed Message:\n"; +function hashMessage(message) { + if (typeof (message) === "string") { + message = strings_1.toUtf8Bytes(message); + } + return keccak256_1.keccak256(bytes_1.concat([ + strings_1.toUtf8Bytes(exports.messagePrefix), + strings_1.toUtf8Bytes(String(message.length)), + message + ])); +} +exports.hashMessage = hashMessage; + +},{"@ethersproject/bytes":33,"@ethersproject/keccak256":55,"@ethersproject/strings":99}],45:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.namehash = exports.isValidName = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var strings_1 = require("@ethersproject/strings"); +var keccak256_1 = require("@ethersproject/keccak256"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var Zeros = new Uint8Array(32); +Zeros.fill(0); +var Partition = new RegExp("^((.*)\\.)?([^.]+)$"); +function isValidName(name) { + try { + var comps = name.split("."); + for (var i = 0; i < comps.length; i++) { + if (strings_1.nameprep(comps[i]).length === 0) { + throw new Error("empty"); + } + } + return true; + } + catch (error) { } + return false; +} +exports.isValidName = isValidName; +function namehash(name) { + /* istanbul ignore if */ + if (typeof (name) !== "string") { + logger.throwArgumentError("invalid ENS name; not a string", "name", name); + } + var current = name; + var result = Zeros; + while (current.length) { + var partition = current.match(Partition); + if (partition == null || partition[2] === "") { + logger.throwArgumentError("invalid ENS address; missing component", "name", name); + } + var label = strings_1.toUtf8Bytes(strings_1.nameprep(partition[3])); + result = keccak256_1.keccak256(bytes_1.concat([result, keccak256_1.keccak256(label)])); + current = partition[2] || ""; + } + return bytes_1.hexlify(result); +} +exports.namehash = namehash; + +},{"./_version":41,"@ethersproject/bytes":33,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/strings":99}],46:[function(require,module,exports){ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TypedDataEncoder = void 0; +var address_1 = require("@ethersproject/address"); +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var keccak256_1 = require("@ethersproject/keccak256"); +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var id_1 = require("./id"); +var padding = new Uint8Array(32); +padding.fill(0); +var NegativeOne = bignumber_1.BigNumber.from(-1); +var Zero = bignumber_1.BigNumber.from(0); +var One = bignumber_1.BigNumber.from(1); +var MaxUint256 = bignumber_1.BigNumber.from("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); +function hexPadRight(value) { + var bytes = bytes_1.arrayify(value); + var padOffset = bytes.length % 32; + if (padOffset) { + return bytes_1.hexConcat([bytes, padding.slice(padOffset)]); + } + return bytes_1.hexlify(bytes); +} +var hexTrue = bytes_1.hexZeroPad(One.toHexString(), 32); +var hexFalse = bytes_1.hexZeroPad(Zero.toHexString(), 32); +var domainFieldTypes = { + name: "string", + version: "string", + chainId: "uint256", + verifyingContract: "address", + salt: "bytes32" +}; +var domainFieldNames = [ + "name", "version", "chainId", "verifyingContract", "salt" +]; +function checkString(key) { + return function (value) { + if (typeof (value) !== "string") { + logger.throwArgumentError("invalid domain value for " + JSON.stringify(key), "domain." + key, value); + } + return value; + }; +} +var domainChecks = { + name: checkString("name"), + version: checkString("version"), + chainId: function (value) { + try { + return bignumber_1.BigNumber.from(value).toString(); + } + catch (error) { } + return logger.throwArgumentError("invalid domain value for \"chainId\"", "domain.chainId", value); + }, + verifyingContract: function (value) { + try { + return address_1.getAddress(value).toLowerCase(); + } + catch (error) { } + return logger.throwArgumentError("invalid domain value \"verifyingContract\"", "domain.verifyingContract", value); + }, + salt: function (value) { + try { + var bytes = bytes_1.arrayify(value); + if (bytes.length !== 32) { + throw new Error("bad length"); + } + return bytes_1.hexlify(bytes); + } + catch (error) { } + return logger.throwArgumentError("invalid domain value \"salt\"", "domain.salt", value); + } +}; +function getBaseEncoder(type) { + // intXX and uintXX + { + var match = type.match(/^(u?)int(\d*)$/); + if (match) { + var signed = (match[1] === ""); + var width = parseInt(match[2] || "256"); + if (width % 8 !== 0 || width > 256 || (match[2] && match[2] !== String(width))) { + logger.throwArgumentError("invalid numeric width", "type", type); + } + var boundsUpper_1 = MaxUint256.mask(signed ? (width - 1) : width); + var boundsLower_1 = signed ? boundsUpper_1.add(One).mul(NegativeOne) : Zero; + return function (value) { + var v = bignumber_1.BigNumber.from(value); + if (v.lt(boundsLower_1) || v.gt(boundsUpper_1)) { + logger.throwArgumentError("value out-of-bounds for " + type, "value", value); + } + return bytes_1.hexZeroPad(v.toTwos(256).toHexString(), 32); + }; + } + } + // bytesXX + { + var match = type.match(/^bytes(\d+)$/); + if (match) { + var width_1 = parseInt(match[1]); + if (width_1 === 0 || width_1 > 32 || match[1] !== String(width_1)) { + logger.throwArgumentError("invalid bytes width", "type", type); + } + return function (value) { + var bytes = bytes_1.arrayify(value); + if (bytes.length !== width_1) { + logger.throwArgumentError("invalid length for " + type, "value", value); + } + return hexPadRight(value); + }; + } + } + switch (type) { + case "address": return function (value) { + return bytes_1.hexZeroPad(address_1.getAddress(value), 32); + }; + case "bool": return function (value) { + return ((!value) ? hexFalse : hexTrue); + }; + case "bytes": return function (value) { + return keccak256_1.keccak256(value); + }; + case "string": return function (value) { + return id_1.id(value); + }; + } + return null; +} +function encodeType(name, fields) { + return name + "(" + fields.map(function (_a) { + var name = _a.name, type = _a.type; + return (type + " " + name); + }).join(",") + ")"; +} +var TypedDataEncoder = /** @class */ (function () { + function TypedDataEncoder(types) { + properties_1.defineReadOnly(this, "types", Object.freeze(properties_1.deepCopy(types))); + properties_1.defineReadOnly(this, "_encoderCache", {}); + properties_1.defineReadOnly(this, "_types", {}); + // Link struct types to their direct child structs + var links = {}; + // Link structs to structs which contain them as a child + var parents = {}; + // Link all subtypes within a given struct + var subtypes = {}; + Object.keys(types).forEach(function (type) { + links[type] = {}; + parents[type] = []; + subtypes[type] = {}; + }); + var _loop_1 = function (name_1) { + var uniqueNames = {}; + types[name_1].forEach(function (field) { + // Check each field has a unique name + if (uniqueNames[field.name]) { + logger.throwArgumentError("duplicate variable name " + JSON.stringify(field.name) + " in " + JSON.stringify(name_1), "types", types); + } + uniqueNames[field.name] = true; + // Get the base type (drop any array specifiers) + var baseType = field.type.match(/^([^\x5b]*)(\x5b|$)/)[1]; + if (baseType === name_1) { + logger.throwArgumentError("circular type reference to " + JSON.stringify(baseType), "types", types); + } + // Is this a base encoding type? + var encoder = getBaseEncoder(baseType); + if (encoder) { + return; + } + if (!parents[baseType]) { + logger.throwArgumentError("unknown type " + JSON.stringify(baseType), "types", types); + } + // Add linkage + parents[baseType].push(name_1); + links[name_1][baseType] = true; + }); + }; + for (var name_1 in types) { + _loop_1(name_1); + } + // Deduce the primary type + var primaryTypes = Object.keys(parents).filter(function (n) { return (parents[n].length === 0); }); + if (primaryTypes.length === 0) { + logger.throwArgumentError("missing primary type", "types", types); + } + else if (primaryTypes.length > 1) { + logger.throwArgumentError("ambiguous primary types or unused types: " + primaryTypes.map(function (t) { return (JSON.stringify(t)); }).join(", "), "types", types); + } + properties_1.defineReadOnly(this, "primaryType", primaryTypes[0]); + // Check for circular type references + function checkCircular(type, found) { + if (found[type]) { + logger.throwArgumentError("circular type reference to " + JSON.stringify(type), "types", types); + } + found[type] = true; + Object.keys(links[type]).forEach(function (child) { + if (!parents[child]) { + return; + } + // Recursively check children + checkCircular(child, found); + // Mark all ancestors as having this decendant + Object.keys(found).forEach(function (subtype) { + subtypes[subtype][child] = true; + }); + }); + delete found[type]; + } + checkCircular(this.primaryType, {}); + // Compute each fully describe type + for (var name_2 in subtypes) { + var st = Object.keys(subtypes[name_2]); + st.sort(); + this._types[name_2] = encodeType(name_2, types[name_2]) + st.map(function (t) { return encodeType(t, types[t]); }).join(""); + } + } + TypedDataEncoder.prototype.getEncoder = function (type) { + var encoder = this._encoderCache[type]; + if (!encoder) { + encoder = this._encoderCache[type] = this._getEncoder(type); + } + return encoder; + }; + TypedDataEncoder.prototype._getEncoder = function (type) { + var _this = this; + // Basic encoder type (address, bool, uint256, etc) + { + var encoder = getBaseEncoder(type); + if (encoder) { + return encoder; + } + } + // Array + var match = type.match(/^(.*)(\x5b(\d*)\x5d)$/); + if (match) { + var subtype_1 = match[1]; + var subEncoder_1 = this.getEncoder(subtype_1); + var length_1 = parseInt(match[3]); + return function (value) { + if (length_1 >= 0 && value.length !== length_1) { + logger.throwArgumentError("array length mismatch; expected length ${ arrayLength }", "value", value); + } + var result = value.map(subEncoder_1); + if (_this._types[subtype_1]) { + result = result.map(keccak256_1.keccak256); + } + return keccak256_1.keccak256(bytes_1.hexConcat(result)); + }; + } + // Struct + var fields = this.types[type]; + if (fields) { + var encodedType_1 = id_1.id(this._types[type]); + return function (value) { + var values = fields.map(function (_a) { + var name = _a.name, type = _a.type; + var result = _this.getEncoder(type)(value[name]); + if (_this._types[type]) { + return keccak256_1.keccak256(result); + } + return result; + }); + values.unshift(encodedType_1); + return bytes_1.hexConcat(values); + }; + } + return logger.throwArgumentError("unknown type: " + type, "type", type); + }; + TypedDataEncoder.prototype.encodeType = function (name) { + var result = this._types[name]; + if (!result) { + logger.throwArgumentError("unknown type: " + JSON.stringify(name), "name", name); + } + return result; + }; + TypedDataEncoder.prototype.encodeData = function (type, value) { + return this.getEncoder(type)(value); + }; + TypedDataEncoder.prototype.hashStruct = function (name, value) { + return keccak256_1.keccak256(this.encodeData(name, value)); + }; + TypedDataEncoder.prototype.encode = function (value) { + return this.encodeData(this.primaryType, value); + }; + TypedDataEncoder.prototype.hash = function (value) { + return this.hashStruct(this.primaryType, value); + }; + TypedDataEncoder.prototype._visit = function (type, value, callback) { + var _this = this; + // Basic encoder type (address, bool, uint256, etc) + { + var encoder = getBaseEncoder(type); + if (encoder) { + return callback(type, value); + } + } + // Array + var match = type.match(/^(.*)(\x5b(\d*)\x5d)$/); + if (match) { + var subtype_2 = match[1]; + var length_2 = parseInt(match[3]); + if (length_2 >= 0 && value.length !== length_2) { + logger.throwArgumentError("array length mismatch; expected length ${ arrayLength }", "value", value); + } + return value.map(function (v) { return _this._visit(subtype_2, v, callback); }); + } + // Struct + var fields = this.types[type]; + if (fields) { + return fields.reduce(function (accum, _a) { + var name = _a.name, type = _a.type; + accum[name] = _this._visit(type, value[name], callback); + return accum; + }, {}); + } + return logger.throwArgumentError("unknown type: " + type, "type", type); + }; + TypedDataEncoder.prototype.visit = function (value, callback) { + return this._visit(this.primaryType, value, callback); + }; + TypedDataEncoder.from = function (types) { + return new TypedDataEncoder(types); + }; + TypedDataEncoder.getPrimaryType = function (types) { + return TypedDataEncoder.from(types).primaryType; + }; + TypedDataEncoder.hashStruct = function (name, types, value) { + return TypedDataEncoder.from(types).hashStruct(name, value); + }; + TypedDataEncoder.hashDomain = function (domain) { + var domainFields = []; + for (var name_3 in domain) { + var type = domainFieldTypes[name_3]; + if (!type) { + logger.throwArgumentError("invalid typed-data domain key: " + JSON.stringify(name_3), "domain", domain); + } + domainFields.push({ name: name_3, type: type }); + } + domainFields.sort(function (a, b) { + return domainFieldNames.indexOf(a.name) - domainFieldNames.indexOf(b.name); + }); + return TypedDataEncoder.hashStruct("EIP712Domain", { EIP712Domain: domainFields }, domain); + }; + TypedDataEncoder.encode = function (domain, types, value) { + return bytes_1.hexConcat([ + "0x1901", + TypedDataEncoder.hashDomain(domain), + TypedDataEncoder.from(types).hash(value) + ]); + }; + TypedDataEncoder.hash = function (domain, types, value) { + return keccak256_1.keccak256(TypedDataEncoder.encode(domain, types, value)); + }; + // Replaces all address types with ENS names with their looked up address + TypedDataEncoder.resolveNames = function (domain, types, value, resolveName) { + return __awaiter(this, void 0, void 0, function () { + var ensCache, encoder, _a, _b, _i, name_4, _c, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + // Make a copy to isolate it from the object passed in + domain = properties_1.shallowCopy(domain); + ensCache = {}; + // Do we need to look up the domain's verifyingContract? + if (domain.verifyingContract && !bytes_1.isHexString(domain.verifyingContract, 20)) { + ensCache[domain.verifyingContract] = "0x"; + } + encoder = TypedDataEncoder.from(types); + // Get a list of all the addresses + encoder.visit(value, function (type, value) { + if (type === "address" && !bytes_1.isHexString(value, 20)) { + ensCache[value] = "0x"; + } + return value; + }); + _a = []; + for (_b in ensCache) + _a.push(_b); + _i = 0; + _e.label = 1; + case 1: + if (!(_i < _a.length)) return [3 /*break*/, 4]; + name_4 = _a[_i]; + _c = ensCache; + _d = name_4; + return [4 /*yield*/, resolveName(name_4)]; + case 2: + _c[_d] = _e.sent(); + _e.label = 3; + case 3: + _i++; + return [3 /*break*/, 1]; + case 4: + // Replace the domain verifyingContract if needed + if (domain.verifyingContract && ensCache[domain.verifyingContract]) { + domain.verifyingContract = ensCache[domain.verifyingContract]; + } + // Replace all ENS names with their address + value = encoder.visit(value, function (type, value) { + if (type === "address" && ensCache[value]) { + return ensCache[value]; + } + return value; + }); + return [2 /*return*/, { domain: domain, value: value }]; + } + }); + }); + }; + TypedDataEncoder.getPayload = function (domain, types, value) { + // Validate the domain fields + TypedDataEncoder.hashDomain(domain); + // Derive the EIP712Domain Struct reference type + var domainValues = {}; + var domainTypes = []; + domainFieldNames.forEach(function (name) { + var value = domain[name]; + if (value == null) { + return; + } + domainValues[name] = domainChecks[name](value); + domainTypes.push({ name: name, type: domainFieldTypes[name] }); + }); + var encoder = TypedDataEncoder.from(types); + var typesWithDomain = properties_1.shallowCopy(types); + if (typesWithDomain.EIP712Domain) { + logger.throwArgumentError("types must not contain EIP712Domain type", "types.EIP712Domain", types); + } + else { + typesWithDomain.EIP712Domain = domainTypes; + } + // Validate the data structures and types + encoder.encode(value); + return { + types: typesWithDomain, + domain: domainValues, + primaryType: encoder.primaryType, + message: encoder.visit(value, function (type, value) { + // bytes + if (type.match(/^bytes(\d*)/)) { + return bytes_1.hexlify(bytes_1.arrayify(value)); + } + // uint or int + if (type.match(/^u?int/)) { + return bignumber_1.BigNumber.from(value).toString(); + } + switch (type) { + case "address": + return value.toLowerCase(); + case "bool": + return !!value; + case "string": + if (typeof (value) !== "string") { + logger.throwArgumentError("invalid string", "value", value); + } + return value; + } + return logger.throwArgumentError("unsupported type", "type", type); + }) + }; + }; + return TypedDataEncoder; +}()); +exports.TypedDataEncoder = TypedDataEncoder; + +},{"./_version":41,"./id":42,"@ethersproject/address":24,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/properties":63}],47:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "hdnode/5.4.0"; + +},{}],48:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAccountPath = exports.isValidMnemonic = exports.entropyToMnemonic = exports.mnemonicToEntropy = exports.mnemonicToSeed = exports.HDNode = exports.defaultPath = void 0; +var basex_1 = require("@ethersproject/basex"); +var bytes_1 = require("@ethersproject/bytes"); +var bignumber_1 = require("@ethersproject/bignumber"); +var strings_1 = require("@ethersproject/strings"); +var pbkdf2_1 = require("@ethersproject/pbkdf2"); +var properties_1 = require("@ethersproject/properties"); +var signing_key_1 = require("@ethersproject/signing-key"); +var sha2_1 = require("@ethersproject/sha2"); +var transactions_1 = require("@ethersproject/transactions"); +var wordlists_1 = require("@ethersproject/wordlists"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var N = bignumber_1.BigNumber.from("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"); +// "Bitcoin seed" +var MasterSecret = strings_1.toUtf8Bytes("Bitcoin seed"); +var HardenedBit = 0x80000000; +// Returns a byte with the MSB bits set +function getUpperMask(bits) { + return ((1 << bits) - 1) << (8 - bits); +} +// Returns a byte with the LSB bits set +function getLowerMask(bits) { + return (1 << bits) - 1; +} +function bytes32(value) { + return bytes_1.hexZeroPad(bytes_1.hexlify(value), 32); +} +function base58check(data) { + return basex_1.Base58.encode(bytes_1.concat([data, bytes_1.hexDataSlice(sha2_1.sha256(sha2_1.sha256(data)), 0, 4)])); +} +function getWordlist(wordlist) { + if (wordlist == null) { + return wordlists_1.wordlists["en"]; + } + if (typeof (wordlist) === "string") { + var words = wordlists_1.wordlists[wordlist]; + if (words == null) { + logger.throwArgumentError("unknown locale", "wordlist", wordlist); + } + return words; + } + return wordlist; +} +var _constructorGuard = {}; +exports.defaultPath = "m/44'/60'/0'/0/0"; +; +var HDNode = /** @class */ (function () { + /** + * This constructor should not be called directly. + * + * Please use: + * - fromMnemonic + * - fromSeed + */ + function HDNode(constructorGuard, privateKey, publicKey, parentFingerprint, chainCode, index, depth, mnemonicOrPath) { + var _newTarget = this.constructor; + logger.checkNew(_newTarget, HDNode); + /* istanbul ignore if */ + if (constructorGuard !== _constructorGuard) { + throw new Error("HDNode constructor cannot be called directly"); + } + if (privateKey) { + var signingKey = new signing_key_1.SigningKey(privateKey); + properties_1.defineReadOnly(this, "privateKey", signingKey.privateKey); + properties_1.defineReadOnly(this, "publicKey", signingKey.compressedPublicKey); + } + else { + properties_1.defineReadOnly(this, "privateKey", null); + properties_1.defineReadOnly(this, "publicKey", bytes_1.hexlify(publicKey)); + } + properties_1.defineReadOnly(this, "parentFingerprint", parentFingerprint); + properties_1.defineReadOnly(this, "fingerprint", bytes_1.hexDataSlice(sha2_1.ripemd160(sha2_1.sha256(this.publicKey)), 0, 4)); + properties_1.defineReadOnly(this, "address", transactions_1.computeAddress(this.publicKey)); + properties_1.defineReadOnly(this, "chainCode", chainCode); + properties_1.defineReadOnly(this, "index", index); + properties_1.defineReadOnly(this, "depth", depth); + if (mnemonicOrPath == null) { + // From a source that does not preserve the path (e.g. extended keys) + properties_1.defineReadOnly(this, "mnemonic", null); + properties_1.defineReadOnly(this, "path", null); + } + else if (typeof (mnemonicOrPath) === "string") { + // From a source that does not preserve the mnemonic (e.g. neutered) + properties_1.defineReadOnly(this, "mnemonic", null); + properties_1.defineReadOnly(this, "path", mnemonicOrPath); + } + else { + // From a fully qualified source + properties_1.defineReadOnly(this, "mnemonic", mnemonicOrPath); + properties_1.defineReadOnly(this, "path", mnemonicOrPath.path); + } + } + Object.defineProperty(HDNode.prototype, "extendedKey", { + get: function () { + // We only support the mainnet values for now, but if anyone needs + // testnet values, let me know. I believe current senitment is that + // we should always use mainnet, and use BIP-44 to derive the network + // - Mainnet: public=0x0488B21E, private=0x0488ADE4 + // - Testnet: public=0x043587CF, private=0x04358394 + if (this.depth >= 256) { + throw new Error("Depth too large!"); + } + return base58check(bytes_1.concat([ + ((this.privateKey != null) ? "0x0488ADE4" : "0x0488B21E"), + bytes_1.hexlify(this.depth), + this.parentFingerprint, + bytes_1.hexZeroPad(bytes_1.hexlify(this.index), 4), + this.chainCode, + ((this.privateKey != null) ? bytes_1.concat(["0x00", this.privateKey]) : this.publicKey), + ])); + }, + enumerable: false, + configurable: true + }); + HDNode.prototype.neuter = function () { + return new HDNode(_constructorGuard, null, this.publicKey, this.parentFingerprint, this.chainCode, this.index, this.depth, this.path); + }; + HDNode.prototype._derive = function (index) { + if (index > 0xffffffff) { + throw new Error("invalid index - " + String(index)); + } + // Base path + var path = this.path; + if (path) { + path += "/" + (index & ~HardenedBit); + } + var data = new Uint8Array(37); + if (index & HardenedBit) { + if (!this.privateKey) { + throw new Error("cannot derive child of neutered node"); + } + // Data = 0x00 || ser_256(k_par) + data.set(bytes_1.arrayify(this.privateKey), 1); + // Hardened path + if (path) { + path += "'"; + } + } + else { + // Data = ser_p(point(k_par)) + data.set(bytes_1.arrayify(this.publicKey)); + } + // Data += ser_32(i) + for (var i = 24; i >= 0; i -= 8) { + data[33 + (i >> 3)] = ((index >> (24 - i)) & 0xff); + } + var I = bytes_1.arrayify(sha2_1.computeHmac(sha2_1.SupportedAlgorithm.sha512, this.chainCode, data)); + var IL = I.slice(0, 32); + var IR = I.slice(32); + // The private key + var ki = null; + // The public key + var Ki = null; + if (this.privateKey) { + ki = bytes32(bignumber_1.BigNumber.from(IL).add(this.privateKey).mod(N)); + } + else { + var ek = new signing_key_1.SigningKey(bytes_1.hexlify(IL)); + Ki = ek._addPoint(this.publicKey); + } + var mnemonicOrPath = path; + var srcMnemonic = this.mnemonic; + if (srcMnemonic) { + mnemonicOrPath = Object.freeze({ + phrase: srcMnemonic.phrase, + path: path, + locale: (srcMnemonic.locale || "en") + }); + } + return new HDNode(_constructorGuard, ki, Ki, this.fingerprint, bytes32(IR), index, this.depth + 1, mnemonicOrPath); + }; + HDNode.prototype.derivePath = function (path) { + var components = path.split("/"); + if (components.length === 0 || (components[0] === "m" && this.depth !== 0)) { + throw new Error("invalid path - " + path); + } + if (components[0] === "m") { + components.shift(); + } + var result = this; + for (var i = 0; i < components.length; i++) { + var component = components[i]; + if (component.match(/^[0-9]+'$/)) { + var index = parseInt(component.substring(0, component.length - 1)); + if (index >= HardenedBit) { + throw new Error("invalid path index - " + component); + } + result = result._derive(HardenedBit + index); + } + else if (component.match(/^[0-9]+$/)) { + var index = parseInt(component); + if (index >= HardenedBit) { + throw new Error("invalid path index - " + component); + } + result = result._derive(index); + } + else { + throw new Error("invalid path component - " + component); + } + } + return result; + }; + HDNode._fromSeed = function (seed, mnemonic) { + var seedArray = bytes_1.arrayify(seed); + if (seedArray.length < 16 || seedArray.length > 64) { + throw new Error("invalid seed"); + } + var I = bytes_1.arrayify(sha2_1.computeHmac(sha2_1.SupportedAlgorithm.sha512, MasterSecret, seedArray)); + return new HDNode(_constructorGuard, bytes32(I.slice(0, 32)), null, "0x00000000", bytes32(I.slice(32)), 0, 0, mnemonic); + }; + HDNode.fromMnemonic = function (mnemonic, password, wordlist) { + // If a locale name was passed in, find the associated wordlist + wordlist = getWordlist(wordlist); + // Normalize the case and spacing in the mnemonic (throws if the mnemonic is invalid) + mnemonic = entropyToMnemonic(mnemonicToEntropy(mnemonic, wordlist), wordlist); + return HDNode._fromSeed(mnemonicToSeed(mnemonic, password), { + phrase: mnemonic, + path: "m", + locale: wordlist.locale + }); + }; + HDNode.fromSeed = function (seed) { + return HDNode._fromSeed(seed, null); + }; + HDNode.fromExtendedKey = function (extendedKey) { + var bytes = basex_1.Base58.decode(extendedKey); + if (bytes.length !== 82 || base58check(bytes.slice(0, 78)) !== extendedKey) { + logger.throwArgumentError("invalid extended key", "extendedKey", "[REDACTED]"); + } + var depth = bytes[4]; + var parentFingerprint = bytes_1.hexlify(bytes.slice(5, 9)); + var index = parseInt(bytes_1.hexlify(bytes.slice(9, 13)).substring(2), 16); + var chainCode = bytes_1.hexlify(bytes.slice(13, 45)); + var key = bytes.slice(45, 78); + switch (bytes_1.hexlify(bytes.slice(0, 4))) { + // Public Key + case "0x0488b21e": + case "0x043587cf": + return new HDNode(_constructorGuard, null, bytes_1.hexlify(key), parentFingerprint, chainCode, index, depth, null); + // Private Key + case "0x0488ade4": + case "0x04358394 ": + if (key[0] !== 0) { + break; + } + return new HDNode(_constructorGuard, bytes_1.hexlify(key.slice(1)), null, parentFingerprint, chainCode, index, depth, null); + } + return logger.throwArgumentError("invalid extended key", "extendedKey", "[REDACTED]"); + }; + return HDNode; +}()); +exports.HDNode = HDNode; +function mnemonicToSeed(mnemonic, password) { + if (!password) { + password = ""; + } + var salt = strings_1.toUtf8Bytes("mnemonic" + password, strings_1.UnicodeNormalizationForm.NFKD); + return pbkdf2_1.pbkdf2(strings_1.toUtf8Bytes(mnemonic, strings_1.UnicodeNormalizationForm.NFKD), salt, 2048, 64, "sha512"); +} +exports.mnemonicToSeed = mnemonicToSeed; +function mnemonicToEntropy(mnemonic, wordlist) { + wordlist = getWordlist(wordlist); + logger.checkNormalize(); + var words = wordlist.split(mnemonic); + if ((words.length % 3) !== 0) { + throw new Error("invalid mnemonic"); + } + var entropy = bytes_1.arrayify(new Uint8Array(Math.ceil(11 * words.length / 8))); + var offset = 0; + for (var i = 0; i < words.length; i++) { + var index = wordlist.getWordIndex(words[i].normalize("NFKD")); + if (index === -1) { + throw new Error("invalid mnemonic"); + } + for (var bit = 0; bit < 11; bit++) { + if (index & (1 << (10 - bit))) { + entropy[offset >> 3] |= (1 << (7 - (offset % 8))); + } + offset++; + } + } + var entropyBits = 32 * words.length / 3; + var checksumBits = words.length / 3; + var checksumMask = getUpperMask(checksumBits); + var checksum = bytes_1.arrayify(sha2_1.sha256(entropy.slice(0, entropyBits / 8)))[0] & checksumMask; + if (checksum !== (entropy[entropy.length - 1] & checksumMask)) { + throw new Error("invalid checksum"); + } + return bytes_1.hexlify(entropy.slice(0, entropyBits / 8)); +} +exports.mnemonicToEntropy = mnemonicToEntropy; +function entropyToMnemonic(entropy, wordlist) { + wordlist = getWordlist(wordlist); + entropy = bytes_1.arrayify(entropy); + if ((entropy.length % 4) !== 0 || entropy.length < 16 || entropy.length > 32) { + throw new Error("invalid entropy"); + } + var indices = [0]; + var remainingBits = 11; + for (var i = 0; i < entropy.length; i++) { + // Consume the whole byte (with still more to go) + if (remainingBits > 8) { + indices[indices.length - 1] <<= 8; + indices[indices.length - 1] |= entropy[i]; + remainingBits -= 8; + // This byte will complete an 11-bit index + } + else { + indices[indices.length - 1] <<= remainingBits; + indices[indices.length - 1] |= entropy[i] >> (8 - remainingBits); + // Start the next word + indices.push(entropy[i] & getLowerMask(8 - remainingBits)); + remainingBits += 3; + } + } + // Compute the checksum bits + var checksumBits = entropy.length / 4; + var checksum = bytes_1.arrayify(sha2_1.sha256(entropy))[0] & getUpperMask(checksumBits); + // Shift the checksum into the word indices + indices[indices.length - 1] <<= checksumBits; + indices[indices.length - 1] |= (checksum >> (8 - checksumBits)); + return wordlist.join(indices.map(function (index) { return wordlist.getWord(index); })); +} +exports.entropyToMnemonic = entropyToMnemonic; +function isValidMnemonic(mnemonic, wordlist) { + try { + mnemonicToEntropy(mnemonic, wordlist); + return true; + } + catch (error) { } + return false; +} +exports.isValidMnemonic = isValidMnemonic; +function getAccountPath(index) { + if (typeof (index) !== "number" || index < 0 || index >= HardenedBit || index % 1) { + logger.throwArgumentError("invalid account index", "index", index); + } + return "m/44'/60'/" + index + "'/0/0"; +} +exports.getAccountPath = getAccountPath; + +},{"./_version":47,"@ethersproject/basex":27,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/pbkdf2":61,"@ethersproject/properties":63,"@ethersproject/sha2":90,"@ethersproject/signing-key":94,"@ethersproject/strings":99,"@ethersproject/transactions":102,"@ethersproject/wordlists":111}],49:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "json-wallets/5.4.0"; + +},{}],50:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decrypt = exports.CrowdsaleAccount = void 0; +var aes_js_1 = __importDefault(require("aes-js")); +var address_1 = require("@ethersproject/address"); +var bytes_1 = require("@ethersproject/bytes"); +var keccak256_1 = require("@ethersproject/keccak256"); +var pbkdf2_1 = require("@ethersproject/pbkdf2"); +var strings_1 = require("@ethersproject/strings"); +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var utils_1 = require("./utils"); +var CrowdsaleAccount = /** @class */ (function (_super) { + __extends(CrowdsaleAccount, _super); + function CrowdsaleAccount() { + return _super !== null && _super.apply(this, arguments) || this; + } + CrowdsaleAccount.prototype.isCrowdsaleAccount = function (value) { + return !!(value && value._isCrowdsaleAccount); + }; + return CrowdsaleAccount; +}(properties_1.Description)); +exports.CrowdsaleAccount = CrowdsaleAccount; +// See: https://github.com/ethereum/pyethsaletool +function decrypt(json, password) { + var data = JSON.parse(json); + password = utils_1.getPassword(password); + // Ethereum Address + var ethaddr = address_1.getAddress(utils_1.searchPath(data, "ethaddr")); + // Encrypted Seed + var encseed = utils_1.looseArrayify(utils_1.searchPath(data, "encseed")); + if (!encseed || (encseed.length % 16) !== 0) { + logger.throwArgumentError("invalid encseed", "json", json); + } + var key = bytes_1.arrayify(pbkdf2_1.pbkdf2(password, password, 2000, 32, "sha256")).slice(0, 16); + var iv = encseed.slice(0, 16); + var encryptedSeed = encseed.slice(16); + // Decrypt the seed + var aesCbc = new aes_js_1.default.ModeOfOperation.cbc(key, iv); + var seed = aes_js_1.default.padding.pkcs7.strip(bytes_1.arrayify(aesCbc.decrypt(encryptedSeed))); + // This wallet format is weird... Convert the binary encoded hex to a string. + var seedHex = ""; + for (var i = 0; i < seed.length; i++) { + seedHex += String.fromCharCode(seed[i]); + } + var seedHexBytes = strings_1.toUtf8Bytes(seedHex); + var privateKey = keccak256_1.keccak256(seedHexBytes); + return new CrowdsaleAccount({ + _isCrowdsaleAccount: true, + address: ethaddr, + privateKey: privateKey + }); +} +exports.decrypt = decrypt; + +},{"./_version":49,"./utils":54,"@ethersproject/address":24,"@ethersproject/bytes":33,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/pbkdf2":61,"@ethersproject/properties":63,"@ethersproject/strings":99,"aes-js":165}],51:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decryptJsonWalletSync = exports.decryptJsonWallet = exports.getJsonWalletAddress = exports.isKeystoreWallet = exports.isCrowdsaleWallet = exports.encryptKeystore = exports.decryptKeystoreSync = exports.decryptKeystore = exports.decryptCrowdsale = void 0; +var crowdsale_1 = require("./crowdsale"); +Object.defineProperty(exports, "decryptCrowdsale", { enumerable: true, get: function () { return crowdsale_1.decrypt; } }); +var inspect_1 = require("./inspect"); +Object.defineProperty(exports, "getJsonWalletAddress", { enumerable: true, get: function () { return inspect_1.getJsonWalletAddress; } }); +Object.defineProperty(exports, "isCrowdsaleWallet", { enumerable: true, get: function () { return inspect_1.isCrowdsaleWallet; } }); +Object.defineProperty(exports, "isKeystoreWallet", { enumerable: true, get: function () { return inspect_1.isKeystoreWallet; } }); +var keystore_1 = require("./keystore"); +Object.defineProperty(exports, "decryptKeystore", { enumerable: true, get: function () { return keystore_1.decrypt; } }); +Object.defineProperty(exports, "decryptKeystoreSync", { enumerable: true, get: function () { return keystore_1.decryptSync; } }); +Object.defineProperty(exports, "encryptKeystore", { enumerable: true, get: function () { return keystore_1.encrypt; } }); +function decryptJsonWallet(json, password, progressCallback) { + if (inspect_1.isCrowdsaleWallet(json)) { + if (progressCallback) { + progressCallback(0); + } + var account = crowdsale_1.decrypt(json, password); + if (progressCallback) { + progressCallback(1); + } + return Promise.resolve(account); + } + if (inspect_1.isKeystoreWallet(json)) { + return keystore_1.decrypt(json, password, progressCallback); + } + return Promise.reject(new Error("invalid JSON wallet")); +} +exports.decryptJsonWallet = decryptJsonWallet; +function decryptJsonWalletSync(json, password) { + if (inspect_1.isCrowdsaleWallet(json)) { + return crowdsale_1.decrypt(json, password); + } + if (inspect_1.isKeystoreWallet(json)) { + return keystore_1.decryptSync(json, password); + } + throw new Error("invalid JSON wallet"); +} +exports.decryptJsonWalletSync = decryptJsonWalletSync; + +},{"./crowdsale":50,"./inspect":52,"./keystore":53}],52:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getJsonWalletAddress = exports.isKeystoreWallet = exports.isCrowdsaleWallet = void 0; +var address_1 = require("@ethersproject/address"); +function isCrowdsaleWallet(json) { + var data = null; + try { + data = JSON.parse(json); + } + catch (error) { + return false; + } + return (data.encseed && data.ethaddr); +} +exports.isCrowdsaleWallet = isCrowdsaleWallet; +function isKeystoreWallet(json) { + var data = null; + try { + data = JSON.parse(json); + } + catch (error) { + return false; + } + if (!data.version || parseInt(data.version) !== data.version || parseInt(data.version) !== 3) { + return false; + } + // @TODO: Put more checks to make sure it has kdf, iv and all that good stuff + return true; +} +exports.isKeystoreWallet = isKeystoreWallet; +//export function isJsonWallet(json: string): boolean { +// return (isSecretStorageWallet(json) || isCrowdsaleWallet(json)); +//} +function getJsonWalletAddress(json) { + if (isCrowdsaleWallet(json)) { + try { + return address_1.getAddress(JSON.parse(json).ethaddr); + } + catch (error) { + return null; + } + } + if (isKeystoreWallet(json)) { + try { + return address_1.getAddress(JSON.parse(json).address); + } + catch (error) { + return null; + } + } + return null; +} +exports.getJsonWalletAddress = getJsonWalletAddress; + +},{"@ethersproject/address":24}],53:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.encrypt = exports.decrypt = exports.decryptSync = exports.KeystoreAccount = void 0; +var aes_js_1 = __importDefault(require("aes-js")); +var scrypt_js_1 = __importDefault(require("scrypt-js")); +var address_1 = require("@ethersproject/address"); +var bytes_1 = require("@ethersproject/bytes"); +var hdnode_1 = require("@ethersproject/hdnode"); +var keccak256_1 = require("@ethersproject/keccak256"); +var pbkdf2_1 = require("@ethersproject/pbkdf2"); +var random_1 = require("@ethersproject/random"); +var properties_1 = require("@ethersproject/properties"); +var transactions_1 = require("@ethersproject/transactions"); +var utils_1 = require("./utils"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +// Exported Types +function hasMnemonic(value) { + return (value != null && value.mnemonic && value.mnemonic.phrase); +} +var KeystoreAccount = /** @class */ (function (_super) { + __extends(KeystoreAccount, _super); + function KeystoreAccount() { + return _super !== null && _super.apply(this, arguments) || this; + } + KeystoreAccount.prototype.isKeystoreAccount = function (value) { + return !!(value && value._isKeystoreAccount); + }; + return KeystoreAccount; +}(properties_1.Description)); +exports.KeystoreAccount = KeystoreAccount; +function _decrypt(data, key, ciphertext) { + var cipher = utils_1.searchPath(data, "crypto/cipher"); + if (cipher === "aes-128-ctr") { + var iv = utils_1.looseArrayify(utils_1.searchPath(data, "crypto/cipherparams/iv")); + var counter = new aes_js_1.default.Counter(iv); + var aesCtr = new aes_js_1.default.ModeOfOperation.ctr(key, counter); + return bytes_1.arrayify(aesCtr.decrypt(ciphertext)); + } + return null; +} +function _getAccount(data, key) { + var ciphertext = utils_1.looseArrayify(utils_1.searchPath(data, "crypto/ciphertext")); + var computedMAC = bytes_1.hexlify(keccak256_1.keccak256(bytes_1.concat([key.slice(16, 32), ciphertext]))).substring(2); + if (computedMAC !== utils_1.searchPath(data, "crypto/mac").toLowerCase()) { + throw new Error("invalid password"); + } + var privateKey = _decrypt(data, key.slice(0, 16), ciphertext); + if (!privateKey) { + logger.throwError("unsupported cipher", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "decrypt" + }); + } + var mnemonicKey = key.slice(32, 64); + var address = transactions_1.computeAddress(privateKey); + if (data.address) { + var check = data.address.toLowerCase(); + if (check.substring(0, 2) !== "0x") { + check = "0x" + check; + } + if (address_1.getAddress(check) !== address) { + throw new Error("address mismatch"); + } + } + var account = { + _isKeystoreAccount: true, + address: address, + privateKey: bytes_1.hexlify(privateKey) + }; + // Version 0.1 x-ethers metadata must contain an encrypted mnemonic phrase + if (utils_1.searchPath(data, "x-ethers/version") === "0.1") { + var mnemonicCiphertext = utils_1.looseArrayify(utils_1.searchPath(data, "x-ethers/mnemonicCiphertext")); + var mnemonicIv = utils_1.looseArrayify(utils_1.searchPath(data, "x-ethers/mnemonicCounter")); + var mnemonicCounter = new aes_js_1.default.Counter(mnemonicIv); + var mnemonicAesCtr = new aes_js_1.default.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter); + var path = utils_1.searchPath(data, "x-ethers/path") || hdnode_1.defaultPath; + var locale = utils_1.searchPath(data, "x-ethers/locale") || "en"; + var entropy = bytes_1.arrayify(mnemonicAesCtr.decrypt(mnemonicCiphertext)); + try { + var mnemonic = hdnode_1.entropyToMnemonic(entropy, locale); + var node = hdnode_1.HDNode.fromMnemonic(mnemonic, null, locale).derivePath(path); + if (node.privateKey != account.privateKey) { + throw new Error("mnemonic mismatch"); + } + account.mnemonic = node.mnemonic; + } + catch (error) { + // If we don't have the locale wordlist installed to + // read this mnemonic, just bail and don't set the + // mnemonic + if (error.code !== logger_1.Logger.errors.INVALID_ARGUMENT || error.argument !== "wordlist") { + throw error; + } + } + } + return new KeystoreAccount(account); +} +function pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc) { + return bytes_1.arrayify(pbkdf2_1.pbkdf2(passwordBytes, salt, count, dkLen, prfFunc)); +} +function pbkdf2(passwordBytes, salt, count, dkLen, prfFunc) { + return Promise.resolve(pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc)); +} +function _computeKdfKey(data, password, pbkdf2Func, scryptFunc, progressCallback) { + var passwordBytes = utils_1.getPassword(password); + var kdf = utils_1.searchPath(data, "crypto/kdf"); + if (kdf && typeof (kdf) === "string") { + var throwError = function (name, value) { + return logger.throwArgumentError("invalid key-derivation function parameters", name, value); + }; + if (kdf.toLowerCase() === "scrypt") { + var salt = utils_1.looseArrayify(utils_1.searchPath(data, "crypto/kdfparams/salt")); + var N = parseInt(utils_1.searchPath(data, "crypto/kdfparams/n")); + var r = parseInt(utils_1.searchPath(data, "crypto/kdfparams/r")); + var p = parseInt(utils_1.searchPath(data, "crypto/kdfparams/p")); + // Check for all required parameters + if (!N || !r || !p) { + throwError("kdf", kdf); + } + // Make sure N is a power of 2 + if ((N & (N - 1)) !== 0) { + throwError("N", N); + } + var dkLen = parseInt(utils_1.searchPath(data, "crypto/kdfparams/dklen")); + if (dkLen !== 32) { + throwError("dklen", dkLen); + } + return scryptFunc(passwordBytes, salt, N, r, p, 64, progressCallback); + } + else if (kdf.toLowerCase() === "pbkdf2") { + var salt = utils_1.looseArrayify(utils_1.searchPath(data, "crypto/kdfparams/salt")); + var prfFunc = null; + var prf = utils_1.searchPath(data, "crypto/kdfparams/prf"); + if (prf === "hmac-sha256") { + prfFunc = "sha256"; + } + else if (prf === "hmac-sha512") { + prfFunc = "sha512"; + } + else { + throwError("prf", prf); + } + var count = parseInt(utils_1.searchPath(data, "crypto/kdfparams/c")); + var dkLen = parseInt(utils_1.searchPath(data, "crypto/kdfparams/dklen")); + if (dkLen !== 32) { + throwError("dklen", dkLen); + } + return pbkdf2Func(passwordBytes, salt, count, dkLen, prfFunc); + } + } + return logger.throwArgumentError("unsupported key-derivation function", "kdf", kdf); +} +function decryptSync(json, password) { + var data = JSON.parse(json); + var key = _computeKdfKey(data, password, pbkdf2Sync, scrypt_js_1.default.syncScrypt); + return _getAccount(data, key); +} +exports.decryptSync = decryptSync; +function decrypt(json, password, progressCallback) { + return __awaiter(this, void 0, void 0, function () { + var data, key; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + data = JSON.parse(json); + return [4 /*yield*/, _computeKdfKey(data, password, pbkdf2, scrypt_js_1.default.scrypt, progressCallback)]; + case 1: + key = _a.sent(); + return [2 /*return*/, _getAccount(data, key)]; + } + }); + }); +} +exports.decrypt = decrypt; +function encrypt(account, password, options, progressCallback) { + try { + // Check the address matches the private key + if (address_1.getAddress(account.address) !== transactions_1.computeAddress(account.privateKey)) { + throw new Error("address/privateKey mismatch"); + } + // Check the mnemonic (if any) matches the private key + if (hasMnemonic(account)) { + var mnemonic = account.mnemonic; + var node = hdnode_1.HDNode.fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path || hdnode_1.defaultPath); + if (node.privateKey != account.privateKey) { + throw new Error("mnemonic mismatch"); + } + } + } + catch (e) { + return Promise.reject(e); + } + // The options are optional, so adjust the call as needed + if (typeof (options) === "function" && !progressCallback) { + progressCallback = options; + options = {}; + } + if (!options) { + options = {}; + } + var privateKey = bytes_1.arrayify(account.privateKey); + var passwordBytes = utils_1.getPassword(password); + var entropy = null; + var path = null; + var locale = null; + if (hasMnemonic(account)) { + var srcMnemonic = account.mnemonic; + entropy = bytes_1.arrayify(hdnode_1.mnemonicToEntropy(srcMnemonic.phrase, srcMnemonic.locale || "en")); + path = srcMnemonic.path || hdnode_1.defaultPath; + locale = srcMnemonic.locale || "en"; + } + var client = options.client; + if (!client) { + client = "ethers.js"; + } + // Check/generate the salt + var salt = null; + if (options.salt) { + salt = bytes_1.arrayify(options.salt); + } + else { + salt = random_1.randomBytes(32); + ; + } + // Override initialization vector + var iv = null; + if (options.iv) { + iv = bytes_1.arrayify(options.iv); + if (iv.length !== 16) { + throw new Error("invalid iv"); + } + } + else { + iv = random_1.randomBytes(16); + } + // Override the uuid + var uuidRandom = null; + if (options.uuid) { + uuidRandom = bytes_1.arrayify(options.uuid); + if (uuidRandom.length !== 16) { + throw new Error("invalid uuid"); + } + } + else { + uuidRandom = random_1.randomBytes(16); + } + // Override the scrypt password-based key derivation function parameters + var N = (1 << 17), r = 8, p = 1; + if (options.scrypt) { + if (options.scrypt.N) { + N = options.scrypt.N; + } + if (options.scrypt.r) { + r = options.scrypt.r; + } + if (options.scrypt.p) { + p = options.scrypt.p; + } + } + // We take 64 bytes: + // - 32 bytes As normal for the Web3 secret storage (derivedKey, macPrefix) + // - 32 bytes AES key to encrypt mnemonic with (required here to be Ethers Wallet) + return scrypt_js_1.default.scrypt(passwordBytes, salt, N, r, p, 64, progressCallback).then(function (key) { + key = bytes_1.arrayify(key); + // This will be used to encrypt the wallet (as per Web3 secret storage) + var derivedKey = key.slice(0, 16); + var macPrefix = key.slice(16, 32); + // This will be used to encrypt the mnemonic phrase (if any) + var mnemonicKey = key.slice(32, 64); + // Encrypt the private key + var counter = new aes_js_1.default.Counter(iv); + var aesCtr = new aes_js_1.default.ModeOfOperation.ctr(derivedKey, counter); + var ciphertext = bytes_1.arrayify(aesCtr.encrypt(privateKey)); + // Compute the message authentication code, used to check the password + var mac = keccak256_1.keccak256(bytes_1.concat([macPrefix, ciphertext])); + // See: https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition + var data = { + address: account.address.substring(2).toLowerCase(), + id: utils_1.uuidV4(uuidRandom), + version: 3, + Crypto: { + cipher: "aes-128-ctr", + cipherparams: { + iv: bytes_1.hexlify(iv).substring(2), + }, + ciphertext: bytes_1.hexlify(ciphertext).substring(2), + kdf: "scrypt", + kdfparams: { + salt: bytes_1.hexlify(salt).substring(2), + n: N, + dklen: 32, + p: p, + r: r + }, + mac: mac.substring(2) + } + }; + // If we have a mnemonic, encrypt it into the JSON wallet + if (entropy) { + var mnemonicIv = random_1.randomBytes(16); + var mnemonicCounter = new aes_js_1.default.Counter(mnemonicIv); + var mnemonicAesCtr = new aes_js_1.default.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter); + var mnemonicCiphertext = bytes_1.arrayify(mnemonicAesCtr.encrypt(entropy)); + var now = new Date(); + var timestamp = (now.getUTCFullYear() + "-" + + utils_1.zpad(now.getUTCMonth() + 1, 2) + "-" + + utils_1.zpad(now.getUTCDate(), 2) + "T" + + utils_1.zpad(now.getUTCHours(), 2) + "-" + + utils_1.zpad(now.getUTCMinutes(), 2) + "-" + + utils_1.zpad(now.getUTCSeconds(), 2) + ".0Z"); + data["x-ethers"] = { + client: client, + gethFilename: ("UTC--" + timestamp + "--" + data.address), + mnemonicCounter: bytes_1.hexlify(mnemonicIv).substring(2), + mnemonicCiphertext: bytes_1.hexlify(mnemonicCiphertext).substring(2), + path: path, + locale: locale, + version: "0.1" + }; + } + return JSON.stringify(data); + }); +} +exports.encrypt = encrypt; + +},{"./_version":49,"./utils":54,"@ethersproject/address":24,"@ethersproject/bytes":33,"@ethersproject/hdnode":48,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/pbkdf2":61,"@ethersproject/properties":63,"@ethersproject/random":84,"@ethersproject/transactions":102,"aes-js":165,"scrypt-js":214}],54:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uuidV4 = exports.searchPath = exports.getPassword = exports.zpad = exports.looseArrayify = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var strings_1 = require("@ethersproject/strings"); +function looseArrayify(hexString) { + if (typeof (hexString) === 'string' && hexString.substring(0, 2) !== '0x') { + hexString = '0x' + hexString; + } + return bytes_1.arrayify(hexString); +} +exports.looseArrayify = looseArrayify; +function zpad(value, length) { + value = String(value); + while (value.length < length) { + value = '0' + value; + } + return value; +} +exports.zpad = zpad; +function getPassword(password) { + if (typeof (password) === 'string') { + return strings_1.toUtf8Bytes(password, strings_1.UnicodeNormalizationForm.NFKC); + } + return bytes_1.arrayify(password); +} +exports.getPassword = getPassword; +function searchPath(object, path) { + var currentChild = object; + var comps = path.toLowerCase().split('/'); + for (var i = 0; i < comps.length; i++) { + // Search for a child object with a case-insensitive matching key + var matchingChild = null; + for (var key in currentChild) { + if (key.toLowerCase() === comps[i]) { + matchingChild = currentChild[key]; + break; + } + } + // Didn't find one. :'( + if (matchingChild === null) { + return null; + } + // Now check this child... + currentChild = matchingChild; + } + return currentChild; +} +exports.searchPath = searchPath; +// See: https://www.ietf.org/rfc/rfc4122.txt (Section 4.4) +function uuidV4(randomBytes) { + var bytes = bytes_1.arrayify(randomBytes); + // Section: 4.1.3: + // - time_hi_and_version[12:16] = 0b0100 + bytes[6] = (bytes[6] & 0x0f) | 0x40; + // Section 4.4 + // - clock_seq_hi_and_reserved[6] = 0b0 + // - clock_seq_hi_and_reserved[7] = 0b1 + bytes[8] = (bytes[8] & 0x3f) | 0x80; + var value = bytes_1.hexlify(bytes); + return [ + value.substring(2, 10), + value.substring(10, 14), + value.substring(14, 18), + value.substring(18, 22), + value.substring(22, 34), + ].join("-"); +} +exports.uuidV4 = uuidV4; + +},{"@ethersproject/bytes":33,"@ethersproject/strings":99}],55:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.keccak256 = void 0; +var js_sha3_1 = __importDefault(require("js-sha3")); +var bytes_1 = require("@ethersproject/bytes"); +function keccak256(data) { + return '0x' + js_sha3_1.default.keccak_256(bytes_1.arrayify(data)); +} +exports.keccak256 = keccak256; + +},{"@ethersproject/bytes":33,"js-sha3":210}],56:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "logger/5.4.0"; + +},{}],57:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Logger = exports.ErrorCode = exports.LogLevel = void 0; +var _permanentCensorErrors = false; +var _censorErrors = false; +var LogLevels = { debug: 1, "default": 2, info: 2, warning: 3, error: 4, off: 5 }; +var _logLevel = LogLevels["default"]; +var _version_1 = require("./_version"); +var _globalLogger = null; +function _checkNormalize() { + try { + var missing_1 = []; + // Make sure all forms of normalization are supported + ["NFD", "NFC", "NFKD", "NFKC"].forEach(function (form) { + try { + if ("test".normalize(form) !== "test") { + throw new Error("bad normalize"); + } + ; + } + catch (error) { + missing_1.push(form); + } + }); + if (missing_1.length) { + throw new Error("missing " + missing_1.join(", ")); + } + if (String.fromCharCode(0xe9).normalize("NFD") !== String.fromCharCode(0x65, 0x0301)) { + throw new Error("broken implementation"); + } + } + catch (error) { + return error.message; + } + return null; +} +var _normalizeError = _checkNormalize(); +var LogLevel; +(function (LogLevel) { + LogLevel["DEBUG"] = "DEBUG"; + LogLevel["INFO"] = "INFO"; + LogLevel["WARNING"] = "WARNING"; + LogLevel["ERROR"] = "ERROR"; + LogLevel["OFF"] = "OFF"; +})(LogLevel = exports.LogLevel || (exports.LogLevel = {})); +var ErrorCode; +(function (ErrorCode) { + /////////////////// + // Generic Errors + // Unknown Error + ErrorCode["UNKNOWN_ERROR"] = "UNKNOWN_ERROR"; + // Not Implemented + ErrorCode["NOT_IMPLEMENTED"] = "NOT_IMPLEMENTED"; + // Unsupported Operation + // - operation + ErrorCode["UNSUPPORTED_OPERATION"] = "UNSUPPORTED_OPERATION"; + // Network Error (i.e. Ethereum Network, such as an invalid chain ID) + // - event ("noNetwork" is not re-thrown in provider.ready; otherwise thrown) + ErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR"; + // Some sort of bad response from the server + ErrorCode["SERVER_ERROR"] = "SERVER_ERROR"; + // Timeout + ErrorCode["TIMEOUT"] = "TIMEOUT"; + /////////////////// + // Operational Errors + // Buffer Overrun + ErrorCode["BUFFER_OVERRUN"] = "BUFFER_OVERRUN"; + // Numeric Fault + // - operation: the operation being executed + // - fault: the reason this faulted + ErrorCode["NUMERIC_FAULT"] = "NUMERIC_FAULT"; + /////////////////// + // Argument Errors + // Missing new operator to an object + // - name: The name of the class + ErrorCode["MISSING_NEW"] = "MISSING_NEW"; + // Invalid argument (e.g. value is incompatible with type) to a function: + // - argument: The argument name that was invalid + // - value: The value of the argument + ErrorCode["INVALID_ARGUMENT"] = "INVALID_ARGUMENT"; + // Missing argument to a function: + // - count: The number of arguments received + // - expectedCount: The number of arguments expected + ErrorCode["MISSING_ARGUMENT"] = "MISSING_ARGUMENT"; + // Too many arguments + // - count: The number of arguments received + // - expectedCount: The number of arguments expected + ErrorCode["UNEXPECTED_ARGUMENT"] = "UNEXPECTED_ARGUMENT"; + /////////////////// + // Blockchain Errors + // Call exception + // - transaction: the transaction + // - address?: the contract address + // - args?: The arguments passed into the function + // - method?: The Solidity method signature + // - errorSignature?: The EIP848 error signature + // - errorArgs?: The EIP848 error parameters + // - reason: The reason (only for EIP848 "Error(string)") + ErrorCode["CALL_EXCEPTION"] = "CALL_EXCEPTION"; + // Insufficien funds (< value + gasLimit * gasPrice) + // - transaction: the transaction attempted + ErrorCode["INSUFFICIENT_FUNDS"] = "INSUFFICIENT_FUNDS"; + // Nonce has already been used + // - transaction: the transaction attempted + ErrorCode["NONCE_EXPIRED"] = "NONCE_EXPIRED"; + // The replacement fee for the transaction is too low + // - transaction: the transaction attempted + ErrorCode["REPLACEMENT_UNDERPRICED"] = "REPLACEMENT_UNDERPRICED"; + // The gas limit could not be estimated + // - transaction: the transaction passed to estimateGas + ErrorCode["UNPREDICTABLE_GAS_LIMIT"] = "UNPREDICTABLE_GAS_LIMIT"; + // The transaction was replaced by one with a higher gas price + // - reason: "cancelled", "replaced" or "repriced" + // - cancelled: true if reason == "cancelled" or reason == "replaced") + // - hash: original transaction hash + // - replacement: the full TransactionsResponse for the replacement + // - receipt: the receipt of the replacement + ErrorCode["TRANSACTION_REPLACED"] = "TRANSACTION_REPLACED"; +})(ErrorCode = exports.ErrorCode || (exports.ErrorCode = {})); +; +var Logger = /** @class */ (function () { + function Logger(version) { + Object.defineProperty(this, "version", { + enumerable: true, + value: version, + writable: false + }); + } + Logger.prototype._log = function (logLevel, args) { + var level = logLevel.toLowerCase(); + if (LogLevels[level] == null) { + this.throwArgumentError("invalid log level name", "logLevel", logLevel); + } + if (_logLevel > LogLevels[level]) { + return; + } + console.log.apply(console, args); + }; + Logger.prototype.debug = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + this._log(Logger.levels.DEBUG, args); + }; + Logger.prototype.info = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + this._log(Logger.levels.INFO, args); + }; + Logger.prototype.warn = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + this._log(Logger.levels.WARNING, args); + }; + Logger.prototype.makeError = function (message, code, params) { + // Errors are being censored + if (_censorErrors) { + return this.makeError("censored error", code, {}); + } + if (!code) { + code = Logger.errors.UNKNOWN_ERROR; + } + if (!params) { + params = {}; + } + var messageDetails = []; + Object.keys(params).forEach(function (key) { + try { + messageDetails.push(key + "=" + JSON.stringify(params[key])); + } + catch (error) { + messageDetails.push(key + "=" + JSON.stringify(params[key].toString())); + } + }); + messageDetails.push("code=" + code); + messageDetails.push("version=" + this.version); + var reason = message; + if (messageDetails.length) { + message += " (" + messageDetails.join(", ") + ")"; + } + // @TODO: Any?? + var error = new Error(message); + error.reason = reason; + error.code = code; + Object.keys(params).forEach(function (key) { + error[key] = params[key]; + }); + return error; + }; + Logger.prototype.throwError = function (message, code, params) { + throw this.makeError(message, code, params); + }; + Logger.prototype.throwArgumentError = function (message, name, value) { + return this.throwError(message, Logger.errors.INVALID_ARGUMENT, { + argument: name, + value: value + }); + }; + Logger.prototype.assert = function (condition, message, code, params) { + if (!!condition) { + return; + } + this.throwError(message, code, params); + }; + Logger.prototype.assertArgument = function (condition, message, name, value) { + if (!!condition) { + return; + } + this.throwArgumentError(message, name, value); + }; + Logger.prototype.checkNormalize = function (message) { + if (message == null) { + message = "platform missing String.prototype.normalize"; + } + if (_normalizeError) { + this.throwError("platform missing String.prototype.normalize", Logger.errors.UNSUPPORTED_OPERATION, { + operation: "String.prototype.normalize", form: _normalizeError + }); + } + }; + Logger.prototype.checkSafeUint53 = function (value, message) { + if (typeof (value) !== "number") { + return; + } + if (message == null) { + message = "value not safe"; + } + if (value < 0 || value >= 0x1fffffffffffff) { + this.throwError(message, Logger.errors.NUMERIC_FAULT, { + operation: "checkSafeInteger", + fault: "out-of-safe-range", + value: value + }); + } + if (value % 1) { + this.throwError(message, Logger.errors.NUMERIC_FAULT, { + operation: "checkSafeInteger", + fault: "non-integer", + value: value + }); + } + }; + Logger.prototype.checkArgumentCount = function (count, expectedCount, message) { + if (message) { + message = ": " + message; + } + else { + message = ""; + } + if (count < expectedCount) { + this.throwError("missing argument" + message, Logger.errors.MISSING_ARGUMENT, { + count: count, + expectedCount: expectedCount + }); + } + if (count > expectedCount) { + this.throwError("too many arguments" + message, Logger.errors.UNEXPECTED_ARGUMENT, { + count: count, + expectedCount: expectedCount + }); + } + }; + Logger.prototype.checkNew = function (target, kind) { + if (target === Object || target == null) { + this.throwError("missing new", Logger.errors.MISSING_NEW, { name: kind.name }); + } + }; + Logger.prototype.checkAbstract = function (target, kind) { + if (target === kind) { + this.throwError("cannot instantiate abstract class " + JSON.stringify(kind.name) + " directly; use a sub-class", Logger.errors.UNSUPPORTED_OPERATION, { name: target.name, operation: "new" }); + } + else if (target === Object || target == null) { + this.throwError("missing new", Logger.errors.MISSING_NEW, { name: kind.name }); + } + }; + Logger.globalLogger = function () { + if (!_globalLogger) { + _globalLogger = new Logger(_version_1.version); + } + return _globalLogger; + }; + Logger.setCensorship = function (censorship, permanent) { + if (!censorship && permanent) { + this.globalLogger().throwError("cannot permanently disable censorship", Logger.errors.UNSUPPORTED_OPERATION, { + operation: "setCensorship" + }); + } + if (_permanentCensorErrors) { + if (!censorship) { + return; + } + this.globalLogger().throwError("error censorship permanent", Logger.errors.UNSUPPORTED_OPERATION, { + operation: "setCensorship" + }); + } + _censorErrors = !!censorship; + _permanentCensorErrors = !!permanent; + }; + Logger.setLogLevel = function (logLevel) { + var level = LogLevels[logLevel.toLowerCase()]; + if (level == null) { + Logger.globalLogger().warn("invalid log level - " + logLevel); + return; + } + _logLevel = level; + }; + Logger.from = function (version) { + return new Logger(version); + }; + Logger.errors = ErrorCode; + Logger.levels = LogLevel; + return Logger; +}()); +exports.Logger = Logger; + +},{"./_version":56}],58:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "networks/5.4.2"; + +},{}],59:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getNetwork = void 0; +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +; +function isRenetworkable(value) { + return (value && typeof (value.renetwork) === "function"); +} +function ethDefaultProvider(network) { + var func = function (providers, options) { + if (options == null) { + options = {}; + } + var providerList = []; + if (providers.InfuraProvider) { + try { + providerList.push(new providers.InfuraProvider(network, options.infura)); + } + catch (error) { } + } + if (providers.EtherscanProvider) { + try { + providerList.push(new providers.EtherscanProvider(network, options.etherscan)); + } + catch (error) { } + } + if (providers.AlchemyProvider) { + try { + providerList.push(new providers.AlchemyProvider(network, options.alchemy)); + } + catch (error) { } + } + if (providers.PocketProvider) { + // These networks are currently faulty on Pocket as their + // network does not handle the Berlin hardfork, which is + // live on these ones. + // @TODO: This goes away once Pocket has upgraded their nodes + var skip = ["goerli", "ropsten", "rinkeby"]; + try { + var provider = new providers.PocketProvider(network); + if (provider.network && skip.indexOf(provider.network.name) === -1) { + providerList.push(provider); + } + } + catch (error) { } + } + if (providers.CloudflareProvider) { + try { + providerList.push(new providers.CloudflareProvider(network)); + } + catch (error) { } + } + if (providerList.length === 0) { + return null; + } + if (providers.FallbackProvider) { + var quorum = 1; + if (options.quorum != null) { + quorum = options.quorum; + } + else if (network === "homestead") { + quorum = 2; + } + return new providers.FallbackProvider(providerList, quorum); + } + return providerList[0]; + }; + func.renetwork = function (network) { + return ethDefaultProvider(network); + }; + return func; +} +function etcDefaultProvider(url, network) { + var func = function (providers, options) { + if (providers.JsonRpcProvider) { + return new providers.JsonRpcProvider(url, network); + } + return null; + }; + func.renetwork = function (network) { + return etcDefaultProvider(url, network); + }; + return func; +} +var homestead = { + chainId: 1, + ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + name: "homestead", + _defaultProvider: ethDefaultProvider("homestead") +}; +var ropsten = { + chainId: 3, + ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + name: "ropsten", + _defaultProvider: ethDefaultProvider("ropsten") +}; +var classicMordor = { + chainId: 63, + name: "classicMordor", + _defaultProvider: etcDefaultProvider("https://www.ethercluster.com/mordor", "classicMordor") +}; +var networks = { + unspecified: { chainId: 0, name: "unspecified" }, + homestead: homestead, + mainnet: homestead, + morden: { chainId: 2, name: "morden" }, + ropsten: ropsten, + testnet: ropsten, + rinkeby: { + chainId: 4, + ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + name: "rinkeby", + _defaultProvider: ethDefaultProvider("rinkeby") + }, + kovan: { + chainId: 42, + name: "kovan", + _defaultProvider: ethDefaultProvider("kovan") + }, + goerli: { + chainId: 5, + ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + name: "goerli", + _defaultProvider: ethDefaultProvider("goerli") + }, + // ETC (See: #351) + classic: { + chainId: 61, + name: "classic", + _defaultProvider: etcDefaultProvider("https:/\/www.ethercluster.com/etc", "classic") + }, + classicMorden: { chainId: 62, name: "classicMorden" }, + classicMordor: classicMordor, + classicTestnet: classicMordor, + classicKotti: { + chainId: 6, + name: "classicKotti", + _defaultProvider: etcDefaultProvider("https:/\/www.ethercluster.com/kotti", "classicKotti") + }, + xdai: { chainId: 100, name: "xdai" }, + matic: { chainId: 137, name: "matic" }, + maticmum: { chainId: 80001, name: "maticmum" }, + bnb: { chainId: 56, name: "bnb" }, + bnbt: { chainId: 97, name: "bnbt" }, +}; +/** + * getNetwork + * + * Converts a named common networks or chain ID (network ID) to a Network + * and verifies a network is a valid Network.. + */ +function getNetwork(network) { + // No network (null) + if (network == null) { + return null; + } + if (typeof (network) === "number") { + for (var name_1 in networks) { + var standard_1 = networks[name_1]; + if (standard_1.chainId === network) { + return { + name: standard_1.name, + chainId: standard_1.chainId, + ensAddress: (standard_1.ensAddress || null), + _defaultProvider: (standard_1._defaultProvider || null) + }; + } + } + return { + chainId: network, + name: "unknown" + }; + } + if (typeof (network) === "string") { + var standard_2 = networks[network]; + if (standard_2 == null) { + return null; + } + return { + name: standard_2.name, + chainId: standard_2.chainId, + ensAddress: standard_2.ensAddress, + _defaultProvider: (standard_2._defaultProvider || null) + }; + } + var standard = networks[network.name]; + // Not a standard network; check that it is a valid network in general + if (!standard) { + if (typeof (network.chainId) !== "number") { + logger.throwArgumentError("invalid network chainId", "network", network); + } + return network; + } + // Make sure the chainId matches the expected network chainId (or is 0; disable EIP-155) + if (network.chainId !== 0 && network.chainId !== standard.chainId) { + logger.throwArgumentError("network chainId mismatch", "network", network); + } + // @TODO: In the next major version add an attach function to a defaultProvider + // class and move the _defaultProvider internal to this file (extend Network) + var defaultProvider = network._defaultProvider || null; + if (defaultProvider == null && standard._defaultProvider) { + if (isRenetworkable(standard._defaultProvider)) { + defaultProvider = standard._defaultProvider.renetwork(network); + } + else { + defaultProvider = standard._defaultProvider; + } + } + // Standard Network (allow overriding the ENS address) + return { + name: network.name, + chainId: standard.chainId, + ensAddress: (network.ensAddress || standard.ensAddress || null), + _defaultProvider: defaultProvider + }; +} +exports.getNetwork = getNetwork; + +},{"./_version":58,"@ethersproject/logger":57}],60:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pbkdf2 = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var sha2_1 = require("@ethersproject/sha2"); +function pbkdf2(password, salt, iterations, keylen, hashAlgorithm) { + password = bytes_1.arrayify(password); + salt = bytes_1.arrayify(salt); + var hLen; + var l = 1; + var DK = new Uint8Array(keylen); + var block1 = new Uint8Array(salt.length + 4); + block1.set(salt); + //salt.copy(block1, 0, 0, salt.length) + var r; + var T; + for (var i = 1; i <= l; i++) { + //block1.writeUInt32BE(i, salt.length) + block1[salt.length] = (i >> 24) & 0xff; + block1[salt.length + 1] = (i >> 16) & 0xff; + block1[salt.length + 2] = (i >> 8) & 0xff; + block1[salt.length + 3] = i & 0xff; + //let U = createHmac(password).update(block1).digest(); + var U = bytes_1.arrayify(sha2_1.computeHmac(hashAlgorithm, password, block1)); + if (!hLen) { + hLen = U.length; + T = new Uint8Array(hLen); + l = Math.ceil(keylen / hLen); + r = keylen - (l - 1) * hLen; + } + //U.copy(T, 0, 0, hLen) + T.set(U); + for (var j = 1; j < iterations; j++) { + //U = createHmac(password).update(U).digest(); + U = bytes_1.arrayify(sha2_1.computeHmac(hashAlgorithm, password, U)); + for (var k = 0; k < hLen; k++) + T[k] ^= U[k]; + } + var destPos = (i - 1) * hLen; + var len = (i === l ? r : hLen); + //T.copy(DK, destPos, 0, len) + DK.set(bytes_1.arrayify(T).slice(0, len), destPos); + } + return bytes_1.hexlify(DK); +} +exports.pbkdf2 = pbkdf2; + +},{"@ethersproject/bytes":33,"@ethersproject/sha2":90}],61:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pbkdf2 = void 0; +var pbkdf2_1 = require("./pbkdf2"); +Object.defineProperty(exports, "pbkdf2", { enumerable: true, get: function () { return pbkdf2_1.pbkdf2; } }); + +},{"./pbkdf2":60}],62:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "properties/5.4.0"; + +},{}],63:[function(require,module,exports){ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Description = exports.deepCopy = exports.shallowCopy = exports.checkProperties = exports.resolveProperties = exports.getStatic = exports.defineReadOnly = void 0; +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +function defineReadOnly(object, name, value) { + Object.defineProperty(object, name, { + enumerable: true, + value: value, + writable: false, + }); +} +exports.defineReadOnly = defineReadOnly; +// Crawl up the constructor chain to find a static method +function getStatic(ctor, key) { + for (var i = 0; i < 32; i++) { + if (ctor[key]) { + return ctor[key]; + } + if (!ctor.prototype || typeof (ctor.prototype) !== "object") { + break; + } + ctor = Object.getPrototypeOf(ctor.prototype).constructor; + } + return null; +} +exports.getStatic = getStatic; +function resolveProperties(object) { + return __awaiter(this, void 0, void 0, function () { + var promises, results; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + promises = Object.keys(object).map(function (key) { + var value = object[key]; + return Promise.resolve(value).then(function (v) { return ({ key: key, value: v }); }); + }); + return [4 /*yield*/, Promise.all(promises)]; + case 1: + results = _a.sent(); + return [2 /*return*/, results.reduce(function (accum, result) { + accum[(result.key)] = result.value; + return accum; + }, {})]; + } + }); + }); +} +exports.resolveProperties = resolveProperties; +function checkProperties(object, properties) { + if (!object || typeof (object) !== "object") { + logger.throwArgumentError("invalid object", "object", object); + } + Object.keys(object).forEach(function (key) { + if (!properties[key]) { + logger.throwArgumentError("invalid object key - " + key, "transaction:" + key, object); + } + }); +} +exports.checkProperties = checkProperties; +function shallowCopy(object) { + var result = {}; + for (var key in object) { + result[key] = object[key]; + } + return result; +} +exports.shallowCopy = shallowCopy; +var opaque = { bigint: true, boolean: true, "function": true, number: true, string: true }; +function _isFrozen(object) { + // Opaque objects are not mutable, so safe to copy by assignment + if (object === undefined || object === null || opaque[typeof (object)]) { + return true; + } + if (Array.isArray(object) || typeof (object) === "object") { + if (!Object.isFrozen(object)) { + return false; + } + var keys = Object.keys(object); + for (var i = 0; i < keys.length; i++) { + if (!_isFrozen(object[keys[i]])) { + return false; + } + } + return true; + } + return logger.throwArgumentError("Cannot deepCopy " + typeof (object), "object", object); +} +// Returns a new copy of object, such that no properties may be replaced. +// New properties may be added only to objects. +function _deepCopy(object) { + if (_isFrozen(object)) { + return object; + } + // Arrays are mutable, so we need to create a copy + if (Array.isArray(object)) { + return Object.freeze(object.map(function (item) { return deepCopy(item); })); + } + if (typeof (object) === "object") { + var result = {}; + for (var key in object) { + var value = object[key]; + if (value === undefined) { + continue; + } + defineReadOnly(result, key, deepCopy(value)); + } + return result; + } + return logger.throwArgumentError("Cannot deepCopy " + typeof (object), "object", object); +} +function deepCopy(object) { + return _deepCopy(object); +} +exports.deepCopy = deepCopy; +var Description = /** @class */ (function () { + function Description(info) { + for (var key in info) { + this[key] = deepCopy(info[key]); + } + } + return Description; +}()); +exports.Description = Description; + +},{"./_version":62,"@ethersproject/logger":57}],64:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "providers/5.4.3"; + +},{}],65:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AlchemyProvider = exports.AlchemyWebSocketProvider = void 0; +var properties_1 = require("@ethersproject/properties"); +var formatter_1 = require("./formatter"); +var websocket_provider_1 = require("./websocket-provider"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var url_json_rpc_provider_1 = require("./url-json-rpc-provider"); +// This key was provided to ethers.js by Alchemy to be used by the +// default provider, but it is recommended that for your own +// production environments, that you acquire your own API key at: +// https://dashboard.alchemyapi.io +var defaultApiKey = "_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; +var AlchemyWebSocketProvider = /** @class */ (function (_super) { + __extends(AlchemyWebSocketProvider, _super); + function AlchemyWebSocketProvider(network, apiKey) { + var _this = this; + var provider = new AlchemyProvider(network, apiKey); + var url = provider.connection.url.replace(/^http/i, "ws") + .replace(".alchemyapi.", ".ws.alchemyapi."); + _this = _super.call(this, url, provider.network) || this; + properties_1.defineReadOnly(_this, "apiKey", provider.apiKey); + return _this; + } + AlchemyWebSocketProvider.prototype.isCommunityResource = function () { + return (this.apiKey === defaultApiKey); + }; + return AlchemyWebSocketProvider; +}(websocket_provider_1.WebSocketProvider)); +exports.AlchemyWebSocketProvider = AlchemyWebSocketProvider; +var AlchemyProvider = /** @class */ (function (_super) { + __extends(AlchemyProvider, _super); + function AlchemyProvider() { + return _super !== null && _super.apply(this, arguments) || this; + } + AlchemyProvider.getWebSocketProvider = function (network, apiKey) { + return new AlchemyWebSocketProvider(network, apiKey); + }; + AlchemyProvider.getApiKey = function (apiKey) { + if (apiKey == null) { + return defaultApiKey; + } + if (apiKey && typeof (apiKey) !== "string") { + logger.throwArgumentError("invalid apiKey", "apiKey", apiKey); + } + return apiKey; + }; + AlchemyProvider.getUrl = function (network, apiKey) { + var host = null; + switch (network.name) { + case "homestead": + host = "eth-mainnet.alchemyapi.io/v2/"; + break; + case "ropsten": + host = "eth-ropsten.alchemyapi.io/v2/"; + break; + case "rinkeby": + host = "eth-rinkeby.alchemyapi.io/v2/"; + break; + case "goerli": + host = "eth-goerli.alchemyapi.io/v2/"; + break; + case "kovan": + host = "eth-kovan.alchemyapi.io/v2/"; + break; + case "matic": + host = "polygon-mainnet.g.alchemy.com/v2/"; + break; + case "maticmum": + host = "polygon-mumbai.g.alchemy.com/v2/"; + break; + default: + logger.throwArgumentError("unsupported network", "network", arguments[0]); + } + return { + allowGzip: true, + url: ("https:/" + "/" + host + apiKey), + throttleCallback: function (attempt, url) { + if (apiKey === defaultApiKey) { + formatter_1.showThrottleMessage(); + } + return Promise.resolve(true); + } + }; + }; + AlchemyProvider.prototype.perform = function (method, params) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + if ((method === "estimateGas" && params.transaction.type === 2) || (method === "sendTransaction" && params.signedTransaction.substring(0, 4) === "0x02")) { + logger.throwError("AlchemyProvider does not currently support EIP-1559", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: method, + transaction: params.transaction + }); + } + return [2 /*return*/, _super.prototype.perform.call(this, method, params)]; + }); + }); + }; + AlchemyProvider.prototype.isCommunityResource = function () { + return (this.apiKey === defaultApiKey); + }; + return AlchemyProvider; +}(url_json_rpc_provider_1.UrlJsonRpcProvider)); +exports.AlchemyProvider = AlchemyProvider; + +},{"./_version":64,"./formatter":72,"./url-json-rpc-provider":79,"./websocket-provider":81,"@ethersproject/logger":57,"@ethersproject/properties":63}],66:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseProvider = exports.Resolver = exports.Event = void 0; +var abstract_provider_1 = require("@ethersproject/abstract-provider"); +var basex_1 = require("@ethersproject/basex"); +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var constants_1 = require("@ethersproject/constants"); +var hash_1 = require("@ethersproject/hash"); +var networks_1 = require("@ethersproject/networks"); +var properties_1 = require("@ethersproject/properties"); +var sha2_1 = require("@ethersproject/sha2"); +var strings_1 = require("@ethersproject/strings"); +var web_1 = require("@ethersproject/web"); +var bech32_1 = __importDefault(require("bech32")); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var formatter_1 = require("./formatter"); +////////////////////////////// +// Event Serializeing +function checkTopic(topic) { + if (topic == null) { + return "null"; + } + if (bytes_1.hexDataLength(topic) !== 32) { + logger.throwArgumentError("invalid topic", "topic", topic); + } + return topic.toLowerCase(); +} +function serializeTopics(topics) { + // Remove trailing null AND-topics; they are redundant + topics = topics.slice(); + while (topics.length > 0 && topics[topics.length - 1] == null) { + topics.pop(); + } + return topics.map(function (topic) { + if (Array.isArray(topic)) { + // Only track unique OR-topics + var unique_1 = {}; + topic.forEach(function (topic) { + unique_1[checkTopic(topic)] = true; + }); + // The order of OR-topics does not matter + var sorted = Object.keys(unique_1); + sorted.sort(); + return sorted.join("|"); + } + else { + return checkTopic(topic); + } + }).join("&"); +} +function deserializeTopics(data) { + if (data === "") { + return []; + } + return data.split(/&/g).map(function (topic) { + if (topic === "") { + return []; + } + var comps = topic.split("|").map(function (topic) { + return ((topic === "null") ? null : topic); + }); + return ((comps.length === 1) ? comps[0] : comps); + }); +} +function getEventTag(eventName) { + if (typeof (eventName) === "string") { + eventName = eventName.toLowerCase(); + if (bytes_1.hexDataLength(eventName) === 32) { + return "tx:" + eventName; + } + if (eventName.indexOf(":") === -1) { + return eventName; + } + } + else if (Array.isArray(eventName)) { + return "filter:*:" + serializeTopics(eventName); + } + else if (abstract_provider_1.ForkEvent.isForkEvent(eventName)) { + logger.warn("not implemented"); + throw new Error("not implemented"); + } + else if (eventName && typeof (eventName) === "object") { + return "filter:" + (eventName.address || "*") + ":" + serializeTopics(eventName.topics || []); + } + throw new Error("invalid event - " + eventName); +} +////////////////////////////// +// Helper Object +function getTime() { + return (new Date()).getTime(); +} +function stall(duration) { + return new Promise(function (resolve) { + setTimeout(resolve, duration); + }); +} +////////////////////////////// +// Provider Object +/** + * EventType + * - "block" + * - "poll" + * - "didPoll" + * - "pending" + * - "error" + * - "network" + * - filter + * - topics array + * - transaction hash + */ +var PollableEvents = ["block", "network", "pending", "poll"]; +var Event = /** @class */ (function () { + function Event(tag, listener, once) { + properties_1.defineReadOnly(this, "tag", tag); + properties_1.defineReadOnly(this, "listener", listener); + properties_1.defineReadOnly(this, "once", once); + } + Object.defineProperty(Event.prototype, "event", { + get: function () { + switch (this.type) { + case "tx": + return this.hash; + case "filter": + return this.filter; + } + return this.tag; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Event.prototype, "type", { + get: function () { + return this.tag.split(":")[0]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Event.prototype, "hash", { + get: function () { + var comps = this.tag.split(":"); + if (comps[0] !== "tx") { + return null; + } + return comps[1]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Event.prototype, "filter", { + get: function () { + var comps = this.tag.split(":"); + if (comps[0] !== "filter") { + return null; + } + var address = comps[1]; + var topics = deserializeTopics(comps[2]); + var filter = {}; + if (topics.length > 0) { + filter.topics = topics; + } + if (address && address !== "*") { + filter.address = address; + } + return filter; + }, + enumerable: false, + configurable: true + }); + Event.prototype.pollable = function () { + return (this.tag.indexOf(":") >= 0 || PollableEvents.indexOf(this.tag) >= 0); + }; + return Event; +}()); +exports.Event = Event; +; +// https://github.com/satoshilabs/slips/blob/master/slip-0044.md +var coinInfos = { + "0": { symbol: "btc", p2pkh: 0x00, p2sh: 0x05, prefix: "bc" }, + "2": { symbol: "ltc", p2pkh: 0x30, p2sh: 0x32, prefix: "ltc" }, + "3": { symbol: "doge", p2pkh: 0x1e, p2sh: 0x16 }, + "60": { symbol: "eth", ilk: "eth" }, + "61": { symbol: "etc", ilk: "eth" }, + "700": { symbol: "xdai", ilk: "eth" }, +}; +function bytes32ify(value) { + return bytes_1.hexZeroPad(bignumber_1.BigNumber.from(value).toHexString(), 32); +} +// Compute the Base58Check encoded data (checksum is first 4 bytes of sha256d) +function base58Encode(data) { + return basex_1.Base58.encode(bytes_1.concat([data, bytes_1.hexDataSlice(sha2_1.sha256(sha2_1.sha256(data)), 0, 4)])); +} +var Resolver = /** @class */ (function () { + function Resolver(provider, address, name) { + properties_1.defineReadOnly(this, "provider", provider); + properties_1.defineReadOnly(this, "name", name); + properties_1.defineReadOnly(this, "address", provider.formatter.address(address)); + } + Resolver.prototype._fetchBytes = function (selector, parameters) { + return __awaiter(this, void 0, void 0, function () { + var transaction, result, offset, length_1, error_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + transaction = { + to: this.address, + data: bytes_1.hexConcat([selector, hash_1.namehash(this.name), (parameters || "0x")]) + }; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.provider.call(transaction)]; + case 2: + result = _a.sent(); + if (result === "0x") { + return [2 /*return*/, null]; + } + offset = bignumber_1.BigNumber.from(bytes_1.hexDataSlice(result, 0, 32)).toNumber(); + length_1 = bignumber_1.BigNumber.from(bytes_1.hexDataSlice(result, offset, offset + 32)).toNumber(); + return [2 /*return*/, bytes_1.hexDataSlice(result, offset + 32, offset + 32 + length_1)]; + case 3: + error_1 = _a.sent(); + if (error_1.code === logger_1.Logger.errors.CALL_EXCEPTION) { + return [2 /*return*/, null]; + } + return [2 /*return*/, null]; + case 4: return [2 /*return*/]; + } + }); + }); + }; + Resolver.prototype._getAddress = function (coinType, hexBytes) { + var coinInfo = coinInfos[String(coinType)]; + if (coinInfo == null) { + logger.throwError("unsupported coin type: " + coinType, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "getAddress(" + coinType + ")" + }); + } + if (coinInfo.ilk === "eth") { + return this.provider.formatter.address(hexBytes); + } + var bytes = bytes_1.arrayify(hexBytes); + // P2PKH: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG + if (coinInfo.p2pkh != null) { + var p2pkh = hexBytes.match(/^0x76a9([0-9a-f][0-9a-f])([0-9a-f]*)88ac$/); + if (p2pkh) { + var length_2 = parseInt(p2pkh[1], 16); + if (p2pkh[2].length === length_2 * 2 && length_2 >= 1 && length_2 <= 75) { + return base58Encode(bytes_1.concat([[coinInfo.p2pkh], ("0x" + p2pkh[2])])); + } + } + } + // P2SH: OP_HASH160 OP_EQUAL + if (coinInfo.p2sh != null) { + var p2sh = hexBytes.match(/^0xa9([0-9a-f][0-9a-f])([0-9a-f]*)87$/); + if (p2sh) { + var length_3 = parseInt(p2sh[1], 16); + if (p2sh[2].length === length_3 * 2 && length_3 >= 1 && length_3 <= 75) { + return base58Encode(bytes_1.concat([[coinInfo.p2sh], ("0x" + p2sh[2])])); + } + } + } + // Bech32 + if (coinInfo.prefix != null) { + var length_4 = bytes[1]; + // https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#witness-program + var version_1 = bytes[0]; + if (version_1 === 0x00) { + if (length_4 !== 20 && length_4 !== 32) { + version_1 = -1; + } + } + else { + version_1 = -1; + } + if (version_1 >= 0 && bytes.length === 2 + length_4 && length_4 >= 1 && length_4 <= 75) { + var words = bech32_1.default.toWords(bytes.slice(2)); + words.unshift(version_1); + return bech32_1.default.encode(coinInfo.prefix, words); + } + } + return null; + }; + Resolver.prototype.getAddress = function (coinType) { + return __awaiter(this, void 0, void 0, function () { + var transaction, hexBytes_1, error_2, hexBytes, address; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (coinType == null) { + coinType = 60; + } + if (!(coinType === 60)) return [3 /*break*/, 4]; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + transaction = { + to: this.address, + data: ("0x3b3b57de" + hash_1.namehash(this.name).substring(2)) + }; + return [4 /*yield*/, this.provider.call(transaction)]; + case 2: + hexBytes_1 = _a.sent(); + // No address + if (hexBytes_1 === "0x" || hexBytes_1 === constants_1.HashZero) { + return [2 /*return*/, null]; + } + return [2 /*return*/, this.provider.formatter.callAddress(hexBytes_1)]; + case 3: + error_2 = _a.sent(); + if (error_2.code === logger_1.Logger.errors.CALL_EXCEPTION) { + return [2 /*return*/, null]; + } + throw error_2; + case 4: return [4 /*yield*/, this._fetchBytes("0xf1cb7e06", bytes32ify(coinType))]; + case 5: + hexBytes = _a.sent(); + // No address + if (hexBytes == null || hexBytes === "0x") { + return [2 /*return*/, null]; + } + address = this._getAddress(coinType, hexBytes); + if (address == null) { + logger.throwError("invalid or unsupported coin data", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "getAddress(" + coinType + ")", + coinType: coinType, + data: hexBytes + }); + } + return [2 /*return*/, address]; + } + }); + }); + }; + Resolver.prototype.getContentHash = function () { + return __awaiter(this, void 0, void 0, function () { + var hexBytes, ipfs, length_5, swarm; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this._fetchBytes("0xbc1c58d1")]; + case 1: + hexBytes = _a.sent(); + // No contenthash + if (hexBytes == null || hexBytes === "0x") { + return [2 /*return*/, null]; + } + ipfs = hexBytes.match(/^0xe3010170(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/); + if (ipfs) { + length_5 = parseInt(ipfs[3], 16); + if (ipfs[4].length === length_5 * 2) { + return [2 /*return*/, "ipfs:/\/" + basex_1.Base58.encode("0x" + ipfs[1])]; + } + } + swarm = hexBytes.match(/^0xe40101fa011b20([0-9a-f]*)$/); + if (swarm) { + if (swarm[1].length === (32 * 2)) { + return [2 /*return*/, "bzz:/\/" + swarm[1]]; + } + } + return [2 /*return*/, logger.throwError("invalid or unsupported content hash data", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "getContentHash()", + data: hexBytes + })]; + } + }); + }); + }; + Resolver.prototype.getText = function (key) { + return __awaiter(this, void 0, void 0, function () { + var keyBytes, hexBytes; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + keyBytes = strings_1.toUtf8Bytes(key); + // The nodehash consumes the first slot, so the string pointer targets + // offset 64, with the length at offset 64 and data starting at offset 96 + keyBytes = bytes_1.concat([bytes32ify(64), bytes32ify(keyBytes.length), keyBytes]); + // Pad to word-size (32 bytes) + if ((keyBytes.length % 32) !== 0) { + keyBytes = bytes_1.concat([keyBytes, bytes_1.hexZeroPad("0x", 32 - (key.length % 32))]); + } + return [4 /*yield*/, this._fetchBytes("0x59d1d43c", bytes_1.hexlify(keyBytes))]; + case 1: + hexBytes = _a.sent(); + if (hexBytes == null || hexBytes === "0x") { + return [2 /*return*/, null]; + } + return [2 /*return*/, strings_1.toUtf8String(hexBytes)]; + } + }); + }); + }; + return Resolver; +}()); +exports.Resolver = Resolver; +var defaultFormatter = null; +var nextPollId = 1; +var BaseProvider = /** @class */ (function (_super) { + __extends(BaseProvider, _super); + /** + * ready + * + * A Promise that resolves only once the provider is ready. + * + * Sub-classes that call the super with a network without a chainId + * MUST set this. Standard named networks have a known chainId. + * + */ + function BaseProvider(network) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, abstract_provider_1.Provider); + _this = _super.call(this) || this; + // Events being listened to + _this._events = []; + _this._emitted = { block: -2 }; + _this.formatter = _newTarget.getFormatter(); + // If network is any, this Provider allows the underlying + // network to change dynamically, and we auto-detect the + // current network + properties_1.defineReadOnly(_this, "anyNetwork", (network === "any")); + if (_this.anyNetwork) { + network = _this.detectNetwork(); + } + if (network instanceof Promise) { + _this._networkPromise = network; + // Squash any "unhandled promise" errors; that do not need to be handled + network.catch(function (error) { }); + // Trigger initial network setting (async) + _this._ready().catch(function (error) { }); + } + else { + var knownNetwork = properties_1.getStatic((_newTarget), "getNetwork")(network); + if (knownNetwork) { + properties_1.defineReadOnly(_this, "_network", knownNetwork); + _this.emit("network", knownNetwork, null); + } + else { + logger.throwArgumentError("invalid network", "network", network); + } + } + _this._maxInternalBlockNumber = -1024; + _this._lastBlockNumber = -2; + _this._pollingInterval = 4000; + _this._fastQueryDate = 0; + return _this; + } + BaseProvider.prototype._ready = function () { + return __awaiter(this, void 0, void 0, function () { + var network, error_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(this._network == null)) return [3 /*break*/, 7]; + network = null; + if (!this._networkPromise) return [3 /*break*/, 4]; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this._networkPromise]; + case 2: + network = _a.sent(); + return [3 /*break*/, 4]; + case 3: + error_3 = _a.sent(); + return [3 /*break*/, 4]; + case 4: + if (!(network == null)) return [3 /*break*/, 6]; + return [4 /*yield*/, this.detectNetwork()]; + case 5: + network = _a.sent(); + _a.label = 6; + case 6: + // This should never happen; every Provider sub-class should have + // suggested a network by here (or have thrown). + if (!network) { + logger.throwError("no network detected", logger_1.Logger.errors.UNKNOWN_ERROR, {}); + } + // Possible this call stacked so do not call defineReadOnly again + if (this._network == null) { + if (this.anyNetwork) { + this._network = network; + } + else { + properties_1.defineReadOnly(this, "_network", network); + } + this.emit("network", network, null); + } + _a.label = 7; + case 7: return [2 /*return*/, this._network]; + } + }); + }); + }; + Object.defineProperty(BaseProvider.prototype, "ready", { + // This will always return the most recently established network. + // For "any", this can change (a "network" event is emitted before + // any change is refelcted); otherwise this cannot change + get: function () { + var _this = this; + return web_1.poll(function () { + return _this._ready().then(function (network) { + return network; + }, function (error) { + // If the network isn't running yet, we will wait + if (error.code === logger_1.Logger.errors.NETWORK_ERROR && error.event === "noNetwork") { + return undefined; + } + throw error; + }); + }); + }, + enumerable: false, + configurable: true + }); + // @TODO: Remove this and just create a singleton formatter + BaseProvider.getFormatter = function () { + if (defaultFormatter == null) { + defaultFormatter = new formatter_1.Formatter(); + } + return defaultFormatter; + }; + // @TODO: Remove this and just use getNetwork + BaseProvider.getNetwork = function (network) { + return networks_1.getNetwork((network == null) ? "homestead" : network); + }; + // Fetches the blockNumber, but will reuse any result that is less + // than maxAge old or has been requested since the last request + BaseProvider.prototype._getInternalBlockNumber = function (maxAge) { + return __awaiter(this, void 0, void 0, function () { + var internalBlockNumber, result, error_4, reqTime, checkInternalBlockNumber; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this._ready()]; + case 1: + _a.sent(); + if (!(maxAge > 0)) return [3 /*break*/, 7]; + _a.label = 2; + case 2: + if (!this._internalBlockNumber) return [3 /*break*/, 7]; + internalBlockNumber = this._internalBlockNumber; + _a.label = 3; + case 3: + _a.trys.push([3, 5, , 6]); + return [4 /*yield*/, internalBlockNumber]; + case 4: + result = _a.sent(); + if ((getTime() - result.respTime) <= maxAge) { + return [2 /*return*/, result.blockNumber]; + } + // Too old; fetch a new value + return [3 /*break*/, 7]; + case 5: + error_4 = _a.sent(); + // The fetch rejected; if we are the first to get the + // rejection, drop through so we replace it with a new + // fetch; all others blocked will then get that fetch + // which won't match the one they "remembered" and loop + if (this._internalBlockNumber === internalBlockNumber) { + return [3 /*break*/, 7]; + } + return [3 /*break*/, 6]; + case 6: return [3 /*break*/, 2]; + case 7: + reqTime = getTime(); + checkInternalBlockNumber = properties_1.resolveProperties({ + blockNumber: this.perform("getBlockNumber", {}), + networkError: this.getNetwork().then(function (network) { return (null); }, function (error) { return (error); }) + }).then(function (_a) { + var blockNumber = _a.blockNumber, networkError = _a.networkError; + if (networkError) { + // Unremember this bad internal block number + if (_this._internalBlockNumber === checkInternalBlockNumber) { + _this._internalBlockNumber = null; + } + throw networkError; + } + var respTime = getTime(); + blockNumber = bignumber_1.BigNumber.from(blockNumber).toNumber(); + if (blockNumber < _this._maxInternalBlockNumber) { + blockNumber = _this._maxInternalBlockNumber; + } + _this._maxInternalBlockNumber = blockNumber; + _this._setFastBlockNumber(blockNumber); // @TODO: Still need this? + return { blockNumber: blockNumber, reqTime: reqTime, respTime: respTime }; + }); + this._internalBlockNumber = checkInternalBlockNumber; + // Swallow unhandled exceptions; if needed they are handled else where + checkInternalBlockNumber.catch(function (error) { + // Don't null the dead (rejected) fetch, if it has already been updated + if (_this._internalBlockNumber === checkInternalBlockNumber) { + _this._internalBlockNumber = null; + } + }); + return [4 /*yield*/, checkInternalBlockNumber]; + case 8: return [2 /*return*/, (_a.sent()).blockNumber]; + } + }); + }); + }; + BaseProvider.prototype.poll = function () { + return __awaiter(this, void 0, void 0, function () { + var pollId, runners, blockNumber, error_5, i; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + pollId = nextPollId++; + runners = []; + blockNumber = null; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this._getInternalBlockNumber(100 + this.pollingInterval / 2)]; + case 2: + blockNumber = _a.sent(); + return [3 /*break*/, 4]; + case 3: + error_5 = _a.sent(); + this.emit("error", error_5); + return [2 /*return*/]; + case 4: + this._setFastBlockNumber(blockNumber); + // Emit a poll event after we have the latest (fast) block number + this.emit("poll", pollId, blockNumber); + // If the block has not changed, meh. + if (blockNumber === this._lastBlockNumber) { + this.emit("didPoll", pollId); + return [2 /*return*/]; + } + // First polling cycle, trigger a "block" events + if (this._emitted.block === -2) { + this._emitted.block = blockNumber - 1; + } + if (Math.abs((this._emitted.block) - blockNumber) > 1000) { + logger.warn("network block skew detected; skipping block events (emitted=" + this._emitted.block + " blockNumber" + blockNumber + ")"); + this.emit("error", logger.makeError("network block skew detected", logger_1.Logger.errors.NETWORK_ERROR, { + blockNumber: blockNumber, + event: "blockSkew", + previousBlockNumber: this._emitted.block + })); + this.emit("block", blockNumber); + } + else { + // Notify all listener for each block that has passed + for (i = this._emitted.block + 1; i <= blockNumber; i++) { + this.emit("block", i); + } + } + // The emitted block was updated, check for obsolete events + if (this._emitted.block !== blockNumber) { + this._emitted.block = blockNumber; + Object.keys(this._emitted).forEach(function (key) { + // The block event does not expire + if (key === "block") { + return; + } + // The block we were at when we emitted this event + var eventBlockNumber = _this._emitted[key]; + // We cannot garbage collect pending transactions or blocks here + // They should be garbage collected by the Provider when setting + // "pending" events + if (eventBlockNumber === "pending") { + return; + } + // Evict any transaction hashes or block hashes over 12 blocks + // old, since they should not return null anyways + if (blockNumber - eventBlockNumber > 12) { + delete _this._emitted[key]; + } + }); + } + // First polling cycle + if (this._lastBlockNumber === -2) { + this._lastBlockNumber = blockNumber - 1; + } + // Find all transaction hashes we are waiting on + this._events.forEach(function (event) { + switch (event.type) { + case "tx": { + var hash_2 = event.hash; + var runner = _this.getTransactionReceipt(hash_2).then(function (receipt) { + if (!receipt || receipt.blockNumber == null) { + return null; + } + _this._emitted["t:" + hash_2] = receipt.blockNumber; + _this.emit(hash_2, receipt); + return null; + }).catch(function (error) { _this.emit("error", error); }); + runners.push(runner); + break; + } + case "filter": { + var filter_1 = event.filter; + filter_1.fromBlock = _this._lastBlockNumber + 1; + filter_1.toBlock = blockNumber; + var runner = _this.getLogs(filter_1).then(function (logs) { + if (logs.length === 0) { + return; + } + logs.forEach(function (log) { + _this._emitted["b:" + log.blockHash] = log.blockNumber; + _this._emitted["t:" + log.transactionHash] = log.blockNumber; + _this.emit(filter_1, log); + }); + }).catch(function (error) { _this.emit("error", error); }); + runners.push(runner); + break; + } + } + }); + this._lastBlockNumber = blockNumber; + // Once all events for this loop have been processed, emit "didPoll" + Promise.all(runners).then(function () { + _this.emit("didPoll", pollId); + }).catch(function (error) { _this.emit("error", error); }); + return [2 /*return*/]; + } + }); + }); + }; + // Deprecated; do not use this + BaseProvider.prototype.resetEventsBlock = function (blockNumber) { + this._lastBlockNumber = blockNumber - 1; + if (this.polling) { + this.poll(); + } + }; + Object.defineProperty(BaseProvider.prototype, "network", { + get: function () { + return this._network; + }, + enumerable: false, + configurable: true + }); + // This method should query the network if the underlying network + // can change, such as when connected to a JSON-RPC backend + BaseProvider.prototype.detectNetwork = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, logger.throwError("provider does not support network detection", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "provider.detectNetwork" + })]; + }); + }); + }; + BaseProvider.prototype.getNetwork = function () { + return __awaiter(this, void 0, void 0, function () { + var network, currentNetwork, error; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this._ready()]; + case 1: + network = _a.sent(); + return [4 /*yield*/, this.detectNetwork()]; + case 2: + currentNetwork = _a.sent(); + if (!(network.chainId !== currentNetwork.chainId)) return [3 /*break*/, 5]; + if (!this.anyNetwork) return [3 /*break*/, 4]; + this._network = currentNetwork; + // Reset all internal block number guards and caches + this._lastBlockNumber = -2; + this._fastBlockNumber = null; + this._fastBlockNumberPromise = null; + this._fastQueryDate = 0; + this._emitted.block = -2; + this._maxInternalBlockNumber = -1024; + this._internalBlockNumber = null; + // The "network" event MUST happen before this method resolves + // so any events have a chance to unregister, so we stall an + // additional event loop before returning from /this/ call + this.emit("network", currentNetwork, network); + return [4 /*yield*/, stall(0)]; + case 3: + _a.sent(); + return [2 /*return*/, this._network]; + case 4: + error = logger.makeError("underlying network changed", logger_1.Logger.errors.NETWORK_ERROR, { + event: "changed", + network: network, + detectedNetwork: currentNetwork + }); + this.emit("error", error); + throw error; + case 5: return [2 /*return*/, network]; + } + }); + }); + }; + Object.defineProperty(BaseProvider.prototype, "blockNumber", { + get: function () { + var _this = this; + this._getInternalBlockNumber(100 + this.pollingInterval / 2).then(function (blockNumber) { + _this._setFastBlockNumber(blockNumber); + }, function (error) { }); + return (this._fastBlockNumber != null) ? this._fastBlockNumber : -1; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseProvider.prototype, "polling", { + get: function () { + return (this._poller != null); + }, + set: function (value) { + var _this = this; + if (value && !this._poller) { + this._poller = setInterval(function () { _this.poll(); }, this.pollingInterval); + if (!this._bootstrapPoll) { + this._bootstrapPoll = setTimeout(function () { + _this.poll(); + // We block additional polls until the polling interval + // is done, to prevent overwhelming the poll function + _this._bootstrapPoll = setTimeout(function () { + // If polling was disabled, something may require a poke + // since starting the bootstrap poll and it was disabled + if (!_this._poller) { + _this.poll(); + } + // Clear out the bootstrap so we can do another + _this._bootstrapPoll = null; + }, _this.pollingInterval); + }, 0); + } + } + else if (!value && this._poller) { + clearInterval(this._poller); + this._poller = null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(BaseProvider.prototype, "pollingInterval", { + get: function () { + return this._pollingInterval; + }, + set: function (value) { + var _this = this; + if (typeof (value) !== "number" || value <= 0 || parseInt(String(value)) != value) { + throw new Error("invalid polling interval"); + } + this._pollingInterval = value; + if (this._poller) { + clearInterval(this._poller); + this._poller = setInterval(function () { _this.poll(); }, this._pollingInterval); + } + }, + enumerable: false, + configurable: true + }); + BaseProvider.prototype._getFastBlockNumber = function () { + var _this = this; + var now = getTime(); + // Stale block number, request a newer value + if ((now - this._fastQueryDate) > 2 * this._pollingInterval) { + this._fastQueryDate = now; + this._fastBlockNumberPromise = this.getBlockNumber().then(function (blockNumber) { + if (_this._fastBlockNumber == null || blockNumber > _this._fastBlockNumber) { + _this._fastBlockNumber = blockNumber; + } + return _this._fastBlockNumber; + }); + } + return this._fastBlockNumberPromise; + }; + BaseProvider.prototype._setFastBlockNumber = function (blockNumber) { + // Older block, maybe a stale request + if (this._fastBlockNumber != null && blockNumber < this._fastBlockNumber) { + return; + } + // Update the time we updated the blocknumber + this._fastQueryDate = getTime(); + // Newer block number, use it + if (this._fastBlockNumber == null || blockNumber > this._fastBlockNumber) { + this._fastBlockNumber = blockNumber; + this._fastBlockNumberPromise = Promise.resolve(blockNumber); + } + }; + BaseProvider.prototype.waitForTransaction = function (transactionHash, confirmations, timeout) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this._waitForTransaction(transactionHash, (confirmations == null) ? 1 : confirmations, timeout || 0, null)]; + }); + }); + }; + BaseProvider.prototype._waitForTransaction = function (transactionHash, confirmations, timeout, replaceable) { + return __awaiter(this, void 0, void 0, function () { + var receipt; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getTransactionReceipt(transactionHash)]; + case 1: + receipt = _a.sent(); + // Receipt is already good + if ((receipt ? receipt.confirmations : 0) >= confirmations) { + return [2 /*return*/, receipt]; + } + // Poll until the receipt is good... + return [2 /*return*/, new Promise(function (resolve, reject) { + var cancelFuncs = []; + var done = false; + var alreadyDone = function () { + if (done) { + return true; + } + done = true; + cancelFuncs.forEach(function (func) { func(); }); + return false; + }; + var minedHandler = function (receipt) { + if (receipt.confirmations < confirmations) { + return; + } + if (alreadyDone()) { + return; + } + resolve(receipt); + }; + _this.on(transactionHash, minedHandler); + cancelFuncs.push(function () { _this.removeListener(transactionHash, minedHandler); }); + if (replaceable) { + var lastBlockNumber_1 = replaceable.startBlock; + var scannedBlock_1 = null; + var replaceHandler_1 = function (blockNumber) { return __awaiter(_this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (done) { + return [2 /*return*/]; + } + // Wait 1 second; this is only used in the case of a fault, so + // we will trade off a little bit of latency for more consistent + // results and fewer JSON-RPC calls + return [4 /*yield*/, stall(1000)]; + case 1: + // Wait 1 second; this is only used in the case of a fault, so + // we will trade off a little bit of latency for more consistent + // results and fewer JSON-RPC calls + _a.sent(); + this.getTransactionCount(replaceable.from).then(function (nonce) { return __awaiter(_this, void 0, void 0, function () { + var mined, block, ti, tx, receipt_1, reason; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (done) { + return [2 /*return*/]; + } + if (!(nonce <= replaceable.nonce)) return [3 /*break*/, 1]; + lastBlockNumber_1 = blockNumber; + return [3 /*break*/, 9]; + case 1: return [4 /*yield*/, this.getTransaction(transactionHash)]; + case 2: + mined = _a.sent(); + if (mined && mined.blockNumber != null) { + return [2 /*return*/]; + } + // First time scanning. We start a little earlier for some + // wiggle room here to handle the eventually consistent nature + // of blockchain (e.g. the getTransactionCount was for a + // different block) + if (scannedBlock_1 == null) { + scannedBlock_1 = lastBlockNumber_1 - 3; + if (scannedBlock_1 < replaceable.startBlock) { + scannedBlock_1 = replaceable.startBlock; + } + } + _a.label = 3; + case 3: + if (!(scannedBlock_1 <= blockNumber)) return [3 /*break*/, 9]; + if (done) { + return [2 /*return*/]; + } + return [4 /*yield*/, this.getBlockWithTransactions(scannedBlock_1)]; + case 4: + block = _a.sent(); + ti = 0; + _a.label = 5; + case 5: + if (!(ti < block.transactions.length)) return [3 /*break*/, 8]; + tx = block.transactions[ti]; + // Successfully mined! + if (tx.hash === transactionHash) { + return [2 /*return*/]; + } + if (!(tx.from === replaceable.from && tx.nonce === replaceable.nonce)) return [3 /*break*/, 7]; + if (done) { + return [2 /*return*/]; + } + return [4 /*yield*/, this.waitForTransaction(tx.hash, confirmations)]; + case 6: + receipt_1 = _a.sent(); + // Already resolved or rejected (prolly a timeout) + if (alreadyDone()) { + return [2 /*return*/]; + } + reason = "replaced"; + if (tx.data === replaceable.data && tx.to === replaceable.to && tx.value.eq(replaceable.value)) { + reason = "repriced"; + } + else if (tx.data === "0x" && tx.from === tx.to && tx.value.isZero()) { + reason = "cancelled"; + } + // Explain why we were replaced + reject(logger.makeError("transaction was replaced", logger_1.Logger.errors.TRANSACTION_REPLACED, { + cancelled: (reason === "replaced" || reason === "cancelled"), + reason: reason, + replacement: this._wrapTransaction(tx), + hash: transactionHash, + receipt: receipt_1 + })); + return [2 /*return*/]; + case 7: + ti++; + return [3 /*break*/, 5]; + case 8: + scannedBlock_1++; + return [3 /*break*/, 3]; + case 9: + if (done) { + return [2 /*return*/]; + } + this.once("block", replaceHandler_1); + return [2 /*return*/]; + } + }); + }); }, function (error) { + if (done) { + return; + } + _this.once("block", replaceHandler_1); + }); + return [2 /*return*/]; + } + }); + }); }; + if (done) { + return; + } + _this.once("block", replaceHandler_1); + cancelFuncs.push(function () { + _this.removeListener("block", replaceHandler_1); + }); + } + if (typeof (timeout) === "number" && timeout > 0) { + var timer_1 = setTimeout(function () { + if (alreadyDone()) { + return; + } + reject(logger.makeError("timeout exceeded", logger_1.Logger.errors.TIMEOUT, { timeout: timeout })); + }, timeout); + if (timer_1.unref) { + timer_1.unref(); + } + cancelFuncs.push(function () { clearTimeout(timer_1); }); + } + })]; + } + }); + }); + }; + BaseProvider.prototype.getBlockNumber = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this._getInternalBlockNumber(0)]; + }); + }); + }; + BaseProvider.prototype.getGasPrice = function () { + return __awaiter(this, void 0, void 0, function () { + var result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, this.perform("getGasPrice", {})]; + case 2: + result = _a.sent(); + try { + return [2 /*return*/, bignumber_1.BigNumber.from(result)]; + } + catch (error) { + return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, { + method: "getGasPrice", + result: result, error: error + })]; + } + return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype.getBalance = function (addressOrName, blockTag) { + return __awaiter(this, void 0, void 0, function () { + var params, result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, properties_1.resolveProperties({ + address: this._getAddress(addressOrName), + blockTag: this._getBlockTag(blockTag) + })]; + case 2: + params = _a.sent(); + return [4 /*yield*/, this.perform("getBalance", params)]; + case 3: + result = _a.sent(); + try { + return [2 /*return*/, bignumber_1.BigNumber.from(result)]; + } + catch (error) { + return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, { + method: "getBalance", + params: params, result: result, error: error + })]; + } + return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype.getTransactionCount = function (addressOrName, blockTag) { + return __awaiter(this, void 0, void 0, function () { + var params, result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, properties_1.resolveProperties({ + address: this._getAddress(addressOrName), + blockTag: this._getBlockTag(blockTag) + })]; + case 2: + params = _a.sent(); + return [4 /*yield*/, this.perform("getTransactionCount", params)]; + case 3: + result = _a.sent(); + try { + return [2 /*return*/, bignumber_1.BigNumber.from(result).toNumber()]; + } + catch (error) { + return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, { + method: "getTransactionCount", + params: params, result: result, error: error + })]; + } + return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype.getCode = function (addressOrName, blockTag) { + return __awaiter(this, void 0, void 0, function () { + var params, result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, properties_1.resolveProperties({ + address: this._getAddress(addressOrName), + blockTag: this._getBlockTag(blockTag) + })]; + case 2: + params = _a.sent(); + return [4 /*yield*/, this.perform("getCode", params)]; + case 3: + result = _a.sent(); + try { + return [2 /*return*/, bytes_1.hexlify(result)]; + } + catch (error) { + return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, { + method: "getCode", + params: params, result: result, error: error + })]; + } + return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype.getStorageAt = function (addressOrName, position, blockTag) { + return __awaiter(this, void 0, void 0, function () { + var params, result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, properties_1.resolveProperties({ + address: this._getAddress(addressOrName), + blockTag: this._getBlockTag(blockTag), + position: Promise.resolve(position).then(function (p) { return bytes_1.hexValue(p); }) + })]; + case 2: + params = _a.sent(); + return [4 /*yield*/, this.perform("getStorageAt", params)]; + case 3: + result = _a.sent(); + try { + return [2 /*return*/, bytes_1.hexlify(result)]; + } + catch (error) { + return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, { + method: "getStorageAt", + params: params, result: result, error: error + })]; + } + return [2 /*return*/]; + } + }); + }); + }; + // This should be called by any subclass wrapping a TransactionResponse + BaseProvider.prototype._wrapTransaction = function (tx, hash, startBlock) { + var _this = this; + if (hash != null && bytes_1.hexDataLength(hash) !== 32) { + throw new Error("invalid response - sendTransaction"); + } + var result = tx; + // Check the hash we expect is the same as the hash the server reported + if (hash != null && tx.hash !== hash) { + logger.throwError("Transaction hash mismatch from Provider.sendTransaction.", logger_1.Logger.errors.UNKNOWN_ERROR, { expectedHash: tx.hash, returnedHash: hash }); + } + result.wait = function (confirms, timeout) { return __awaiter(_this, void 0, void 0, function () { + var replacement, receipt; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (confirms == null) { + confirms = 1; + } + if (timeout == null) { + timeout = 0; + } + replacement = undefined; + if (confirms !== 0 && startBlock != null) { + replacement = { + data: tx.data, + from: tx.from, + nonce: tx.nonce, + to: tx.to, + value: tx.value, + startBlock: startBlock + }; + } + return [4 /*yield*/, this._waitForTransaction(tx.hash, confirms, timeout, replacement)]; + case 1: + receipt = _a.sent(); + if (receipt == null && confirms === 0) { + return [2 /*return*/, null]; + } + // No longer pending, allow the polling loop to garbage collect this + this._emitted["t:" + tx.hash] = receipt.blockNumber; + if (receipt.status === 0) { + logger.throwError("transaction failed", logger_1.Logger.errors.CALL_EXCEPTION, { + transactionHash: tx.hash, + transaction: tx, + receipt: receipt + }); + } + return [2 /*return*/, receipt]; + } + }); + }); }; + return result; + }; + BaseProvider.prototype.sendTransaction = function (signedTransaction) { + return __awaiter(this, void 0, void 0, function () { + var hexTx, tx, blockNumber, hash, error_6; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, Promise.resolve(signedTransaction).then(function (t) { return bytes_1.hexlify(t); })]; + case 2: + hexTx = _a.sent(); + tx = this.formatter.transaction(signedTransaction); + if (tx.confirmations == null) { + tx.confirmations = 0; + } + return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)]; + case 3: + blockNumber = _a.sent(); + _a.label = 4; + case 4: + _a.trys.push([4, 6, , 7]); + return [4 /*yield*/, this.perform("sendTransaction", { signedTransaction: hexTx })]; + case 5: + hash = _a.sent(); + return [2 /*return*/, this._wrapTransaction(tx, hash, blockNumber)]; + case 6: + error_6 = _a.sent(); + error_6.transaction = tx; + error_6.transactionHash = tx.hash; + throw error_6; + case 7: return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype._getTransactionRequest = function (transaction) { + return __awaiter(this, void 0, void 0, function () { + var values, tx, _a, _b; + var _this = this; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: return [4 /*yield*/, transaction]; + case 1: + values = _c.sent(); + tx = {}; + ["from", "to"].forEach(function (key) { + if (values[key] == null) { + return; + } + tx[key] = Promise.resolve(values[key]).then(function (v) { return (v ? _this._getAddress(v) : null); }); + }); + ["gasLimit", "gasPrice", "maxFeePerGas", "maxPriorityFeePerGas", "value"].forEach(function (key) { + if (values[key] == null) { + return; + } + tx[key] = Promise.resolve(values[key]).then(function (v) { return (v ? bignumber_1.BigNumber.from(v) : null); }); + }); + ["type"].forEach(function (key) { + if (values[key] == null) { + return; + } + tx[key] = Promise.resolve(values[key]).then(function (v) { return ((v != null) ? v : null); }); + }); + if (values.accessList) { + tx.accessList = this.formatter.accessList(values.accessList); + } + ["data"].forEach(function (key) { + if (values[key] == null) { + return; + } + tx[key] = Promise.resolve(values[key]).then(function (v) { return (v ? bytes_1.hexlify(v) : null); }); + }); + _b = (_a = this.formatter).transactionRequest; + return [4 /*yield*/, properties_1.resolveProperties(tx)]; + case 2: return [2 /*return*/, _b.apply(_a, [_c.sent()])]; + } + }); + }); + }; + BaseProvider.prototype._getFilter = function (filter) { + return __awaiter(this, void 0, void 0, function () { + var result, _a, _b; + var _this = this; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: return [4 /*yield*/, filter]; + case 1: + filter = _c.sent(); + result = {}; + if (filter.address != null) { + result.address = this._getAddress(filter.address); + } + ["blockHash", "topics"].forEach(function (key) { + if (filter[key] == null) { + return; + } + result[key] = filter[key]; + }); + ["fromBlock", "toBlock"].forEach(function (key) { + if (filter[key] == null) { + return; + } + result[key] = _this._getBlockTag(filter[key]); + }); + _b = (_a = this.formatter).filter; + return [4 /*yield*/, properties_1.resolveProperties(result)]; + case 2: return [2 /*return*/, _b.apply(_a, [_c.sent()])]; + } + }); + }); + }; + BaseProvider.prototype.call = function (transaction, blockTag) { + return __awaiter(this, void 0, void 0, function () { + var params, result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, properties_1.resolveProperties({ + transaction: this._getTransactionRequest(transaction), + blockTag: this._getBlockTag(blockTag) + })]; + case 2: + params = _a.sent(); + return [4 /*yield*/, this.perform("call", params)]; + case 3: + result = _a.sent(); + try { + return [2 /*return*/, bytes_1.hexlify(result)]; + } + catch (error) { + return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, { + method: "call", + params: params, result: result, error: error + })]; + } + return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype.estimateGas = function (transaction) { + return __awaiter(this, void 0, void 0, function () { + var params, result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, properties_1.resolveProperties({ + transaction: this._getTransactionRequest(transaction) + })]; + case 2: + params = _a.sent(); + return [4 /*yield*/, this.perform("estimateGas", params)]; + case 3: + result = _a.sent(); + try { + return [2 /*return*/, bignumber_1.BigNumber.from(result)]; + } + catch (error) { + return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, { + method: "estimateGas", + params: params, result: result, error: error + })]; + } + return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype._getAddress = function (addressOrName) { + return __awaiter(this, void 0, void 0, function () { + var address; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.resolveName(addressOrName)]; + case 1: + address = _a.sent(); + if (address == null) { + logger.throwError("ENS name not configured", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "resolveName(" + JSON.stringify(addressOrName) + ")" + }); + } + return [2 /*return*/, address]; + } + }); + }); + }; + BaseProvider.prototype._getBlock = function (blockHashOrBlockTag, includeTransactions) { + return __awaiter(this, void 0, void 0, function () { + var blockNumber, params, _a, _b, _c, error_7; + var _this = this; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _d.sent(); + return [4 /*yield*/, blockHashOrBlockTag]; + case 2: + blockHashOrBlockTag = _d.sent(); + blockNumber = -128; + params = { + includeTransactions: !!includeTransactions + }; + if (!bytes_1.isHexString(blockHashOrBlockTag, 32)) return [3 /*break*/, 3]; + params.blockHash = blockHashOrBlockTag; + return [3 /*break*/, 6]; + case 3: + _d.trys.push([3, 5, , 6]); + _a = params; + _c = (_b = this.formatter).blockTag; + return [4 /*yield*/, this._getBlockTag(blockHashOrBlockTag)]; + case 4: + _a.blockTag = _c.apply(_b, [_d.sent()]); + if (bytes_1.isHexString(params.blockTag)) { + blockNumber = parseInt(params.blockTag.substring(2), 16); + } + return [3 /*break*/, 6]; + case 5: + error_7 = _d.sent(); + logger.throwArgumentError("invalid block hash or block tag", "blockHashOrBlockTag", blockHashOrBlockTag); + return [3 /*break*/, 6]; + case 6: return [2 /*return*/, web_1.poll(function () { return __awaiter(_this, void 0, void 0, function () { + var block, blockNumber_1, i, tx, confirmations, blockWithTxs; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.perform("getBlock", params)]; + case 1: + block = _a.sent(); + // Block was not found + if (block == null) { + // For blockhashes, if we didn't say it existed, that blockhash may + // not exist. If we did see it though, perhaps from a log, we know + // it exists, and this node is just not caught up yet. + if (params.blockHash != null) { + if (this._emitted["b:" + params.blockHash] == null) { + return [2 /*return*/, null]; + } + } + // For block tags, if we are asking for a future block, we return null + if (params.blockTag != null) { + if (blockNumber > this._emitted.block) { + return [2 /*return*/, null]; + } + } + // Retry on the next block + return [2 /*return*/, undefined]; + } + if (!includeTransactions) return [3 /*break*/, 8]; + blockNumber_1 = null; + i = 0; + _a.label = 2; + case 2: + if (!(i < block.transactions.length)) return [3 /*break*/, 7]; + tx = block.transactions[i]; + if (!(tx.blockNumber == null)) return [3 /*break*/, 3]; + tx.confirmations = 0; + return [3 /*break*/, 6]; + case 3: + if (!(tx.confirmations == null)) return [3 /*break*/, 6]; + if (!(blockNumber_1 == null)) return [3 /*break*/, 5]; + return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)]; + case 4: + blockNumber_1 = _a.sent(); + _a.label = 5; + case 5: + confirmations = (blockNumber_1 - tx.blockNumber) + 1; + if (confirmations <= 0) { + confirmations = 1; + } + tx.confirmations = confirmations; + _a.label = 6; + case 6: + i++; + return [3 /*break*/, 2]; + case 7: + blockWithTxs = this.formatter.blockWithTransactions(block); + blockWithTxs.transactions = block.transactions.map(function (tx) { return _this._wrapTransaction(tx); }); + return [2 /*return*/, blockWithTxs]; + case 8: return [2 /*return*/, this.formatter.block(block)]; + } + }); + }); }, { oncePoll: this })]; + } + }); + }); + }; + BaseProvider.prototype.getBlock = function (blockHashOrBlockTag) { + return (this._getBlock(blockHashOrBlockTag, false)); + }; + BaseProvider.prototype.getBlockWithTransactions = function (blockHashOrBlockTag) { + return (this._getBlock(blockHashOrBlockTag, true)); + }; + BaseProvider.prototype.getTransaction = function (transactionHash) { + return __awaiter(this, void 0, void 0, function () { + var params; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, transactionHash]; + case 2: + transactionHash = _a.sent(); + params = { transactionHash: this.formatter.hash(transactionHash, true) }; + return [2 /*return*/, web_1.poll(function () { return __awaiter(_this, void 0, void 0, function () { + var result, tx, blockNumber, confirmations; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.perform("getTransaction", params)]; + case 1: + result = _a.sent(); + if (result == null) { + if (this._emitted["t:" + transactionHash] == null) { + return [2 /*return*/, null]; + } + return [2 /*return*/, undefined]; + } + tx = this.formatter.transactionResponse(result); + if (!(tx.blockNumber == null)) return [3 /*break*/, 2]; + tx.confirmations = 0; + return [3 /*break*/, 4]; + case 2: + if (!(tx.confirmations == null)) return [3 /*break*/, 4]; + return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)]; + case 3: + blockNumber = _a.sent(); + confirmations = (blockNumber - tx.blockNumber) + 1; + if (confirmations <= 0) { + confirmations = 1; + } + tx.confirmations = confirmations; + _a.label = 4; + case 4: return [2 /*return*/, this._wrapTransaction(tx)]; + } + }); + }); }, { oncePoll: this })]; + } + }); + }); + }; + BaseProvider.prototype.getTransactionReceipt = function (transactionHash) { + return __awaiter(this, void 0, void 0, function () { + var params; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, transactionHash]; + case 2: + transactionHash = _a.sent(); + params = { transactionHash: this.formatter.hash(transactionHash, true) }; + return [2 /*return*/, web_1.poll(function () { return __awaiter(_this, void 0, void 0, function () { + var result, receipt, blockNumber, confirmations; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.perform("getTransactionReceipt", params)]; + case 1: + result = _a.sent(); + if (result == null) { + if (this._emitted["t:" + transactionHash] == null) { + return [2 /*return*/, null]; + } + return [2 /*return*/, undefined]; + } + // "geth-etc" returns receipts before they are ready + if (result.blockHash == null) { + return [2 /*return*/, undefined]; + } + receipt = this.formatter.receipt(result); + if (!(receipt.blockNumber == null)) return [3 /*break*/, 2]; + receipt.confirmations = 0; + return [3 /*break*/, 4]; + case 2: + if (!(receipt.confirmations == null)) return [3 /*break*/, 4]; + return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)]; + case 3: + blockNumber = _a.sent(); + confirmations = (blockNumber - receipt.blockNumber) + 1; + if (confirmations <= 0) { + confirmations = 1; + } + receipt.confirmations = confirmations; + _a.label = 4; + case 4: return [2 /*return*/, receipt]; + } + }); + }); }, { oncePoll: this })]; + } + }); + }); + }; + BaseProvider.prototype.getLogs = function (filter) { + return __awaiter(this, void 0, void 0, function () { + var params, logs; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [4 /*yield*/, properties_1.resolveProperties({ filter: this._getFilter(filter) })]; + case 2: + params = _a.sent(); + return [4 /*yield*/, this.perform("getLogs", params)]; + case 3: + logs = _a.sent(); + logs.forEach(function (log) { + if (log.removed == null) { + log.removed = false; + } + }); + return [2 /*return*/, formatter_1.Formatter.arrayOf(this.formatter.filterLog.bind(this.formatter))(logs)]; + } + }); + }); + }; + BaseProvider.prototype.getEtherPrice = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + _a.sent(); + return [2 /*return*/, this.perform("getEtherPrice", {})]; + } + }); + }); + }; + BaseProvider.prototype._getBlockTag = function (blockTag) { + return __awaiter(this, void 0, void 0, function () { + var blockNumber; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, blockTag]; + case 1: + blockTag = _a.sent(); + if (!(typeof (blockTag) === "number" && blockTag < 0)) return [3 /*break*/, 3]; + if (blockTag % 1) { + logger.throwArgumentError("invalid BlockTag", "blockTag", blockTag); + } + return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)]; + case 2: + blockNumber = _a.sent(); + blockNumber += blockTag; + if (blockNumber < 0) { + blockNumber = 0; + } + return [2 /*return*/, this.formatter.blockTag(blockNumber)]; + case 3: return [2 /*return*/, this.formatter.blockTag(blockTag)]; + } + }); + }); + }; + BaseProvider.prototype.getResolver = function (name) { + return __awaiter(this, void 0, void 0, function () { + var address, error_8; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 2, , 3]); + return [4 /*yield*/, this._getResolver(name)]; + case 1: + address = _a.sent(); + if (address == null) { + return [2 /*return*/, null]; + } + return [2 /*return*/, new Resolver(this, address, name)]; + case 2: + error_8 = _a.sent(); + if (error_8.code === logger_1.Logger.errors.CALL_EXCEPTION) { + return [2 /*return*/, null]; + } + return [2 /*return*/, null]; + case 3: return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype._getResolver = function (name) { + return __awaiter(this, void 0, void 0, function () { + var network, transaction, _a, _b, error_9; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: return [4 /*yield*/, this.getNetwork()]; + case 1: + network = _c.sent(); + // No ENS... + if (!network.ensAddress) { + logger.throwError("network does not support ENS", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: "ENS", network: network.name }); + } + transaction = { + to: network.ensAddress, + data: ("0x0178b8bf" + hash_1.namehash(name).substring(2)) + }; + _c.label = 2; + case 2: + _c.trys.push([2, 4, , 5]); + _b = (_a = this.formatter).callAddress; + return [4 /*yield*/, this.call(transaction)]; + case 3: return [2 /*return*/, _b.apply(_a, [_c.sent()])]; + case 4: + error_9 = _c.sent(); + if (error_9.code === logger_1.Logger.errors.CALL_EXCEPTION) { + return [2 /*return*/, null]; + } + throw error_9; + case 5: return [2 /*return*/]; + } + }); + }); + }; + BaseProvider.prototype.resolveName = function (name) { + return __awaiter(this, void 0, void 0, function () { + var resolver; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, name]; + case 1: + name = _a.sent(); + // If it is already an address, nothing to resolve + try { + return [2 /*return*/, Promise.resolve(this.formatter.address(name))]; + } + catch (error) { + // If is is a hexstring, the address is bad (See #694) + if (bytes_1.isHexString(name)) { + throw error; + } + } + if (typeof (name) !== "string") { + logger.throwArgumentError("invalid ENS name", "name", name); + } + return [4 /*yield*/, this.getResolver(name)]; + case 2: + resolver = _a.sent(); + if (!resolver) { + return [2 /*return*/, null]; + } + return [4 /*yield*/, resolver.getAddress()]; + case 3: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + BaseProvider.prototype.lookupAddress = function (address) { + return __awaiter(this, void 0, void 0, function () { + var reverseName, resolverAddress, bytes, _a, length, name, addr; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, address]; + case 1: + address = _b.sent(); + address = this.formatter.address(address); + reverseName = address.substring(2).toLowerCase() + ".addr.reverse"; + return [4 /*yield*/, this._getResolver(reverseName)]; + case 2: + resolverAddress = _b.sent(); + if (!resolverAddress) { + return [2 /*return*/, null]; + } + _a = bytes_1.arrayify; + return [4 /*yield*/, this.call({ + to: resolverAddress, + data: ("0x691f3431" + hash_1.namehash(reverseName).substring(2)) + })]; + case 3: + bytes = _a.apply(void 0, [_b.sent()]); + // Strip off the dynamic string pointer (0x20) + if (bytes.length < 32 || !bignumber_1.BigNumber.from(bytes.slice(0, 32)).eq(32)) { + return [2 /*return*/, null]; + } + bytes = bytes.slice(32); + // Not a length-prefixed string + if (bytes.length < 32) { + return [2 /*return*/, null]; + } + length = bignumber_1.BigNumber.from(bytes.slice(0, 32)).toNumber(); + bytes = bytes.slice(32); + // Length longer than available data + if (length > bytes.length) { + return [2 /*return*/, null]; + } + name = strings_1.toUtf8String(bytes.slice(0, length)); + return [4 /*yield*/, this.resolveName(name)]; + case 4: + addr = _b.sent(); + if (addr != address) { + return [2 /*return*/, null]; + } + return [2 /*return*/, name]; + } + }); + }); + }; + BaseProvider.prototype.perform = function (method, params) { + return logger.throwError(method + " not implemented", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method }); + }; + BaseProvider.prototype._startEvent = function (event) { + this.polling = (this._events.filter(function (e) { return e.pollable(); }).length > 0); + }; + BaseProvider.prototype._stopEvent = function (event) { + this.polling = (this._events.filter(function (e) { return e.pollable(); }).length > 0); + }; + BaseProvider.prototype._addEventListener = function (eventName, listener, once) { + var event = new Event(getEventTag(eventName), listener, once); + this._events.push(event); + this._startEvent(event); + return this; + }; + BaseProvider.prototype.on = function (eventName, listener) { + return this._addEventListener(eventName, listener, false); + }; + BaseProvider.prototype.once = function (eventName, listener) { + return this._addEventListener(eventName, listener, true); + }; + BaseProvider.prototype.emit = function (eventName) { + var _this = this; + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var result = false; + var stopped = []; + var eventTag = getEventTag(eventName); + this._events = this._events.filter(function (event) { + if (event.tag !== eventTag) { + return true; + } + setTimeout(function () { + event.listener.apply(_this, args); + }, 0); + result = true; + if (event.once) { + stopped.push(event); + return false; + } + return true; + }); + stopped.forEach(function (event) { _this._stopEvent(event); }); + return result; + }; + BaseProvider.prototype.listenerCount = function (eventName) { + if (!eventName) { + return this._events.length; + } + var eventTag = getEventTag(eventName); + return this._events.filter(function (event) { + return (event.tag === eventTag); + }).length; + }; + BaseProvider.prototype.listeners = function (eventName) { + if (eventName == null) { + return this._events.map(function (event) { return event.listener; }); + } + var eventTag = getEventTag(eventName); + return this._events + .filter(function (event) { return (event.tag === eventTag); }) + .map(function (event) { return event.listener; }); + }; + BaseProvider.prototype.off = function (eventName, listener) { + var _this = this; + if (listener == null) { + return this.removeAllListeners(eventName); + } + var stopped = []; + var found = false; + var eventTag = getEventTag(eventName); + this._events = this._events.filter(function (event) { + if (event.tag !== eventTag || event.listener != listener) { + return true; + } + if (found) { + return true; + } + found = true; + stopped.push(event); + return false; + }); + stopped.forEach(function (event) { _this._stopEvent(event); }); + return this; + }; + BaseProvider.prototype.removeAllListeners = function (eventName) { + var _this = this; + var stopped = []; + if (eventName == null) { + stopped = this._events; + this._events = []; + } + else { + var eventTag_1 = getEventTag(eventName); + this._events = this._events.filter(function (event) { + if (event.tag !== eventTag_1) { + return true; + } + stopped.push(event); + return false; + }); + } + stopped.forEach(function (event) { _this._stopEvent(event); }); + return this; + }; + return BaseProvider; +}(abstract_provider_1.Provider)); +exports.BaseProvider = BaseProvider; + +},{"./_version":64,"./formatter":72,"@ethersproject/abstract-provider":20,"@ethersproject/basex":27,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/constants":37,"@ethersproject/hash":43,"@ethersproject/logger":57,"@ethersproject/networks":59,"@ethersproject/properties":63,"@ethersproject/sha2":90,"@ethersproject/strings":99,"@ethersproject/web":109,"bech32":167}],67:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IpcProvider = void 0; +var IpcProvider = null; +exports.IpcProvider = IpcProvider; + +},{}],68:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WebSocket = void 0; +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var WS = null; +exports.WebSocket = WS; +try { + exports.WebSocket = WS = WebSocket; + if (WS == null) { + throw new Error("inject please"); + } +} +catch (error) { + var logger_2 = new logger_1.Logger(_version_1.version); + exports.WebSocket = WS = function () { + logger_2.throwError("WebSockets not supported in this environment", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "new WebSocket()" + }); + }; +} + +},{"./_version":64,"@ethersproject/logger":57}],69:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CloudflareProvider = void 0; +var url_json_rpc_provider_1 = require("./url-json-rpc-provider"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var CloudflareProvider = /** @class */ (function (_super) { + __extends(CloudflareProvider, _super); + function CloudflareProvider() { + return _super !== null && _super.apply(this, arguments) || this; + } + CloudflareProvider.getApiKey = function (apiKey) { + if (apiKey != null) { + logger.throwArgumentError("apiKey not supported for cloudflare", "apiKey", apiKey); + } + return null; + }; + CloudflareProvider.getUrl = function (network, apiKey) { + var host = null; + switch (network.name) { + case "homestead": + host = "https://cloudflare-eth.com/"; + break; + default: + logger.throwArgumentError("unsupported network", "network", arguments[0]); + } + return host; + }; + CloudflareProvider.prototype.perform = function (method, params) { + return __awaiter(this, void 0, void 0, function () { + var block; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(method === "getBlockNumber")) return [3 /*break*/, 2]; + return [4 /*yield*/, _super.prototype.perform.call(this, "getBlock", { blockTag: "latest" })]; + case 1: + block = _a.sent(); + return [2 /*return*/, block.number]; + case 2: return [2 /*return*/, _super.prototype.perform.call(this, method, params)]; + } + }); + }); + }; + return CloudflareProvider; +}(url_json_rpc_provider_1.UrlJsonRpcProvider)); +exports.CloudflareProvider = CloudflareProvider; + +},{"./_version":64,"./url-json-rpc-provider":79,"@ethersproject/logger":57}],70:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EtherscanProvider = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var properties_1 = require("@ethersproject/properties"); +var transactions_1 = require("@ethersproject/transactions"); +var web_1 = require("@ethersproject/web"); +var formatter_1 = require("./formatter"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var base_provider_1 = require("./base-provider"); +// The transaction has already been sanitized by the calls in Provider +function getTransactionPostData(transaction) { + var result = {}; + for (var key in transaction) { + if (transaction[key] == null) { + continue; + } + var value = transaction[key]; + if (key === "type" && value === 0) { + continue; + } + // Quantity-types require no leading zero, unless 0 + if ({ type: true, gasLimit: true, gasPrice: true, maxFeePerGs: true, maxPriorityFeePerGas: true, nonce: true, value: true }[key]) { + value = bytes_1.hexValue(bytes_1.hexlify(value)); + } + else if (key === "accessList") { + value = "[" + transactions_1.accessListify(value).map(function (set) { + return "{address:\"" + set.address + "\",storageKeys:[\"" + set.storageKeys.join('","') + "\"]}"; + }).join(",") + "]"; + } + else { + value = bytes_1.hexlify(value); + } + result[key] = value; + } + return result; +} +function getResult(result) { + // getLogs, getHistory have weird success responses + if (result.status == 0 && (result.message === "No records found" || result.message === "No transactions found")) { + return result.result; + } + if (result.status != 1 || result.message != "OK") { + var error = new Error("invalid response"); + error.result = JSON.stringify(result); + if ((result.result || "").toLowerCase().indexOf("rate limit") >= 0) { + error.throttleRetry = true; + } + throw error; + } + return result.result; +} +function getJsonResult(result) { + // This response indicates we are being throttled + if (result && result.status == 0 && result.message == "NOTOK" && (result.result || "").toLowerCase().indexOf("rate limit") >= 0) { + var error = new Error("throttled response"); + error.result = JSON.stringify(result); + error.throttleRetry = true; + throw error; + } + if (result.jsonrpc != "2.0") { + // @TODO: not any + var error = new Error("invalid response"); + error.result = JSON.stringify(result); + throw error; + } + if (result.error) { + // @TODO: not any + var error = new Error(result.error.message || "unknown error"); + if (result.error.code) { + error.code = result.error.code; + } + if (result.error.data) { + error.data = result.error.data; + } + throw error; + } + return result.result; +} +// The blockTag was normalized as a string by the Provider pre-perform operations +function checkLogTag(blockTag) { + if (blockTag === "pending") { + throw new Error("pending not supported"); + } + if (blockTag === "latest") { + return blockTag; + } + return parseInt(blockTag.substring(2), 16); +} +var defaultApiKey = "9D13ZE7XSBTJ94N9BNJ2MA33VMAY2YPIRB"; +function checkError(method, error, transaction) { + // Undo the "convenience" some nodes are attempting to prevent backwards + // incompatibility; maybe for v6 consider forwarding reverts as errors + if (method === "call" && error.code === logger_1.Logger.errors.SERVER_ERROR) { + var e = error.error; + // Etherscan keeps changing their string + if (e && (e.message.match(/reverted/i) || e.message.match(/VM execution error/i))) { + // Etherscan prefixes the data like "Reverted 0x1234" + var data = e.data; + if (data) { + data = "0x" + data.replace(/^.*0x/i, ""); + } + if (bytes_1.isHexString(data)) { + return data; + } + logger.throwError("missing revert data in call exception", logger_1.Logger.errors.CALL_EXCEPTION, { + error: error, + data: "0x" + }); + } + } + // Get the message from any nested error structure + var message = error.message; + if (error.code === logger_1.Logger.errors.SERVER_ERROR) { + if (error.error && typeof (error.error.message) === "string") { + message = error.error.message; + } + else if (typeof (error.body) === "string") { + message = error.body; + } + else if (typeof (error.responseText) === "string") { + message = error.responseText; + } + } + message = (message || "").toLowerCase(); + // "Insufficient funds. The account you tried to send transaction from does not have enough funds. Required 21464000000000 and got: 0" + if (message.match(/insufficient funds/)) { + logger.throwError("insufficient funds for intrinsic transaction cost", logger_1.Logger.errors.INSUFFICIENT_FUNDS, { + error: error, method: method, transaction: transaction + }); + } + // "Transaction with the same hash was already imported." + if (message.match(/same hash was already imported|transaction nonce is too low|nonce too low/)) { + logger.throwError("nonce has already been used", logger_1.Logger.errors.NONCE_EXPIRED, { + error: error, method: method, transaction: transaction + }); + } + // "Transaction gas price is too low. There is another transaction with same nonce in the queue. Try increasing the gas price or incrementing the nonce." + if (message.match(/another transaction with same nonce/)) { + logger.throwError("replacement fee too low", logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, { + error: error, method: method, transaction: transaction + }); + } + if (message.match(/execution failed due to an exception|execution reverted/)) { + logger.throwError("cannot estimate gas; transaction may fail or may require manual gas limit", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, { + error: error, method: method, transaction: transaction + }); + } + throw error; +} +var EtherscanProvider = /** @class */ (function (_super) { + __extends(EtherscanProvider, _super); + function EtherscanProvider(network, apiKey) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, EtherscanProvider); + _this = _super.call(this, network) || this; + properties_1.defineReadOnly(_this, "baseUrl", _this.getBaseUrl()); + properties_1.defineReadOnly(_this, "apiKey", apiKey || defaultApiKey); + return _this; + } + EtherscanProvider.prototype.getBaseUrl = function () { + switch (this.network ? this.network.name : "invalid") { + case "homestead": + return "https:/\/api.etherscan.io"; + case "ropsten": + return "https:/\/api-ropsten.etherscan.io"; + case "rinkeby": + return "https:/\/api-rinkeby.etherscan.io"; + case "kovan": + return "https:/\/api-kovan.etherscan.io"; + case "goerli": + return "https:/\/api-goerli.etherscan.io"; + default: + } + return logger.throwArgumentError("unsupported network", "network", name); + }; + EtherscanProvider.prototype.getUrl = function (module, params) { + var query = Object.keys(params).reduce(function (accum, key) { + var value = params[key]; + if (value != null) { + accum += "&" + key + "=" + value; + } + return accum; + }, ""); + var apiKey = ((this.apiKey) ? "&apikey=" + this.apiKey : ""); + return this.baseUrl + "/api?module=" + module + query + apiKey; + }; + EtherscanProvider.prototype.getPostUrl = function () { + return this.baseUrl + "/api"; + }; + EtherscanProvider.prototype.getPostData = function (module, params) { + params.module = module; + params.apikey = this.apiKey; + return params; + }; + EtherscanProvider.prototype.fetch = function (module, params, post) { + return __awaiter(this, void 0, void 0, function () { + var url, payload, procFunc, connection, payloadStr, result; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + url = (post ? this.getPostUrl() : this.getUrl(module, params)); + payload = (post ? this.getPostData(module, params) : null); + procFunc = (module === "proxy") ? getJsonResult : getResult; + this.emit("debug", { + action: "request", + request: url, + provider: this + }); + connection = { + url: url, + throttleSlotInterval: 1000, + throttleCallback: function (attempt, url) { + if (_this.isCommunityResource()) { + formatter_1.showThrottleMessage(); + } + return Promise.resolve(true); + } + }; + payloadStr = null; + if (payload) { + connection.headers = { "content-type": "application/x-www-form-urlencoded; charset=UTF-8" }; + payloadStr = Object.keys(payload).map(function (key) { + return key + "=" + payload[key]; + }).join("&"); + } + return [4 /*yield*/, web_1.fetchJson(connection, payloadStr, procFunc || getJsonResult)]; + case 1: + result = _a.sent(); + this.emit("debug", { + action: "response", + request: url, + response: properties_1.deepCopy(result), + provider: this + }); + return [2 /*return*/, result]; + } + }); + }); + }; + EtherscanProvider.prototype.detectNetwork = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.network]; + }); + }); + }; + EtherscanProvider.prototype.perform = function (method, params) { + return __awaiter(this, void 0, void 0, function () { + var _a, postData, error_1, postData, error_2, args, topic0, logs, blocks, i, log, block, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _a = method; + switch (_a) { + case "getBlockNumber": return [3 /*break*/, 1]; + case "getGasPrice": return [3 /*break*/, 2]; + case "getBalance": return [3 /*break*/, 3]; + case "getTransactionCount": return [3 /*break*/, 4]; + case "getCode": return [3 /*break*/, 5]; + case "getStorageAt": return [3 /*break*/, 6]; + case "sendTransaction": return [3 /*break*/, 7]; + case "getBlock": return [3 /*break*/, 8]; + case "getTransaction": return [3 /*break*/, 9]; + case "getTransactionReceipt": return [3 /*break*/, 10]; + case "call": return [3 /*break*/, 11]; + case "estimateGas": return [3 /*break*/, 15]; + case "getLogs": return [3 /*break*/, 19]; + case "getEtherPrice": return [3 /*break*/, 26]; + } + return [3 /*break*/, 28]; + case 1: return [2 /*return*/, this.fetch("proxy", { action: "eth_blockNumber" })]; + case 2: return [2 /*return*/, this.fetch("proxy", { action: "eth_gasPrice" })]; + case 3: + // Returns base-10 result + return [2 /*return*/, this.fetch("account", { + action: "balance", + address: params.address, + tag: params.blockTag + })]; + case 4: return [2 /*return*/, this.fetch("proxy", { + action: "eth_getTransactionCount", + address: params.address, + tag: params.blockTag + })]; + case 5: return [2 /*return*/, this.fetch("proxy", { + action: "eth_getCode", + address: params.address, + tag: params.blockTag + })]; + case 6: return [2 /*return*/, this.fetch("proxy", { + action: "eth_getStorageAt", + address: params.address, + position: params.position, + tag: params.blockTag + })]; + case 7: return [2 /*return*/, this.fetch("proxy", { + action: "eth_sendRawTransaction", + hex: params.signedTransaction + }, true).catch(function (error) { + return checkError("sendTransaction", error, params.signedTransaction); + })]; + case 8: + if (params.blockTag) { + return [2 /*return*/, this.fetch("proxy", { + action: "eth_getBlockByNumber", + tag: params.blockTag, + boolean: (params.includeTransactions ? "true" : "false") + })]; + } + throw new Error("getBlock by blockHash not implemented"); + case 9: return [2 /*return*/, this.fetch("proxy", { + action: "eth_getTransactionByHash", + txhash: params.transactionHash + })]; + case 10: return [2 /*return*/, this.fetch("proxy", { + action: "eth_getTransactionReceipt", + txhash: params.transactionHash + })]; + case 11: + if (params.blockTag !== "latest") { + throw new Error("EtherscanProvider does not support blockTag for call"); + } + postData = getTransactionPostData(params.transaction); + postData.module = "proxy"; + postData.action = "eth_call"; + _c.label = 12; + case 12: + _c.trys.push([12, 14, , 15]); + return [4 /*yield*/, this.fetch("proxy", postData, true)]; + case 13: return [2 /*return*/, _c.sent()]; + case 14: + error_1 = _c.sent(); + return [2 /*return*/, checkError("call", error_1, params.transaction)]; + case 15: + postData = getTransactionPostData(params.transaction); + postData.module = "proxy"; + postData.action = "eth_estimateGas"; + _c.label = 16; + case 16: + _c.trys.push([16, 18, , 19]); + return [4 /*yield*/, this.fetch("proxy", postData, true)]; + case 17: return [2 /*return*/, _c.sent()]; + case 18: + error_2 = _c.sent(); + return [2 /*return*/, checkError("estimateGas", error_2, params.transaction)]; + case 19: + args = { action: "getLogs" }; + if (params.filter.fromBlock) { + args.fromBlock = checkLogTag(params.filter.fromBlock); + } + if (params.filter.toBlock) { + args.toBlock = checkLogTag(params.filter.toBlock); + } + if (params.filter.address) { + args.address = params.filter.address; + } + // @TODO: We can handle slightly more complicated logs using the logs API + if (params.filter.topics && params.filter.topics.length > 0) { + if (params.filter.topics.length > 1) { + logger.throwError("unsupported topic count", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { topics: params.filter.topics }); + } + if (params.filter.topics.length === 1) { + topic0 = params.filter.topics[0]; + if (typeof (topic0) !== "string" || topic0.length !== 66) { + logger.throwError("unsupported topic format", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { topic0: topic0 }); + } + args.topic0 = topic0; + } + } + return [4 /*yield*/, this.fetch("logs", args)]; + case 20: + logs = _c.sent(); + blocks = {}; + i = 0; + _c.label = 21; + case 21: + if (!(i < logs.length)) return [3 /*break*/, 25]; + log = logs[i]; + if (log.blockHash != null) { + return [3 /*break*/, 24]; + } + if (!(blocks[log.blockNumber] == null)) return [3 /*break*/, 23]; + return [4 /*yield*/, this.getBlock(log.blockNumber)]; + case 22: + block = _c.sent(); + if (block) { + blocks[log.blockNumber] = block.hash; + } + _c.label = 23; + case 23: + log.blockHash = blocks[log.blockNumber]; + _c.label = 24; + case 24: + i++; + return [3 /*break*/, 21]; + case 25: return [2 /*return*/, logs]; + case 26: + if (this.network.name !== "homestead") { + return [2 /*return*/, 0.0]; + } + _b = parseFloat; + return [4 /*yield*/, this.fetch("stats", { action: "ethprice" })]; + case 27: return [2 /*return*/, _b.apply(void 0, [(_c.sent()).ethusd])]; + case 28: return [3 /*break*/, 29]; + case 29: return [2 /*return*/, _super.prototype.perform.call(this, method, params)]; + } + }); + }); + }; + // Note: The `page` page parameter only allows pagination within the + // 10,000 window abailable without a page and offset parameter + // Error: Result window is too large, PageNo x Offset size must + // be less than or equal to 10000 + EtherscanProvider.prototype.getHistory = function (addressOrName, startBlock, endBlock) { + return __awaiter(this, void 0, void 0, function () { + var params, result; + var _a; + var _this = this; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + _a = { + action: "txlist" + }; + return [4 /*yield*/, this.resolveName(addressOrName)]; + case 1: + params = (_a.address = (_b.sent()), + _a.startblock = ((startBlock == null) ? 0 : startBlock), + _a.endblock = ((endBlock == null) ? 99999999 : endBlock), + _a.sort = "asc", + _a); + return [4 /*yield*/, this.fetch("account", params)]; + case 2: + result = _b.sent(); + return [2 /*return*/, result.map(function (tx) { + ["contractAddress", "to"].forEach(function (key) { + if (tx[key] == "") { + delete tx[key]; + } + }); + if (tx.creates == null && tx.contractAddress != null) { + tx.creates = tx.contractAddress; + } + var item = _this.formatter.transactionResponse(tx); + if (tx.timeStamp) { + item.timestamp = parseInt(tx.timeStamp); + } + return item; + })]; + } + }); + }); + }; + EtherscanProvider.prototype.isCommunityResource = function () { + return (this.apiKey === defaultApiKey); + }; + return EtherscanProvider; +}(base_provider_1.BaseProvider)); +exports.EtherscanProvider = EtherscanProvider; + +},{"./_version":64,"./base-provider":66,"./formatter":72,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/transactions":102,"@ethersproject/web":109}],71:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FallbackProvider = void 0; +var abstract_provider_1 = require("@ethersproject/abstract-provider"); +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var properties_1 = require("@ethersproject/properties"); +var random_1 = require("@ethersproject/random"); +var web_1 = require("@ethersproject/web"); +var base_provider_1 = require("./base-provider"); +var formatter_1 = require("./formatter"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +function now() { return (new Date()).getTime(); } +// Returns to network as long as all agree, or null if any is null. +// Throws an error if any two networks do not match. +function checkNetworks(networks) { + var result = null; + for (var i = 0; i < networks.length; i++) { + var network = networks[i]; + // Null! We do not know our network; bail. + if (network == null) { + return null; + } + if (result) { + // Make sure the network matches the previous networks + if (!(result.name === network.name && result.chainId === network.chainId && + ((result.ensAddress === network.ensAddress) || (result.ensAddress == null && network.ensAddress == null)))) { + logger.throwArgumentError("provider mismatch", "networks", networks); + } + } + else { + result = network; + } + } + return result; +} +function median(values, maxDelta) { + values = values.slice().sort(); + var middle = Math.floor(values.length / 2); + // Odd length; take the middle + if (values.length % 2) { + return values[middle]; + } + // Even length; take the average of the two middle + var a = values[middle - 1], b = values[middle]; + if (maxDelta != null && Math.abs(a - b) > maxDelta) { + return null; + } + return (a + b) / 2; +} +function serialize(value) { + if (value === null) { + return "null"; + } + else if (typeof (value) === "number" || typeof (value) === "boolean") { + return JSON.stringify(value); + } + else if (typeof (value) === "string") { + return value; + } + else if (bignumber_1.BigNumber.isBigNumber(value)) { + return value.toString(); + } + else if (Array.isArray(value)) { + return JSON.stringify(value.map(function (i) { return serialize(i); })); + } + else if (typeof (value) === "object") { + var keys = Object.keys(value); + keys.sort(); + return "{" + keys.map(function (key) { + var v = value[key]; + if (typeof (v) === "function") { + v = "[function]"; + } + else { + v = serialize(v); + } + return JSON.stringify(key) + ":" + v; + }).join(",") + "}"; + } + throw new Error("unknown value type: " + typeof (value)); +} +// Next request ID to use for emitting debug info +var nextRid = 1; +; +function stall(duration) { + var cancel = null; + var timer = null; + var promise = (new Promise(function (resolve) { + cancel = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + resolve(); + }; + timer = setTimeout(cancel, duration); + })); + var wait = function (func) { + promise = promise.then(func); + return promise; + }; + function getPromise() { + return promise; + } + return { cancel: cancel, getPromise: getPromise, wait: wait }; +} +var ForwardErrors = [ + logger_1.Logger.errors.CALL_EXCEPTION, + logger_1.Logger.errors.INSUFFICIENT_FUNDS, + logger_1.Logger.errors.NONCE_EXPIRED, + logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, + logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT +]; +var ForwardProperties = [ + "address", + "args", + "errorArgs", + "errorSignature", + "method", + "transaction", +]; +; +function exposeDebugConfig(config, now) { + var result = { + weight: config.weight + }; + Object.defineProperty(result, "provider", { get: function () { return config.provider; } }); + if (config.start) { + result.start = config.start; + } + if (now) { + result.duration = (now - config.start); + } + if (config.done) { + if (config.error) { + result.error = config.error; + } + else { + result.result = config.result || null; + } + } + return result; +} +function normalizedTally(normalize, quorum) { + return function (configs) { + // Count the votes for each result + var tally = {}; + configs.forEach(function (c) { + var value = normalize(c.result); + if (!tally[value]) { + tally[value] = { count: 0, result: c.result }; + } + tally[value].count++; + }); + // Check for a quorum on any given result + var keys = Object.keys(tally); + for (var i = 0; i < keys.length; i++) { + var check = tally[keys[i]]; + if (check.count >= quorum) { + return check.result; + } + } + // No quroum + return undefined; + }; +} +function getProcessFunc(provider, method, params) { + var normalize = serialize; + switch (method) { + case "getBlockNumber": + // Return the median value, unless there is (median + 1) is also + // present, in which case that is probably true and the median + // is going to be stale soon. In the event of a malicious node, + // the lie will be true soon enough. + return function (configs) { + var values = configs.map(function (c) { return c.result; }); + // Get the median block number + var blockNumber = median(configs.map(function (c) { return c.result; }), 2); + if (blockNumber == null) { + return undefined; + } + blockNumber = Math.ceil(blockNumber); + // If the next block height is present, its prolly safe to use + if (values.indexOf(blockNumber + 1) >= 0) { + blockNumber++; + } + // Don't ever roll back the blockNumber + if (blockNumber >= provider._highestBlockNumber) { + provider._highestBlockNumber = blockNumber; + } + return provider._highestBlockNumber; + }; + case "getGasPrice": + // Return the middle (round index up) value, similar to median + // but do not average even entries and choose the higher. + // Malicious actors must compromise 50% of the nodes to lie. + return function (configs) { + var values = configs.map(function (c) { return c.result; }); + values.sort(); + return values[Math.floor(values.length / 2)]; + }; + case "getEtherPrice": + // Returns the median price. Malicious actors must compromise at + // least 50% of the nodes to lie (in a meaningful way). + return function (configs) { + return median(configs.map(function (c) { return c.result; })); + }; + // No additional normalizing required; serialize is enough + case "getBalance": + case "getTransactionCount": + case "getCode": + case "getStorageAt": + case "call": + case "estimateGas": + case "getLogs": + break; + // We drop the confirmations from transactions as it is approximate + case "getTransaction": + case "getTransactionReceipt": + normalize = function (tx) { + if (tx == null) { + return null; + } + tx = properties_1.shallowCopy(tx); + tx.confirmations = -1; + return serialize(tx); + }; + break; + // We drop the confirmations from transactions as it is approximate + case "getBlock": + // We drop the confirmations from transactions as it is approximate + if (params.includeTransactions) { + normalize = function (block) { + if (block == null) { + return null; + } + block = properties_1.shallowCopy(block); + block.transactions = block.transactions.map(function (tx) { + tx = properties_1.shallowCopy(tx); + tx.confirmations = -1; + return tx; + }); + return serialize(block); + }; + } + else { + normalize = function (block) { + if (block == null) { + return null; + } + return serialize(block); + }; + } + break; + default: + throw new Error("unknown method: " + method); + } + // Return the result if and only if the expected quorum is + // satisfied and agreed upon for the final result. + return normalizedTally(normalize, provider.quorum); +} +// If we are doing a blockTag query, we need to make sure the backend is +// caught up to the FallbackProvider, before sending a request to it. +function waitForSync(config, blockNumber) { + return __awaiter(this, void 0, void 0, function () { + var provider; + return __generator(this, function (_a) { + provider = (config.provider); + if ((provider.blockNumber != null && provider.blockNumber >= blockNumber) || blockNumber === -1) { + return [2 /*return*/, provider]; + } + return [2 /*return*/, web_1.poll(function () { + return new Promise(function (resolve, reject) { + setTimeout(function () { + // We are synced + if (provider.blockNumber >= blockNumber) { + return resolve(provider); + } + // We're done; just quit + if (config.cancelled) { + return resolve(null); + } + // Try again, next block + return resolve(undefined); + }, 0); + }); + }, { oncePoll: provider })]; + }); + }); +} +function getRunner(config, currentBlockNumber, method, params) { + return __awaiter(this, void 0, void 0, function () { + var provider, _a, filter; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + provider = config.provider; + _a = method; + switch (_a) { + case "getBlockNumber": return [3 /*break*/, 1]; + case "getGasPrice": return [3 /*break*/, 1]; + case "getEtherPrice": return [3 /*break*/, 2]; + case "getBalance": return [3 /*break*/, 3]; + case "getTransactionCount": return [3 /*break*/, 3]; + case "getCode": return [3 /*break*/, 3]; + case "getStorageAt": return [3 /*break*/, 6]; + case "getBlock": return [3 /*break*/, 9]; + case "call": return [3 /*break*/, 12]; + case "estimateGas": return [3 /*break*/, 12]; + case "getTransaction": return [3 /*break*/, 15]; + case "getTransactionReceipt": return [3 /*break*/, 15]; + case "getLogs": return [3 /*break*/, 16]; + } + return [3 /*break*/, 19]; + case 1: return [2 /*return*/, provider[method]()]; + case 2: + if (provider.getEtherPrice) { + return [2 /*return*/, provider.getEtherPrice()]; + } + return [3 /*break*/, 19]; + case 3: + if (!(params.blockTag && bytes_1.isHexString(params.blockTag))) return [3 /*break*/, 5]; + return [4 /*yield*/, waitForSync(config, currentBlockNumber)]; + case 4: + provider = _b.sent(); + _b.label = 5; + case 5: return [2 /*return*/, provider[method](params.address, params.blockTag || "latest")]; + case 6: + if (!(params.blockTag && bytes_1.isHexString(params.blockTag))) return [3 /*break*/, 8]; + return [4 /*yield*/, waitForSync(config, currentBlockNumber)]; + case 7: + provider = _b.sent(); + _b.label = 8; + case 8: return [2 /*return*/, provider.getStorageAt(params.address, params.position, params.blockTag || "latest")]; + case 9: + if (!(params.blockTag && bytes_1.isHexString(params.blockTag))) return [3 /*break*/, 11]; + return [4 /*yield*/, waitForSync(config, currentBlockNumber)]; + case 10: + provider = _b.sent(); + _b.label = 11; + case 11: return [2 /*return*/, provider[(params.includeTransactions ? "getBlockWithTransactions" : "getBlock")](params.blockTag || params.blockHash)]; + case 12: + if (!(params.blockTag && bytes_1.isHexString(params.blockTag))) return [3 /*break*/, 14]; + return [4 /*yield*/, waitForSync(config, currentBlockNumber)]; + case 13: + provider = _b.sent(); + _b.label = 14; + case 14: return [2 /*return*/, provider[method](params.transaction)]; + case 15: return [2 /*return*/, provider[method](params.transactionHash)]; + case 16: + filter = params.filter; + if (!((filter.fromBlock && bytes_1.isHexString(filter.fromBlock)) || (filter.toBlock && bytes_1.isHexString(filter.toBlock)))) return [3 /*break*/, 18]; + return [4 /*yield*/, waitForSync(config, currentBlockNumber)]; + case 17: + provider = _b.sent(); + _b.label = 18; + case 18: return [2 /*return*/, provider.getLogs(filter)]; + case 19: return [2 /*return*/, logger.throwError("unknown method error", logger_1.Logger.errors.UNKNOWN_ERROR, { + method: method, + params: params + })]; + } + }); + }); +} +var FallbackProvider = /** @class */ (function (_super) { + __extends(FallbackProvider, _super); + function FallbackProvider(providers, quorum) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, FallbackProvider); + if (providers.length === 0) { + logger.throwArgumentError("missing providers", "providers", providers); + } + var providerConfigs = providers.map(function (configOrProvider, index) { + if (abstract_provider_1.Provider.isProvider(configOrProvider)) { + var stallTimeout = formatter_1.isCommunityResource(configOrProvider) ? 2000 : 750; + var priority = 1; + return Object.freeze({ provider: configOrProvider, weight: 1, stallTimeout: stallTimeout, priority: priority }); + } + var config = properties_1.shallowCopy(configOrProvider); + if (config.priority == null) { + config.priority = 1; + } + if (config.stallTimeout == null) { + config.stallTimeout = formatter_1.isCommunityResource(configOrProvider) ? 2000 : 750; + } + if (config.weight == null) { + config.weight = 1; + } + var weight = config.weight; + if (weight % 1 || weight > 512 || weight < 1) { + logger.throwArgumentError("invalid weight; must be integer in [1, 512]", "providers[" + index + "].weight", weight); + } + return Object.freeze(config); + }); + var total = providerConfigs.reduce(function (accum, c) { return (accum + c.weight); }, 0); + if (quorum == null) { + quorum = total / 2; + } + else if (quorum > total) { + logger.throwArgumentError("quorum will always fail; larger than total weight", "quorum", quorum); + } + // Are all providers' networks are known + var networkOrReady = checkNetworks(providerConfigs.map(function (c) { return (c.provider).network; })); + // Not all networks are known; we must stall + if (networkOrReady == null) { + networkOrReady = new Promise(function (resolve, reject) { + setTimeout(function () { + _this.detectNetwork().then(resolve, reject); + }, 0); + }); + } + _this = _super.call(this, networkOrReady) || this; + // Preserve a copy, so we do not get mutated + properties_1.defineReadOnly(_this, "providerConfigs", Object.freeze(providerConfigs)); + properties_1.defineReadOnly(_this, "quorum", quorum); + _this._highestBlockNumber = -1; + return _this; + } + FallbackProvider.prototype.detectNetwork = function () { + return __awaiter(this, void 0, void 0, function () { + var networks; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, Promise.all(this.providerConfigs.map(function (c) { return c.provider.getNetwork(); }))]; + case 1: + networks = _a.sent(); + return [2 /*return*/, checkNetworks(networks)]; + } + }); + }); + }; + FallbackProvider.prototype.perform = function (method, params) { + return __awaiter(this, void 0, void 0, function () { + var results, i_1, result, processFunc, configs, currentBlockNumber, i, first, _loop_1, this_1, state_1; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(method === "sendTransaction")) return [3 /*break*/, 2]; + return [4 /*yield*/, Promise.all(this.providerConfigs.map(function (c) { + return c.provider.sendTransaction(params.signedTransaction).then(function (result) { + return result.hash; + }, function (error) { + return error; + }); + }))]; + case 1: + results = _a.sent(); + // Any success is good enough (other errors are likely "already seen" errors + for (i_1 = 0; i_1 < results.length; i_1++) { + result = results[i_1]; + if (typeof (result) === "string") { + return [2 /*return*/, result]; + } + } + // They were all an error; pick the first error + throw results[0]; + case 2: + if (!(this._highestBlockNumber === -1 && method !== "getBlockNumber")) return [3 /*break*/, 4]; + return [4 /*yield*/, this.getBlockNumber()]; + case 3: + _a.sent(); + _a.label = 4; + case 4: + processFunc = getProcessFunc(this, method, params); + configs = random_1.shuffled(this.providerConfigs.map(properties_1.shallowCopy)); + configs.sort(function (a, b) { return (a.priority - b.priority); }); + currentBlockNumber = this._highestBlockNumber; + i = 0; + first = true; + _loop_1 = function () { + var t0, inflightWeight, _loop_2, waiting, results, result, errors; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + t0 = now(); + inflightWeight = configs.filter(function (c) { return (c.runner && ((t0 - c.start) < c.stallTimeout)); }) + .reduce(function (accum, c) { return (accum + c.weight); }, 0); + _loop_2 = function () { + var config = configs[i++]; + var rid = nextRid++; + config.start = now(); + config.staller = stall(config.stallTimeout); + config.staller.wait(function () { config.staller = null; }); + config.runner = getRunner(config, currentBlockNumber, method, params).then(function (result) { + config.done = true; + config.result = result; + if (_this.listenerCount("debug")) { + _this.emit("debug", { + action: "request", + rid: rid, + backend: exposeDebugConfig(config, now()), + request: { method: method, params: properties_1.deepCopy(params) }, + provider: _this + }); + } + }, function (error) { + config.done = true; + config.error = error; + if (_this.listenerCount("debug")) { + _this.emit("debug", { + action: "request", + rid: rid, + backend: exposeDebugConfig(config, now()), + request: { method: method, params: properties_1.deepCopy(params) }, + provider: _this + }); + } + }); + if (this_1.listenerCount("debug")) { + this_1.emit("debug", { + action: "request", + rid: rid, + backend: exposeDebugConfig(config, null), + request: { method: method, params: properties_1.deepCopy(params) }, + provider: this_1 + }); + } + inflightWeight += config.weight; + }; + // Start running enough to meet quorum + while (inflightWeight < this_1.quorum && i < configs.length) { + _loop_2(); + } + waiting = []; + configs.forEach(function (c) { + if (c.done || !c.runner) { + return; + } + waiting.push(c.runner); + if (c.staller) { + waiting.push(c.staller.getPromise()); + } + }); + if (!waiting.length) return [3 /*break*/, 2]; + return [4 /*yield*/, Promise.race(waiting)]; + case 1: + _b.sent(); + _b.label = 2; + case 2: + results = configs.filter(function (c) { return (c.done && c.error == null); }); + if (!(results.length >= this_1.quorum)) return [3 /*break*/, 5]; + result = processFunc(results); + if (result !== undefined) { + // Shut down any stallers + configs.forEach(function (c) { + if (c.staller) { + c.staller.cancel(); + } + c.cancelled = true; + }); + return [2 /*return*/, { value: result }]; + } + if (!!first) return [3 /*break*/, 4]; + return [4 /*yield*/, stall(100).getPromise()]; + case 3: + _b.sent(); + _b.label = 4; + case 4: + first = false; + _b.label = 5; + case 5: + errors = configs.reduce(function (accum, c) { + if (!c.done || c.error == null) { + return accum; + } + var code = (c.error).code; + if (ForwardErrors.indexOf(code) >= 0) { + if (!accum[code]) { + accum[code] = { error: c.error, weight: 0 }; + } + accum[code].weight += c.weight; + } + return accum; + }, ({})); + Object.keys(errors).forEach(function (errorCode) { + var tally = errors[errorCode]; + if (tally.weight < _this.quorum) { + return; + } + // Shut down any stallers + configs.forEach(function (c) { + if (c.staller) { + c.staller.cancel(); + } + c.cancelled = true; + }); + var e = (tally.error); + var props = {}; + ForwardProperties.forEach(function (name) { + if (e[name] == null) { + return; + } + props[name] = e[name]; + }); + logger.throwError(e.reason || e.message, errorCode, props); + }); + // All configs have run to completion; we will never get more data + if (configs.filter(function (c) { return !c.done; }).length === 0) { + return [2 /*return*/, "break"]; + } + return [2 /*return*/]; + } + }); + }; + this_1 = this; + _a.label = 5; + case 5: + if (!true) return [3 /*break*/, 7]; + return [5 /*yield**/, _loop_1()]; + case 6: + state_1 = _a.sent(); + if (typeof state_1 === "object") + return [2 /*return*/, state_1.value]; + if (state_1 === "break") + return [3 /*break*/, 7]; + return [3 /*break*/, 5]; + case 7: + // Shut down any stallers; shouldn't be any + configs.forEach(function (c) { + if (c.staller) { + c.staller.cancel(); + } + c.cancelled = true; + }); + return [2 /*return*/, logger.throwError("failed to meet quorum", logger_1.Logger.errors.SERVER_ERROR, { + method: method, + params: params, + //results: configs.map((c) => c.result), + //errors: configs.map((c) => c.error), + results: configs.map(function (c) { return exposeDebugConfig(c); }), + provider: this + })]; + } + }); + }); + }; + return FallbackProvider; +}(base_provider_1.BaseProvider)); +exports.FallbackProvider = FallbackProvider; + +},{"./_version":64,"./base-provider":66,"./formatter":72,"@ethersproject/abstract-provider":20,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/random":84,"@ethersproject/web":109}],72:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.showThrottleMessage = exports.isCommunityResource = exports.isCommunityResourcable = exports.Formatter = void 0; +var address_1 = require("@ethersproject/address"); +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var constants_1 = require("@ethersproject/constants"); +var properties_1 = require("@ethersproject/properties"); +var transactions_1 = require("@ethersproject/transactions"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var Formatter = /** @class */ (function () { + function Formatter() { + var _newTarget = this.constructor; + logger.checkNew(_newTarget, Formatter); + this.formats = this.getDefaultFormats(); + } + Formatter.prototype.getDefaultFormats = function () { + var _this = this; + var formats = ({}); + var address = this.address.bind(this); + var bigNumber = this.bigNumber.bind(this); + var blockTag = this.blockTag.bind(this); + var data = this.data.bind(this); + var hash = this.hash.bind(this); + var hex = this.hex.bind(this); + var number = this.number.bind(this); + var type = this.type.bind(this); + var strictData = function (v) { return _this.data(v, true); }; + formats.transaction = { + hash: hash, + type: type, + accessList: Formatter.allowNull(this.accessList.bind(this), null), + blockHash: Formatter.allowNull(hash, null), + blockNumber: Formatter.allowNull(number, null), + transactionIndex: Formatter.allowNull(number, null), + confirmations: Formatter.allowNull(number, null), + from: address, + // either (gasPrice) or (maxPriorityFeePerGas + maxFeePerGas) + // must be set + gasPrice: Formatter.allowNull(bigNumber), + maxPriorityFeePerGas: Formatter.allowNull(bigNumber), + maxFeePerGas: Formatter.allowNull(bigNumber), + gasLimit: bigNumber, + to: Formatter.allowNull(address, null), + value: bigNumber, + nonce: number, + data: data, + r: Formatter.allowNull(this.uint256), + s: Formatter.allowNull(this.uint256), + v: Formatter.allowNull(number), + creates: Formatter.allowNull(address, null), + raw: Formatter.allowNull(data), + }; + formats.transactionRequest = { + from: Formatter.allowNull(address), + nonce: Formatter.allowNull(number), + gasLimit: Formatter.allowNull(bigNumber), + gasPrice: Formatter.allowNull(bigNumber), + maxPriorityFeePerGas: Formatter.allowNull(bigNumber), + maxFeePerGas: Formatter.allowNull(bigNumber), + to: Formatter.allowNull(address), + value: Formatter.allowNull(bigNumber), + data: Formatter.allowNull(strictData), + type: Formatter.allowNull(number), + accessList: Formatter.allowNull(this.accessList.bind(this), null), + }; + formats.receiptLog = { + transactionIndex: number, + blockNumber: number, + transactionHash: hash, + address: address, + topics: Formatter.arrayOf(hash), + data: data, + logIndex: number, + blockHash: hash, + }; + formats.receipt = { + to: Formatter.allowNull(this.address, null), + from: Formatter.allowNull(this.address, null), + contractAddress: Formatter.allowNull(address, null), + transactionIndex: number, + // should be allowNull(hash), but broken-EIP-658 support is handled in receipt + root: Formatter.allowNull(hex), + gasUsed: bigNumber, + logsBloom: Formatter.allowNull(data), + blockHash: hash, + transactionHash: hash, + logs: Formatter.arrayOf(this.receiptLog.bind(this)), + blockNumber: number, + confirmations: Formatter.allowNull(number, null), + cumulativeGasUsed: bigNumber, + effectiveGasPrice: Formatter.allowNull(bigNumber), + status: Formatter.allowNull(number), + type: type + }; + formats.block = { + hash: hash, + parentHash: hash, + number: number, + timestamp: number, + nonce: Formatter.allowNull(hex), + difficulty: this.difficulty.bind(this), + gasLimit: bigNumber, + gasUsed: bigNumber, + miner: address, + extraData: data, + transactions: Formatter.allowNull(Formatter.arrayOf(hash)), + baseFeePerGas: Formatter.allowNull(bigNumber) + }; + formats.blockWithTransactions = properties_1.shallowCopy(formats.block); + formats.blockWithTransactions.transactions = Formatter.allowNull(Formatter.arrayOf(this.transactionResponse.bind(this))); + formats.filter = { + fromBlock: Formatter.allowNull(blockTag, undefined), + toBlock: Formatter.allowNull(blockTag, undefined), + blockHash: Formatter.allowNull(hash, undefined), + address: Formatter.allowNull(address, undefined), + topics: Formatter.allowNull(this.topics.bind(this), undefined), + }; + formats.filterLog = { + blockNumber: Formatter.allowNull(number), + blockHash: Formatter.allowNull(hash), + transactionIndex: number, + removed: Formatter.allowNull(this.boolean.bind(this)), + address: address, + data: Formatter.allowFalsish(data, "0x"), + topics: Formatter.arrayOf(hash), + transactionHash: hash, + logIndex: number, + }; + return formats; + }; + Formatter.prototype.accessList = function (accessList) { + return transactions_1.accessListify(accessList || []); + }; + // Requires a BigNumberish that is within the IEEE754 safe integer range; returns a number + // Strict! Used on input. + Formatter.prototype.number = function (number) { + if (number === "0x") { + return 0; + } + return bignumber_1.BigNumber.from(number).toNumber(); + }; + Formatter.prototype.type = function (number) { + if (number === "0x" || number == null) { + return 0; + } + return bignumber_1.BigNumber.from(number).toNumber(); + }; + // Strict! Used on input. + Formatter.prototype.bigNumber = function (value) { + return bignumber_1.BigNumber.from(value); + }; + // Requires a boolean, "true" or "false"; returns a boolean + Formatter.prototype.boolean = function (value) { + if (typeof (value) === "boolean") { + return value; + } + if (typeof (value) === "string") { + value = value.toLowerCase(); + if (value === "true") { + return true; + } + if (value === "false") { + return false; + } + } + throw new Error("invalid boolean - " + value); + }; + Formatter.prototype.hex = function (value, strict) { + if (typeof (value) === "string") { + if (!strict && value.substring(0, 2) !== "0x") { + value = "0x" + value; + } + if (bytes_1.isHexString(value)) { + return value.toLowerCase(); + } + } + return logger.throwArgumentError("invalid hash", "value", value); + }; + Formatter.prototype.data = function (value, strict) { + var result = this.hex(value, strict); + if ((result.length % 2) !== 0) { + throw new Error("invalid data; odd-length - " + value); + } + return result; + }; + // Requires an address + // Strict! Used on input. + Formatter.prototype.address = function (value) { + return address_1.getAddress(value); + }; + Formatter.prototype.callAddress = function (value) { + if (!bytes_1.isHexString(value, 32)) { + return null; + } + var address = address_1.getAddress(bytes_1.hexDataSlice(value, 12)); + return (address === constants_1.AddressZero) ? null : address; + }; + Formatter.prototype.contractAddress = function (value) { + return address_1.getContractAddress(value); + }; + // Strict! Used on input. + Formatter.prototype.blockTag = function (blockTag) { + if (blockTag == null) { + return "latest"; + } + if (blockTag === "earliest") { + return "0x0"; + } + if (blockTag === "latest" || blockTag === "pending") { + return blockTag; + } + if (typeof (blockTag) === "number" || bytes_1.isHexString(blockTag)) { + return bytes_1.hexValue(blockTag); + } + throw new Error("invalid blockTag"); + }; + // Requires a hash, optionally requires 0x prefix; returns prefixed lowercase hash. + Formatter.prototype.hash = function (value, strict) { + var result = this.hex(value, strict); + if (bytes_1.hexDataLength(result) !== 32) { + return logger.throwArgumentError("invalid hash", "value", value); + } + return result; + }; + // Returns the difficulty as a number, or if too large (i.e. PoA network) null + Formatter.prototype.difficulty = function (value) { + if (value == null) { + return null; + } + var v = bignumber_1.BigNumber.from(value); + try { + return v.toNumber(); + } + catch (error) { } + return null; + }; + Formatter.prototype.uint256 = function (value) { + if (!bytes_1.isHexString(value)) { + throw new Error("invalid uint256"); + } + return bytes_1.hexZeroPad(value, 32); + }; + Formatter.prototype._block = function (value, format) { + if (value.author != null && value.miner == null) { + value.miner = value.author; + } + return Formatter.check(format, value); + }; + Formatter.prototype.block = function (value) { + return this._block(value, this.formats.block); + }; + Formatter.prototype.blockWithTransactions = function (value) { + return this._block(value, this.formats.blockWithTransactions); + }; + // Strict! Used on input. + Formatter.prototype.transactionRequest = function (value) { + return Formatter.check(this.formats.transactionRequest, value); + }; + Formatter.prototype.transactionResponse = function (transaction) { + // Rename gas to gasLimit + if (transaction.gas != null && transaction.gasLimit == null) { + transaction.gasLimit = transaction.gas; + } + // Some clients (TestRPC) do strange things like return 0x0 for the + // 0 address; correct this to be a real address + if (transaction.to && bignumber_1.BigNumber.from(transaction.to).isZero()) { + transaction.to = "0x0000000000000000000000000000000000000000"; + } + // Rename input to data + if (transaction.input != null && transaction.data == null) { + transaction.data = transaction.input; + } + // If to and creates are empty, populate the creates from the transaction + if (transaction.to == null && transaction.creates == null) { + transaction.creates = this.contractAddress(transaction); + } + if (transaction.type === 1 && transaction.accessList == null) { + transaction.accessList = []; + } + var result = Formatter.check(this.formats.transaction, transaction); + if (transaction.chainId != null) { + var chainId = transaction.chainId; + if (bytes_1.isHexString(chainId)) { + chainId = bignumber_1.BigNumber.from(chainId).toNumber(); + } + result.chainId = chainId; + } + else { + var chainId = transaction.networkId; + // geth-etc returns chainId + if (chainId == null && result.v == null) { + chainId = transaction.chainId; + } + if (bytes_1.isHexString(chainId)) { + chainId = bignumber_1.BigNumber.from(chainId).toNumber(); + } + if (typeof (chainId) !== "number" && result.v != null) { + chainId = (result.v - 35) / 2; + if (chainId < 0) { + chainId = 0; + } + chainId = parseInt(chainId); + } + if (typeof (chainId) !== "number") { + chainId = 0; + } + result.chainId = chainId; + } + // 0x0000... should actually be null + if (result.blockHash && result.blockHash.replace(/0/g, "") === "x") { + result.blockHash = null; + } + return result; + }; + Formatter.prototype.transaction = function (value) { + return transactions_1.parse(value); + }; + Formatter.prototype.receiptLog = function (value) { + return Formatter.check(this.formats.receiptLog, value); + }; + Formatter.prototype.receipt = function (value) { + var result = Formatter.check(this.formats.receipt, value); + // RSK incorrectly implemented EIP-658, so we munge things a bit here for it + if (result.root != null) { + if (result.root.length <= 4) { + // Could be 0x00, 0x0, 0x01 or 0x1 + var value_1 = bignumber_1.BigNumber.from(result.root).toNumber(); + if (value_1 === 0 || value_1 === 1) { + // Make sure if both are specified, they match + if (result.status != null && (result.status !== value_1)) { + logger.throwArgumentError("alt-root-status/status mismatch", "value", { root: result.root, status: result.status }); + } + result.status = value_1; + delete result.root; + } + else { + logger.throwArgumentError("invalid alt-root-status", "value.root", result.root); + } + } + else if (result.root.length !== 66) { + // Must be a valid bytes32 + logger.throwArgumentError("invalid root hash", "value.root", result.root); + } + } + if (result.status != null) { + result.byzantium = true; + } + return result; + }; + Formatter.prototype.topics = function (value) { + var _this = this; + if (Array.isArray(value)) { + return value.map(function (v) { return _this.topics(v); }); + } + else if (value != null) { + return this.hash(value, true); + } + return null; + }; + Formatter.prototype.filter = function (value) { + return Formatter.check(this.formats.filter, value); + }; + Formatter.prototype.filterLog = function (value) { + return Formatter.check(this.formats.filterLog, value); + }; + Formatter.check = function (format, object) { + var result = {}; + for (var key in format) { + try { + var value = format[key](object[key]); + if (value !== undefined) { + result[key] = value; + } + } + catch (error) { + error.checkKey = key; + error.checkValue = object[key]; + throw error; + } + } + return result; + }; + // if value is null-ish, nullValue is returned + Formatter.allowNull = function (format, nullValue) { + return (function (value) { + if (value == null) { + return nullValue; + } + return format(value); + }); + }; + // If value is false-ish, replaceValue is returned + Formatter.allowFalsish = function (format, replaceValue) { + return (function (value) { + if (!value) { + return replaceValue; + } + return format(value); + }); + }; + // Requires an Array satisfying check + Formatter.arrayOf = function (format) { + return (function (array) { + if (!Array.isArray(array)) { + throw new Error("not an array"); + } + var result = []; + array.forEach(function (value) { + result.push(format(value)); + }); + return result; + }); + }; + return Formatter; +}()); +exports.Formatter = Formatter; +function isCommunityResourcable(value) { + return (value && typeof (value.isCommunityResource) === "function"); +} +exports.isCommunityResourcable = isCommunityResourcable; +function isCommunityResource(value) { + return (isCommunityResourcable(value) && value.isCommunityResource()); +} +exports.isCommunityResource = isCommunityResource; +// Show the throttle message only once +var throttleMessage = false; +function showThrottleMessage() { + if (throttleMessage) { + return; + } + throttleMessage = true; + console.log("========= NOTICE ========="); + console.log("Request-Rate Exceeded (this message will not be repeated)"); + console.log(""); + console.log("The default API keys for each service are provided as a highly-throttled,"); + console.log("community resource for low-traffic projects and early prototyping."); + console.log(""); + console.log("While your application will continue to function, we highly recommended"); + console.log("signing up for your own API keys to improve performance, increase your"); + console.log("request rate/limit and enable other perks, such as metrics and advanced APIs."); + console.log(""); + console.log("For more details: https:/\/docs.ethers.io/api-keys/"); + console.log("=========================="); +} +exports.showThrottleMessage = showThrottleMessage; + +},{"./_version":64,"@ethersproject/address":24,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/constants":37,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/transactions":102}],73:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Formatter = exports.showThrottleMessage = exports.isCommunityResourcable = exports.isCommunityResource = exports.getNetwork = exports.getDefaultProvider = exports.JsonRpcSigner = exports.IpcProvider = exports.WebSocketProvider = exports.Web3Provider = exports.StaticJsonRpcProvider = exports.PocketProvider = exports.NodesmithProvider = exports.JsonRpcBatchProvider = exports.JsonRpcProvider = exports.InfuraWebSocketProvider = exports.InfuraProvider = exports.EtherscanProvider = exports.CloudflareProvider = exports.AlchemyWebSocketProvider = exports.AlchemyProvider = exports.FallbackProvider = exports.UrlJsonRpcProvider = exports.Resolver = exports.BaseProvider = exports.Provider = void 0; +var abstract_provider_1 = require("@ethersproject/abstract-provider"); +Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return abstract_provider_1.Provider; } }); +var networks_1 = require("@ethersproject/networks"); +Object.defineProperty(exports, "getNetwork", { enumerable: true, get: function () { return networks_1.getNetwork; } }); +var base_provider_1 = require("./base-provider"); +Object.defineProperty(exports, "BaseProvider", { enumerable: true, get: function () { return base_provider_1.BaseProvider; } }); +Object.defineProperty(exports, "Resolver", { enumerable: true, get: function () { return base_provider_1.Resolver; } }); +var alchemy_provider_1 = require("./alchemy-provider"); +Object.defineProperty(exports, "AlchemyProvider", { enumerable: true, get: function () { return alchemy_provider_1.AlchemyProvider; } }); +Object.defineProperty(exports, "AlchemyWebSocketProvider", { enumerable: true, get: function () { return alchemy_provider_1.AlchemyWebSocketProvider; } }); +var cloudflare_provider_1 = require("./cloudflare-provider"); +Object.defineProperty(exports, "CloudflareProvider", { enumerable: true, get: function () { return cloudflare_provider_1.CloudflareProvider; } }); +var etherscan_provider_1 = require("./etherscan-provider"); +Object.defineProperty(exports, "EtherscanProvider", { enumerable: true, get: function () { return etherscan_provider_1.EtherscanProvider; } }); +var fallback_provider_1 = require("./fallback-provider"); +Object.defineProperty(exports, "FallbackProvider", { enumerable: true, get: function () { return fallback_provider_1.FallbackProvider; } }); +var ipc_provider_1 = require("./ipc-provider"); +Object.defineProperty(exports, "IpcProvider", { enumerable: true, get: function () { return ipc_provider_1.IpcProvider; } }); +var infura_provider_1 = require("./infura-provider"); +Object.defineProperty(exports, "InfuraProvider", { enumerable: true, get: function () { return infura_provider_1.InfuraProvider; } }); +Object.defineProperty(exports, "InfuraWebSocketProvider", { enumerable: true, get: function () { return infura_provider_1.InfuraWebSocketProvider; } }); +var json_rpc_provider_1 = require("./json-rpc-provider"); +Object.defineProperty(exports, "JsonRpcProvider", { enumerable: true, get: function () { return json_rpc_provider_1.JsonRpcProvider; } }); +Object.defineProperty(exports, "JsonRpcSigner", { enumerable: true, get: function () { return json_rpc_provider_1.JsonRpcSigner; } }); +var json_rpc_batch_provider_1 = require("./json-rpc-batch-provider"); +Object.defineProperty(exports, "JsonRpcBatchProvider", { enumerable: true, get: function () { return json_rpc_batch_provider_1.JsonRpcBatchProvider; } }); +var nodesmith_provider_1 = require("./nodesmith-provider"); +Object.defineProperty(exports, "NodesmithProvider", { enumerable: true, get: function () { return nodesmith_provider_1.NodesmithProvider; } }); +var pocket_provider_1 = require("./pocket-provider"); +Object.defineProperty(exports, "PocketProvider", { enumerable: true, get: function () { return pocket_provider_1.PocketProvider; } }); +var url_json_rpc_provider_1 = require("./url-json-rpc-provider"); +Object.defineProperty(exports, "StaticJsonRpcProvider", { enumerable: true, get: function () { return url_json_rpc_provider_1.StaticJsonRpcProvider; } }); +Object.defineProperty(exports, "UrlJsonRpcProvider", { enumerable: true, get: function () { return url_json_rpc_provider_1.UrlJsonRpcProvider; } }); +var web3_provider_1 = require("./web3-provider"); +Object.defineProperty(exports, "Web3Provider", { enumerable: true, get: function () { return web3_provider_1.Web3Provider; } }); +var websocket_provider_1 = require("./websocket-provider"); +Object.defineProperty(exports, "WebSocketProvider", { enumerable: true, get: function () { return websocket_provider_1.WebSocketProvider; } }); +var formatter_1 = require("./formatter"); +Object.defineProperty(exports, "Formatter", { enumerable: true, get: function () { return formatter_1.Formatter; } }); +Object.defineProperty(exports, "isCommunityResourcable", { enumerable: true, get: function () { return formatter_1.isCommunityResourcable; } }); +Object.defineProperty(exports, "isCommunityResource", { enumerable: true, get: function () { return formatter_1.isCommunityResource; } }); +Object.defineProperty(exports, "showThrottleMessage", { enumerable: true, get: function () { return formatter_1.showThrottleMessage; } }); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +//////////////////////// +// Helper Functions +function getDefaultProvider(network, options) { + if (network == null) { + network = "homestead"; + } + // If passed a URL, figure out the right type of provider based on the scheme + if (typeof (network) === "string") { + // @TODO: Add support for IpcProvider; maybe if it ends in ".ipc"? + // Handle http and ws (and their secure variants) + var match = network.match(/^(ws|http)s?:/i); + if (match) { + switch (match[1]) { + case "http": + return new json_rpc_provider_1.JsonRpcProvider(network); + case "ws": + return new websocket_provider_1.WebSocketProvider(network); + default: + logger.throwArgumentError("unsupported URL scheme", "network", network); + } + } + } + var n = networks_1.getNetwork(network); + if (!n || !n._defaultProvider) { + logger.throwError("unsupported getDefaultProvider network", logger_1.Logger.errors.NETWORK_ERROR, { + operation: "getDefaultProvider", + network: network + }); + } + return n._defaultProvider({ + FallbackProvider: fallback_provider_1.FallbackProvider, + AlchemyProvider: alchemy_provider_1.AlchemyProvider, + CloudflareProvider: cloudflare_provider_1.CloudflareProvider, + EtherscanProvider: etherscan_provider_1.EtherscanProvider, + InfuraProvider: infura_provider_1.InfuraProvider, + JsonRpcProvider: json_rpc_provider_1.JsonRpcProvider, + NodesmithProvider: nodesmith_provider_1.NodesmithProvider, + PocketProvider: pocket_provider_1.PocketProvider, + Web3Provider: web3_provider_1.Web3Provider, + IpcProvider: ipc_provider_1.IpcProvider, + }, options); +} +exports.getDefaultProvider = getDefaultProvider; + +},{"./_version":64,"./alchemy-provider":65,"./base-provider":66,"./cloudflare-provider":69,"./etherscan-provider":70,"./fallback-provider":71,"./formatter":72,"./infura-provider":74,"./ipc-provider":67,"./json-rpc-batch-provider":75,"./json-rpc-provider":76,"./nodesmith-provider":77,"./pocket-provider":78,"./url-json-rpc-provider":79,"./web3-provider":80,"./websocket-provider":81,"@ethersproject/abstract-provider":20,"@ethersproject/logger":57,"@ethersproject/networks":59}],74:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InfuraProvider = exports.InfuraWebSocketProvider = void 0; +var properties_1 = require("@ethersproject/properties"); +var websocket_provider_1 = require("./websocket-provider"); +var formatter_1 = require("./formatter"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var url_json_rpc_provider_1 = require("./url-json-rpc-provider"); +var defaultProjectId = "84842078b09946638c03157f83405213"; +var InfuraWebSocketProvider = /** @class */ (function (_super) { + __extends(InfuraWebSocketProvider, _super); + function InfuraWebSocketProvider(network, apiKey) { + var _this = this; + var provider = new InfuraProvider(network, apiKey); + var connection = provider.connection; + if (connection.password) { + logger.throwError("INFURA WebSocket project secrets unsupported", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "InfuraProvider.getWebSocketProvider()" + }); + } + var url = connection.url.replace(/^http/i, "ws").replace("/v3/", "/ws/v3/"); + _this = _super.call(this, url, network) || this; + properties_1.defineReadOnly(_this, "apiKey", provider.projectId); + properties_1.defineReadOnly(_this, "projectId", provider.projectId); + properties_1.defineReadOnly(_this, "projectSecret", provider.projectSecret); + return _this; + } + InfuraWebSocketProvider.prototype.isCommunityResource = function () { + return (this.projectId === defaultProjectId); + }; + return InfuraWebSocketProvider; +}(websocket_provider_1.WebSocketProvider)); +exports.InfuraWebSocketProvider = InfuraWebSocketProvider; +var InfuraProvider = /** @class */ (function (_super) { + __extends(InfuraProvider, _super); + function InfuraProvider() { + return _super !== null && _super.apply(this, arguments) || this; + } + InfuraProvider.getWebSocketProvider = function (network, apiKey) { + return new InfuraWebSocketProvider(network, apiKey); + }; + InfuraProvider.getApiKey = function (apiKey) { + var apiKeyObj = { + apiKey: defaultProjectId, + projectId: defaultProjectId, + projectSecret: null + }; + if (apiKey == null) { + return apiKeyObj; + } + if (typeof (apiKey) === "string") { + apiKeyObj.projectId = apiKey; + } + else if (apiKey.projectSecret != null) { + logger.assertArgument((typeof (apiKey.projectId) === "string"), "projectSecret requires a projectId", "projectId", apiKey.projectId); + logger.assertArgument((typeof (apiKey.projectSecret) === "string"), "invalid projectSecret", "projectSecret", "[REDACTED]"); + apiKeyObj.projectId = apiKey.projectId; + apiKeyObj.projectSecret = apiKey.projectSecret; + } + else if (apiKey.projectId) { + apiKeyObj.projectId = apiKey.projectId; + } + apiKeyObj.apiKey = apiKeyObj.projectId; + return apiKeyObj; + }; + InfuraProvider.getUrl = function (network, apiKey) { + var host = null; + switch (network ? network.name : "unknown") { + case "homestead": + host = "mainnet.infura.io"; + break; + case "ropsten": + host = "ropsten.infura.io"; + break; + case "rinkeby": + host = "rinkeby.infura.io"; + break; + case "kovan": + host = "kovan.infura.io"; + break; + case "goerli": + host = "goerli.infura.io"; + break; + case "matic": + host = "polygon-mainnet.infura.io"; + break; + case "maticmum": + host = "polygon-mumbai.infura.io"; + break; + default: + logger.throwError("unsupported network", logger_1.Logger.errors.INVALID_ARGUMENT, { + argument: "network", + value: network + }); + } + var connection = { + allowGzip: true, + url: ("https:/" + "/" + host + "/v3/" + apiKey.projectId), + throttleCallback: function (attempt, url) { + if (apiKey.projectId === defaultProjectId) { + formatter_1.showThrottleMessage(); + } + return Promise.resolve(true); + } + }; + if (apiKey.projectSecret != null) { + connection.user = ""; + connection.password = apiKey.projectSecret; + } + return connection; + }; + InfuraProvider.prototype.isCommunityResource = function () { + return (this.projectId === defaultProjectId); + }; + return InfuraProvider; +}(url_json_rpc_provider_1.UrlJsonRpcProvider)); +exports.InfuraProvider = InfuraProvider; + +},{"./_version":64,"./formatter":72,"./url-json-rpc-provider":79,"./websocket-provider":81,"@ethersproject/logger":57,"@ethersproject/properties":63}],75:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonRpcBatchProvider = void 0; +var properties_1 = require("@ethersproject/properties"); +var web_1 = require("@ethersproject/web"); +var json_rpc_provider_1 = require("./json-rpc-provider"); +// Experimental +var JsonRpcBatchProvider = /** @class */ (function (_super) { + __extends(JsonRpcBatchProvider, _super); + function JsonRpcBatchProvider() { + return _super !== null && _super.apply(this, arguments) || this; + } + JsonRpcBatchProvider.prototype.send = function (method, params) { + var _this = this; + var request = { + method: method, + params: params, + id: (this._nextId++), + jsonrpc: "2.0" + }; + if (this._pendingBatch == null) { + this._pendingBatch = []; + } + var inflightRequest = { request: request, resolve: null, reject: null }; + var promise = new Promise(function (resolve, reject) { + inflightRequest.resolve = resolve; + inflightRequest.reject = reject; + }); + this._pendingBatch.push(inflightRequest); + if (!this._pendingBatchAggregator) { + // Schedule batch for next event loop + short duration + this._pendingBatchAggregator = setTimeout(function () { + // Get teh current batch and clear it, so new requests + // go into the next batch + var batch = _this._pendingBatch; + _this._pendingBatch = null; + _this._pendingBatchAggregator = null; + // Get the request as an array of requests + var request = batch.map(function (inflight) { return inflight.request; }); + _this.emit("debug", { + action: "requestBatch", + request: properties_1.deepCopy(request), + provider: _this + }); + return web_1.fetchJson(_this.connection, JSON.stringify(request)).then(function (result) { + _this.emit("debug", { + action: "response", + request: request, + response: result, + provider: _this + }); + // For each result, feed it to the correct Promise, depending + // on whether it was a success or error + batch.forEach(function (inflightRequest, index) { + var payload = result[index]; + if (payload.error) { + var error = new Error(payload.error.message); + error.code = payload.error.code; + error.data = payload.error.data; + inflightRequest.reject(error); + } + else { + inflightRequest.resolve(payload.result); + } + }); + }, function (error) { + _this.emit("debug", { + action: "response", + error: error, + request: request, + provider: _this + }); + batch.forEach(function (inflightRequest) { + inflightRequest.reject(error); + }); + }); + }, 10); + } + return promise; + }; + return JsonRpcBatchProvider; +}(json_rpc_provider_1.JsonRpcProvider)); +exports.JsonRpcBatchProvider = JsonRpcBatchProvider; + +},{"./json-rpc-provider":76,"@ethersproject/properties":63,"@ethersproject/web":109}],76:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonRpcProvider = exports.JsonRpcSigner = void 0; +var abstract_signer_1 = require("@ethersproject/abstract-signer"); +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var hash_1 = require("@ethersproject/hash"); +var properties_1 = require("@ethersproject/properties"); +var strings_1 = require("@ethersproject/strings"); +var transactions_1 = require("@ethersproject/transactions"); +var web_1 = require("@ethersproject/web"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var base_provider_1 = require("./base-provider"); +var errorGas = ["call", "estimateGas"]; +function checkError(method, error, params) { + // Undo the "convenience" some nodes are attempting to prevent backwards + // incompatibility; maybe for v6 consider forwarding reverts as errors + if (method === "call" && error.code === logger_1.Logger.errors.SERVER_ERROR) { + var e = error.error; + if (e && e.message.match("reverted") && bytes_1.isHexString(e.data)) { + return e.data; + } + logger.throwError("missing revert data in call exception", logger_1.Logger.errors.CALL_EXCEPTION, { + error: error, + data: "0x" + }); + } + var message = error.message; + if (error.code === logger_1.Logger.errors.SERVER_ERROR && error.error && typeof (error.error.message) === "string") { + message = error.error.message; + } + else if (typeof (error.body) === "string") { + message = error.body; + } + else if (typeof (error.responseText) === "string") { + message = error.responseText; + } + message = (message || "").toLowerCase(); + var transaction = params.transaction || params.signedTransaction; + // "insufficient funds for gas * price + value + cost(data)" + if (message.match(/insufficient funds|base fee exceeds gas limit/)) { + logger.throwError("insufficient funds for intrinsic transaction cost", logger_1.Logger.errors.INSUFFICIENT_FUNDS, { + error: error, method: method, transaction: transaction + }); + } + // "nonce too low" + if (message.match(/nonce too low/)) { + logger.throwError("nonce has already been used", logger_1.Logger.errors.NONCE_EXPIRED, { + error: error, method: method, transaction: transaction + }); + } + // "replacement transaction underpriced" + if (message.match(/replacement transaction underpriced/)) { + logger.throwError("replacement fee too low", logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, { + error: error, method: method, transaction: transaction + }); + } + // "replacement transaction underpriced" + if (message.match(/only replay-protected/)) { + logger.throwError("legacy pre-eip-155 transactions not supported", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + error: error, method: method, transaction: transaction + }); + } + if (errorGas.indexOf(method) >= 0 && message.match(/gas required exceeds allowance|always failing transaction|execution reverted/)) { + logger.throwError("cannot estimate gas; transaction may fail or may require manual gas limit", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, { + error: error, method: method, transaction: transaction + }); + } + throw error; +} +function timer(timeout) { + return new Promise(function (resolve) { + setTimeout(resolve, timeout); + }); +} +function getResult(payload) { + if (payload.error) { + // @TODO: not any + var error = new Error(payload.error.message); + error.code = payload.error.code; + error.data = payload.error.data; + throw error; + } + return payload.result; +} +function getLowerCase(value) { + if (value) { + return value.toLowerCase(); + } + return value; +} +var _constructorGuard = {}; +var JsonRpcSigner = /** @class */ (function (_super) { + __extends(JsonRpcSigner, _super); + function JsonRpcSigner(constructorGuard, provider, addressOrIndex) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, JsonRpcSigner); + _this = _super.call(this) || this; + if (constructorGuard !== _constructorGuard) { + throw new Error("do not call the JsonRpcSigner constructor directly; use provider.getSigner"); + } + properties_1.defineReadOnly(_this, "provider", provider); + if (addressOrIndex == null) { + addressOrIndex = 0; + } + if (typeof (addressOrIndex) === "string") { + properties_1.defineReadOnly(_this, "_address", _this.provider.formatter.address(addressOrIndex)); + properties_1.defineReadOnly(_this, "_index", null); + } + else if (typeof (addressOrIndex) === "number") { + properties_1.defineReadOnly(_this, "_index", addressOrIndex); + properties_1.defineReadOnly(_this, "_address", null); + } + else { + logger.throwArgumentError("invalid address or index", "addressOrIndex", addressOrIndex); + } + return _this; + } + JsonRpcSigner.prototype.connect = function (provider) { + return logger.throwError("cannot alter JSON-RPC Signer connection", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "connect" + }); + }; + JsonRpcSigner.prototype.connectUnchecked = function () { + return new UncheckedJsonRpcSigner(_constructorGuard, this.provider, this._address || this._index); + }; + JsonRpcSigner.prototype.getAddress = function () { + var _this = this; + if (this._address) { + return Promise.resolve(this._address); + } + return this.provider.send("eth_accounts", []).then(function (accounts) { + if (accounts.length <= _this._index) { + logger.throwError("unknown account #" + _this._index, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "getAddress" + }); + } + return _this.provider.formatter.address(accounts[_this._index]); + }); + }; + JsonRpcSigner.prototype.sendUncheckedTransaction = function (transaction) { + var _this = this; + transaction = properties_1.shallowCopy(transaction); + var fromAddress = this.getAddress().then(function (address) { + if (address) { + address = address.toLowerCase(); + } + return address; + }); + // The JSON-RPC for eth_sendTransaction uses 90000 gas; if the user + // wishes to use this, it is easy to specify explicitly, otherwise + // we look it up for them. + if (transaction.gasLimit == null) { + var estimate = properties_1.shallowCopy(transaction); + estimate.from = fromAddress; + transaction.gasLimit = this.provider.estimateGas(estimate); + } + if (transaction.to != null) { + transaction.to = Promise.resolve(transaction.to).then(function (to) { return __awaiter(_this, void 0, void 0, function () { + var address; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (to == null) { + return [2 /*return*/, null]; + } + return [4 /*yield*/, this.provider.resolveName(to)]; + case 1: + address = _a.sent(); + if (address == null) { + logger.throwArgumentError("provided ENS name resolves to null", "tx.to", to); + } + return [2 /*return*/, address]; + } + }); + }); }); + } + return properties_1.resolveProperties({ + tx: properties_1.resolveProperties(transaction), + sender: fromAddress + }).then(function (_a) { + var tx = _a.tx, sender = _a.sender; + if (tx.from != null) { + if (tx.from.toLowerCase() !== sender) { + logger.throwArgumentError("from address mismatch", "transaction", transaction); + } + } + else { + tx.from = sender; + } + var hexTx = _this.provider.constructor.hexlifyTransaction(tx, { from: true }); + return _this.provider.send("eth_sendTransaction", [hexTx]).then(function (hash) { + return hash; + }, function (error) { + return checkError("sendTransaction", error, hexTx); + }); + }); + }; + JsonRpcSigner.prototype.signTransaction = function (transaction) { + return logger.throwError("signing transactions is unsupported", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "signTransaction" + }); + }; + JsonRpcSigner.prototype.sendTransaction = function (transaction) { + return __awaiter(this, void 0, void 0, function () { + var blockNumber, hash, error_1; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.provider._getInternalBlockNumber(100 + 2 * this.provider.pollingInterval)]; + case 1: + blockNumber = _a.sent(); + return [4 /*yield*/, this.sendUncheckedTransaction(transaction)]; + case 2: + hash = _a.sent(); + _a.label = 3; + case 3: + _a.trys.push([3, 5, , 6]); + return [4 /*yield*/, web_1.poll(function () { return __awaiter(_this, void 0, void 0, function () { + var tx; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.provider.getTransaction(hash)]; + case 1: + tx = _a.sent(); + if (tx === null) { + return [2 /*return*/, undefined]; + } + return [2 /*return*/, this.provider._wrapTransaction(tx, hash, blockNumber)]; + } + }); + }); }, { oncePoll: this.provider })]; + case 4: + // Unfortunately, JSON-RPC only provides and opaque transaction hash + // for a response, and we need the actual transaction, so we poll + // for it; it should show up very quickly + return [2 /*return*/, _a.sent()]; + case 5: + error_1 = _a.sent(); + error_1.transactionHash = hash; + throw error_1; + case 6: return [2 /*return*/]; + } + }); + }); + }; + JsonRpcSigner.prototype.signMessage = function (message) { + return __awaiter(this, void 0, void 0, function () { + var data, address; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + data = ((typeof (message) === "string") ? strings_1.toUtf8Bytes(message) : message); + return [4 /*yield*/, this.getAddress()]; + case 1: + address = _a.sent(); + return [4 /*yield*/, this.provider.send("eth_sign", [address.toLowerCase(), bytes_1.hexlify(data)])]; + case 2: + // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign + return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + JsonRpcSigner.prototype._signTypedData = function (domain, types, value) { + return __awaiter(this, void 0, void 0, function () { + var populated, address; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, hash_1._TypedDataEncoder.resolveNames(domain, types, value, function (name) { + return _this.provider.resolveName(name); + })]; + case 1: + populated = _a.sent(); + return [4 /*yield*/, this.getAddress()]; + case 2: + address = _a.sent(); + return [4 /*yield*/, this.provider.send("eth_signTypedData_v4", [ + address.toLowerCase(), + JSON.stringify(hash_1._TypedDataEncoder.getPayload(populated.domain, types, populated.value)) + ])]; + case 3: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + JsonRpcSigner.prototype.unlock = function (password) { + return __awaiter(this, void 0, void 0, function () { + var provider, address; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + provider = this.provider; + return [4 /*yield*/, this.getAddress()]; + case 1: + address = _a.sent(); + return [2 /*return*/, provider.send("personal_unlockAccount", [address.toLowerCase(), password, null])]; + } + }); + }); + }; + return JsonRpcSigner; +}(abstract_signer_1.Signer)); +exports.JsonRpcSigner = JsonRpcSigner; +var UncheckedJsonRpcSigner = /** @class */ (function (_super) { + __extends(UncheckedJsonRpcSigner, _super); + function UncheckedJsonRpcSigner() { + return _super !== null && _super.apply(this, arguments) || this; + } + UncheckedJsonRpcSigner.prototype.sendTransaction = function (transaction) { + var _this = this; + return this.sendUncheckedTransaction(transaction).then(function (hash) { + return { + hash: hash, + nonce: null, + gasLimit: null, + gasPrice: null, + data: null, + value: null, + chainId: null, + confirmations: 0, + from: null, + wait: function (confirmations) { return _this.provider.waitForTransaction(hash, confirmations); } + }; + }); + }; + return UncheckedJsonRpcSigner; +}(JsonRpcSigner)); +var allowedTransactionKeys = { + chainId: true, data: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true, + type: true, accessList: true, + maxFeePerGas: true, maxPriorityFeePerGas: true +}; +var JsonRpcProvider = /** @class */ (function (_super) { + __extends(JsonRpcProvider, _super); + function JsonRpcProvider(url, network) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, JsonRpcProvider); + var networkOrReady = network; + // The network is unknown, query the JSON-RPC for it + if (networkOrReady == null) { + networkOrReady = new Promise(function (resolve, reject) { + setTimeout(function () { + _this.detectNetwork().then(function (network) { + resolve(network); + }, function (error) { + reject(error); + }); + }, 0); + }); + } + _this = _super.call(this, networkOrReady) || this; + // Default URL + if (!url) { + url = properties_1.getStatic(_this.constructor, "defaultUrl")(); + } + if (typeof (url) === "string") { + properties_1.defineReadOnly(_this, "connection", Object.freeze({ + url: url + })); + } + else { + properties_1.defineReadOnly(_this, "connection", Object.freeze(properties_1.shallowCopy(url))); + } + _this._nextId = 42; + return _this; + } + Object.defineProperty(JsonRpcProvider.prototype, "_cache", { + get: function () { + if (this._eventLoopCache == null) { + this._eventLoopCache = {}; + } + return this._eventLoopCache; + }, + enumerable: false, + configurable: true + }); + JsonRpcProvider.defaultUrl = function () { + return "http:/\/localhost:8545"; + }; + JsonRpcProvider.prototype.detectNetwork = function () { + var _this = this; + if (!this._cache["detectNetwork"]) { + this._cache["detectNetwork"] = this._uncachedDetectNetwork(); + // Clear this cache at the beginning of the next event loop + setTimeout(function () { + _this._cache["detectNetwork"] = null; + }, 0); + } + return this._cache["detectNetwork"]; + }; + JsonRpcProvider.prototype._uncachedDetectNetwork = function () { + return __awaiter(this, void 0, void 0, function () { + var chainId, error_2, error_3, getNetwork; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, timer(0)]; + case 1: + _a.sent(); + chainId = null; + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 9]); + return [4 /*yield*/, this.send("eth_chainId", [])]; + case 3: + chainId = _a.sent(); + return [3 /*break*/, 9]; + case 4: + error_2 = _a.sent(); + _a.label = 5; + case 5: + _a.trys.push([5, 7, , 8]); + return [4 /*yield*/, this.send("net_version", [])]; + case 6: + chainId = _a.sent(); + return [3 /*break*/, 8]; + case 7: + error_3 = _a.sent(); + return [3 /*break*/, 8]; + case 8: return [3 /*break*/, 9]; + case 9: + if (chainId != null) { + getNetwork = properties_1.getStatic(this.constructor, "getNetwork"); + try { + return [2 /*return*/, getNetwork(bignumber_1.BigNumber.from(chainId).toNumber())]; + } + catch (error) { + return [2 /*return*/, logger.throwError("could not detect network", logger_1.Logger.errors.NETWORK_ERROR, { + chainId: chainId, + event: "invalidNetwork", + serverError: error + })]; + } + } + return [2 /*return*/, logger.throwError("could not detect network", logger_1.Logger.errors.NETWORK_ERROR, { + event: "noNetwork" + })]; + } + }); + }); + }; + JsonRpcProvider.prototype.getSigner = function (addressOrIndex) { + return new JsonRpcSigner(_constructorGuard, this, addressOrIndex); + }; + JsonRpcProvider.prototype.getUncheckedSigner = function (addressOrIndex) { + return this.getSigner(addressOrIndex).connectUnchecked(); + }; + JsonRpcProvider.prototype.listAccounts = function () { + var _this = this; + return this.send("eth_accounts", []).then(function (accounts) { + return accounts.map(function (a) { return _this.formatter.address(a); }); + }); + }; + JsonRpcProvider.prototype.send = function (method, params) { + var _this = this; + var request = { + method: method, + params: params, + id: (this._nextId++), + jsonrpc: "2.0" + }; + this.emit("debug", { + action: "request", + request: properties_1.deepCopy(request), + provider: this + }); + // We can expand this in the future to any call, but for now these + // are the biggest wins and do not require any serializing parameters. + var cache = (["eth_chainId", "eth_blockNumber"].indexOf(method) >= 0); + if (cache && this._cache[method]) { + return this._cache[method]; + } + var result = web_1.fetchJson(this.connection, JSON.stringify(request), getResult).then(function (result) { + _this.emit("debug", { + action: "response", + request: request, + response: result, + provider: _this + }); + return result; + }, function (error) { + _this.emit("debug", { + action: "response", + error: error, + request: request, + provider: _this + }); + throw error; + }); + // Cache the fetch, but clear it on the next event loop + if (cache) { + this._cache[method] = result; + setTimeout(function () { + _this._cache[method] = null; + }, 0); + } + return result; + }; + JsonRpcProvider.prototype.prepareRequest = function (method, params) { + switch (method) { + case "getBlockNumber": + return ["eth_blockNumber", []]; + case "getGasPrice": + return ["eth_gasPrice", []]; + case "getBalance": + return ["eth_getBalance", [getLowerCase(params.address), params.blockTag]]; + case "getTransactionCount": + return ["eth_getTransactionCount", [getLowerCase(params.address), params.blockTag]]; + case "getCode": + return ["eth_getCode", [getLowerCase(params.address), params.blockTag]]; + case "getStorageAt": + return ["eth_getStorageAt", [getLowerCase(params.address), params.position, params.blockTag]]; + case "sendTransaction": + return ["eth_sendRawTransaction", [params.signedTransaction]]; + case "getBlock": + if (params.blockTag) { + return ["eth_getBlockByNumber", [params.blockTag, !!params.includeTransactions]]; + } + else if (params.blockHash) { + return ["eth_getBlockByHash", [params.blockHash, !!params.includeTransactions]]; + } + return null; + case "getTransaction": + return ["eth_getTransactionByHash", [params.transactionHash]]; + case "getTransactionReceipt": + return ["eth_getTransactionReceipt", [params.transactionHash]]; + case "call": { + var hexlifyTransaction = properties_1.getStatic(this.constructor, "hexlifyTransaction"); + return ["eth_call", [hexlifyTransaction(params.transaction, { from: true }), params.blockTag]]; + } + case "estimateGas": { + var hexlifyTransaction = properties_1.getStatic(this.constructor, "hexlifyTransaction"); + return ["eth_estimateGas", [hexlifyTransaction(params.transaction, { from: true })]]; + } + case "getLogs": + if (params.filter && params.filter.address != null) { + params.filter.address = getLowerCase(params.filter.address); + } + return ["eth_getLogs", [params.filter]]; + default: + break; + } + return null; + }; + JsonRpcProvider.prototype.perform = function (method, params) { + return __awaiter(this, void 0, void 0, function () { + var tx, feeData, args, error_4; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(method === "call" || method === "estimateGas")) return [3 /*break*/, 2]; + tx = params.transaction; + if (!(tx && tx.type != null && bignumber_1.BigNumber.from(tx.type).isZero())) return [3 /*break*/, 2]; + if (!(tx.maxFeePerGas == null && tx.maxPriorityFeePerGas == null)) return [3 /*break*/, 2]; + return [4 /*yield*/, this.getFeeData()]; + case 1: + feeData = _a.sent(); + if (feeData.maxFeePerGas == null && feeData.maxPriorityFeePerGas == null) { + // Network doesn't know about EIP-1559 (and hence type) + params = properties_1.shallowCopy(params); + params.transaction = properties_1.shallowCopy(tx); + delete params.transaction.type; + } + _a.label = 2; + case 2: + args = this.prepareRequest(method, params); + if (args == null) { + logger.throwError(method + " not implemented", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method }); + } + _a.label = 3; + case 3: + _a.trys.push([3, 5, , 6]); + return [4 /*yield*/, this.send(args[0], args[1])]; + case 4: return [2 /*return*/, _a.sent()]; + case 5: + error_4 = _a.sent(); + return [2 /*return*/, checkError(method, error_4, params)]; + case 6: return [2 /*return*/]; + } + }); + }); + }; + JsonRpcProvider.prototype._startEvent = function (event) { + if (event.tag === "pending") { + this._startPending(); + } + _super.prototype._startEvent.call(this, event); + }; + JsonRpcProvider.prototype._startPending = function () { + if (this._pendingFilter != null) { + return; + } + var self = this; + var pendingFilter = this.send("eth_newPendingTransactionFilter", []); + this._pendingFilter = pendingFilter; + pendingFilter.then(function (filterId) { + function poll() { + self.send("eth_getFilterChanges", [filterId]).then(function (hashes) { + if (self._pendingFilter != pendingFilter) { + return null; + } + var seq = Promise.resolve(); + hashes.forEach(function (hash) { + // @TODO: This should be garbage collected at some point... How? When? + self._emitted["t:" + hash.toLowerCase()] = "pending"; + seq = seq.then(function () { + return self.getTransaction(hash).then(function (tx) { + self.emit("pending", tx); + return null; + }); + }); + }); + return seq.then(function () { + return timer(1000); + }); + }).then(function () { + if (self._pendingFilter != pendingFilter) { + self.send("eth_uninstallFilter", [filterId]); + return; + } + setTimeout(function () { poll(); }, 0); + return null; + }).catch(function (error) { }); + } + poll(); + return filterId; + }).catch(function (error) { }); + }; + JsonRpcProvider.prototype._stopEvent = function (event) { + if (event.tag === "pending" && this.listenerCount("pending") === 0) { + this._pendingFilter = null; + } + _super.prototype._stopEvent.call(this, event); + }; + // Convert an ethers.js transaction into a JSON-RPC transaction + // - gasLimit => gas + // - All values hexlified + // - All numeric values zero-striped + // - All addresses are lowercased + // NOTE: This allows a TransactionRequest, but all values should be resolved + // before this is called + // @TODO: This will likely be removed in future versions and prepareRequest + // will be the preferred method for this. + JsonRpcProvider.hexlifyTransaction = function (transaction, allowExtra) { + // Check only allowed properties are given + var allowed = properties_1.shallowCopy(allowedTransactionKeys); + if (allowExtra) { + for (var key in allowExtra) { + if (allowExtra[key]) { + allowed[key] = true; + } + } + } + properties_1.checkProperties(transaction, allowed); + var result = {}; + // Some nodes (INFURA ropsten; INFURA mainnet is fine) do not like leading zeros. + ["gasLimit", "gasPrice", "type", "maxFeePerGas", "maxPriorityFeePerGas", "nonce", "value"].forEach(function (key) { + if (transaction[key] == null) { + return; + } + var value = bytes_1.hexValue(transaction[key]); + if (key === "gasLimit") { + key = "gas"; + } + result[key] = value; + }); + ["from", "to", "data"].forEach(function (key) { + if (transaction[key] == null) { + return; + } + result[key] = bytes_1.hexlify(transaction[key]); + }); + if (transaction.accessList) { + result["accessList"] = transactions_1.accessListify(transaction.accessList); + } + return result; + }; + return JsonRpcProvider; +}(base_provider_1.BaseProvider)); +exports.JsonRpcProvider = JsonRpcProvider; + +},{"./_version":64,"./base-provider":66,"@ethersproject/abstract-signer":22,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/hash":43,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/strings":99,"@ethersproject/transactions":102,"@ethersproject/web":109}],77:[function(require,module,exports){ +/* istanbul ignore file */ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NodesmithProvider = void 0; +var url_json_rpc_provider_1 = require("./url-json-rpc-provider"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +// Special API key provided by Nodesmith for ethers.js +var defaultApiKey = "ETHERS_JS_SHARED"; +var NodesmithProvider = /** @class */ (function (_super) { + __extends(NodesmithProvider, _super); + function NodesmithProvider() { + return _super !== null && _super.apply(this, arguments) || this; + } + NodesmithProvider.getApiKey = function (apiKey) { + if (apiKey && typeof (apiKey) !== "string") { + logger.throwArgumentError("invalid apiKey", "apiKey", apiKey); + } + return apiKey || defaultApiKey; + }; + NodesmithProvider.getUrl = function (network, apiKey) { + logger.warn("NodeSmith will be discontinued on 2019-12-20; please migrate to another platform."); + var host = null; + switch (network.name) { + case "homestead": + host = "https://ethereum.api.nodesmith.io/v1/mainnet/jsonrpc"; + break; + case "ropsten": + host = "https://ethereum.api.nodesmith.io/v1/ropsten/jsonrpc"; + break; + case "rinkeby": + host = "https://ethereum.api.nodesmith.io/v1/rinkeby/jsonrpc"; + break; + case "goerli": + host = "https://ethereum.api.nodesmith.io/v1/goerli/jsonrpc"; + break; + case "kovan": + host = "https://ethereum.api.nodesmith.io/v1/kovan/jsonrpc"; + break; + default: + logger.throwArgumentError("unsupported network", "network", arguments[0]); + } + return (host + "?apiKey=" + apiKey); + }; + return NodesmithProvider; +}(url_json_rpc_provider_1.UrlJsonRpcProvider)); +exports.NodesmithProvider = NodesmithProvider; + +},{"./_version":64,"./url-json-rpc-provider":79,"@ethersproject/logger":57}],78:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PocketProvider = void 0; +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var url_json_rpc_provider_1 = require("./url-json-rpc-provider"); +// These are load-balancer-based applicatoin IDs +var defaultApplicationIds = { + homestead: "6004bcd10040261633ade990", + ropsten: "6004bd4d0040261633ade991", + rinkeby: "6004bda20040261633ade994", + goerli: "6004bd860040261633ade992", +}; +var PocketProvider = /** @class */ (function (_super) { + __extends(PocketProvider, _super); + function PocketProvider(network, apiKey) { + // We need a bit of creativity in the constructor because + // Pocket uses different default API keys based on the network + var _newTarget = this.constructor; + var _this = this; + if (apiKey == null) { + var n = properties_1.getStatic((_newTarget), "getNetwork")(network); + if (n) { + var applicationId = defaultApplicationIds[n.name]; + if (applicationId) { + apiKey = { + applicationId: applicationId, + loadBalancer: true + }; + } + } + // If there was any issue above, we don't know this network + if (apiKey == null) { + logger.throwError("unsupported network", logger_1.Logger.errors.INVALID_ARGUMENT, { + argument: "network", + value: network + }); + } + } + _this = _super.call(this, network, apiKey) || this; + return _this; + } + PocketProvider.getApiKey = function (apiKey) { + // Most API Providers allow null to get the default configuration, but + // Pocket requires the network to decide the default provider, so we + // rely on hijacking the constructor to add a sensible default for us + if (apiKey == null) { + logger.throwArgumentError("PocketProvider.getApiKey does not support null apiKey", "apiKey", apiKey); + } + var apiKeyObj = { + applicationId: null, + loadBalancer: false, + applicationSecretKey: null + }; + // Parse applicationId and applicationSecretKey + if (typeof (apiKey) === "string") { + apiKeyObj.applicationId = apiKey; + } + else if (apiKey.applicationSecretKey != null) { + logger.assertArgument((typeof (apiKey.applicationId) === "string"), "applicationSecretKey requires an applicationId", "applicationId", apiKey.applicationId); + logger.assertArgument((typeof (apiKey.applicationSecretKey) === "string"), "invalid applicationSecretKey", "applicationSecretKey", "[REDACTED]"); + apiKeyObj.applicationId = apiKey.applicationId; + apiKeyObj.applicationSecretKey = apiKey.applicationSecretKey; + apiKeyObj.loadBalancer = !!apiKey.loadBalancer; + } + else if (apiKey.applicationId) { + logger.assertArgument((typeof (apiKey.applicationId) === "string"), "apiKey.applicationId must be a string", "apiKey.applicationId", apiKey.applicationId); + apiKeyObj.applicationId = apiKey.applicationId; + apiKeyObj.loadBalancer = !!apiKey.loadBalancer; + } + else { + logger.throwArgumentError("unsupported PocketProvider apiKey", "apiKey", apiKey); + } + return apiKeyObj; + }; + PocketProvider.getUrl = function (network, apiKey) { + var host = null; + switch (network ? network.name : "unknown") { + case "homestead": + host = "eth-mainnet.gateway.pokt.network"; + break; + case "ropsten": + host = "eth-ropsten.gateway.pokt.network"; + break; + case "rinkeby": + host = "eth-rinkeby.gateway.pokt.network"; + break; + case "goerli": + host = "eth-goerli.gateway.pokt.network"; + break; + default: + logger.throwError("unsupported network", logger_1.Logger.errors.INVALID_ARGUMENT, { + argument: "network", + value: network + }); + } + var url = null; + if (apiKey.loadBalancer) { + url = "https://" + host + "/v1/lb/" + apiKey.applicationId; + } + else { + url = "https://" + host + "/v1/" + apiKey.applicationId; + } + var connection = { url: url }; + // Initialize empty headers + connection.headers = {}; + // Apply application secret key + if (apiKey.applicationSecretKey != null) { + connection.user = ""; + connection.password = apiKey.applicationSecretKey; + } + return connection; + }; + PocketProvider.prototype.isCommunityResource = function () { + return (this.applicationId === defaultApplicationIds[this.network.name]); + }; + return PocketProvider; +}(url_json_rpc_provider_1.UrlJsonRpcProvider)); +exports.PocketProvider = PocketProvider; + +},{"./_version":64,"./url-json-rpc-provider":79,"@ethersproject/logger":57,"@ethersproject/properties":63}],79:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UrlJsonRpcProvider = exports.StaticJsonRpcProvider = void 0; +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var json_rpc_provider_1 = require("./json-rpc-provider"); +// A StaticJsonRpcProvider is useful when you *know* for certain that +// the backend will never change, as it never calls eth_chainId to +// verify its backend. However, if the backend does change, the effects +// are undefined and may include: +// - inconsistent results +// - locking up the UI +// - block skew warnings +// - wrong results +// If the network is not explicit (i.e. auto-detection is expected), the +// node MUST be running and available to respond to requests BEFORE this +// is instantiated. +var StaticJsonRpcProvider = /** @class */ (function (_super) { + __extends(StaticJsonRpcProvider, _super); + function StaticJsonRpcProvider() { + return _super !== null && _super.apply(this, arguments) || this; + } + StaticJsonRpcProvider.prototype.detectNetwork = function () { + return __awaiter(this, void 0, void 0, function () { + var network; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + network = this.network; + if (!(network == null)) return [3 /*break*/, 2]; + return [4 /*yield*/, _super.prototype.detectNetwork.call(this)]; + case 1: + network = _a.sent(); + if (!network) { + logger.throwError("no network detected", logger_1.Logger.errors.UNKNOWN_ERROR, {}); + } + // If still not set, set it + if (this._network == null) { + // A static network does not support "any" + properties_1.defineReadOnly(this, "_network", network); + this.emit("network", network, null); + } + _a.label = 2; + case 2: return [2 /*return*/, network]; + } + }); + }); + }; + return StaticJsonRpcProvider; +}(json_rpc_provider_1.JsonRpcProvider)); +exports.StaticJsonRpcProvider = StaticJsonRpcProvider; +var UrlJsonRpcProvider = /** @class */ (function (_super) { + __extends(UrlJsonRpcProvider, _super); + function UrlJsonRpcProvider(network, apiKey) { + var _newTarget = this.constructor; + var _this = this; + logger.checkAbstract(_newTarget, UrlJsonRpcProvider); + // Normalize the Network and API Key + network = properties_1.getStatic((_newTarget), "getNetwork")(network); + apiKey = properties_1.getStatic((_newTarget), "getApiKey")(apiKey); + var connection = properties_1.getStatic((_newTarget), "getUrl")(network, apiKey); + _this = _super.call(this, connection, network) || this; + if (typeof (apiKey) === "string") { + properties_1.defineReadOnly(_this, "apiKey", apiKey); + } + else if (apiKey != null) { + Object.keys(apiKey).forEach(function (key) { + properties_1.defineReadOnly(_this, key, apiKey[key]); + }); + } + return _this; + } + UrlJsonRpcProvider.prototype._startPending = function () { + logger.warn("WARNING: API provider does not support pending filters"); + }; + UrlJsonRpcProvider.prototype.isCommunityResource = function () { + return false; + }; + UrlJsonRpcProvider.prototype.getSigner = function (address) { + return logger.throwError("API provider does not support signing", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: "getSigner" }); + }; + UrlJsonRpcProvider.prototype.listAccounts = function () { + return Promise.resolve([]); + }; + // Return a defaultApiKey if null, otherwise validate the API key + UrlJsonRpcProvider.getApiKey = function (apiKey) { + return apiKey; + }; + // Returns the url or connection for the given network and API key. The + // API key will have been sanitized by the getApiKey first, so any validation + // or transformations can be done there. + UrlJsonRpcProvider.getUrl = function (network, apiKey) { + return logger.throwError("not implemented; sub-classes must override getUrl", logger_1.Logger.errors.NOT_IMPLEMENTED, { + operation: "getUrl" + }); + }; + return UrlJsonRpcProvider; +}(StaticJsonRpcProvider)); +exports.UrlJsonRpcProvider = UrlJsonRpcProvider; + +},{"./_version":64,"./json-rpc-provider":76,"@ethersproject/logger":57,"@ethersproject/properties":63}],80:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Web3Provider = void 0; +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var json_rpc_provider_1 = require("./json-rpc-provider"); +var _nextId = 1; +function buildWeb3LegacyFetcher(provider, sendFunc) { + var fetcher = "Web3LegacyFetcher"; + return function (method, params) { + var _this = this; + // Metamask complains about eth_sign (and on some versions hangs) + if (method == "eth_sign" && (provider.isMetaMask || provider.isStatus)) { + // https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign + method = "personal_sign"; + params = [params[1], params[0]]; + } + var request = { + method: method, + params: params, + id: (_nextId++), + jsonrpc: "2.0" + }; + return new Promise(function (resolve, reject) { + _this.emit("debug", { + action: "request", + fetcher: fetcher, + request: properties_1.deepCopy(request), + provider: _this + }); + sendFunc(request, function (error, response) { + if (error) { + _this.emit("debug", { + action: "response", + fetcher: fetcher, + error: error, + request: request, + provider: _this + }); + return reject(error); + } + _this.emit("debug", { + action: "response", + fetcher: fetcher, + request: request, + response: response, + provider: _this + }); + if (response.error) { + var error_1 = new Error(response.error.message); + error_1.code = response.error.code; + error_1.data = response.error.data; + return reject(error_1); + } + resolve(response.result); + }); + }); + }; +} +function buildEip1193Fetcher(provider) { + return function (method, params) { + var _this = this; + if (params == null) { + params = []; + } + // Metamask complains about eth_sign (and on some versions hangs) + if (method == "eth_sign" && (provider.isMetaMask || provider.isStatus)) { + // https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign + method = "personal_sign"; + params = [params[1], params[0]]; + } + var request = { method: method, params: params }; + this.emit("debug", { + action: "request", + fetcher: "Eip1193Fetcher", + request: properties_1.deepCopy(request), + provider: this + }); + return provider.request(request).then(function (response) { + _this.emit("debug", { + action: "response", + fetcher: "Eip1193Fetcher", + request: request, + response: response, + provider: _this + }); + return response; + }, function (error) { + _this.emit("debug", { + action: "response", + fetcher: "Eip1193Fetcher", + request: request, + error: error, + provider: _this + }); + throw error; + }); + }; +} +var Web3Provider = /** @class */ (function (_super) { + __extends(Web3Provider, _super); + function Web3Provider(provider, network) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, Web3Provider); + if (provider == null) { + logger.throwArgumentError("missing provider", "provider", provider); + } + var path = null; + var jsonRpcFetchFunc = null; + var subprovider = null; + if (typeof (provider) === "function") { + path = "unknown:"; + jsonRpcFetchFunc = provider; + } + else { + path = provider.host || provider.path || ""; + if (!path && provider.isMetaMask) { + path = "metamask"; + } + subprovider = provider; + if (provider.request) { + if (path === "") { + path = "eip-1193:"; + } + jsonRpcFetchFunc = buildEip1193Fetcher(provider); + } + else if (provider.sendAsync) { + jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider)); + } + else if (provider.send) { + jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider)); + } + else { + logger.throwArgumentError("unsupported provider", "provider", provider); + } + if (!path) { + path = "unknown:"; + } + } + _this = _super.call(this, path, network) || this; + properties_1.defineReadOnly(_this, "jsonRpcFetchFunc", jsonRpcFetchFunc); + properties_1.defineReadOnly(_this, "provider", subprovider); + return _this; + } + Web3Provider.prototype.send = function (method, params) { + return this.jsonRpcFetchFunc(method, params); + }; + return Web3Provider; +}(json_rpc_provider_1.JsonRpcProvider)); +exports.Web3Provider = Web3Provider; + +},{"./_version":64,"./json-rpc-provider":76,"@ethersproject/logger":57,"@ethersproject/properties":63}],81:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WebSocketProvider = void 0; +var bignumber_1 = require("@ethersproject/bignumber"); +var properties_1 = require("@ethersproject/properties"); +var json_rpc_provider_1 = require("./json-rpc-provider"); +var ws_1 = require("./ws"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +/** + * Notes: + * + * This provider differs a bit from the polling providers. One main + * difference is how it handles consistency. The polling providers + * will stall responses to ensure a consistent state, while this + * WebSocket provider assumes the connected backend will manage this. + * + * For example, if a polling provider emits an event which indicats + * the event occurred in blockhash XXX, a call to fetch that block by + * its hash XXX, if not present will retry until it is present. This + * can occur when querying a pool of nodes that are mildly out of sync + * with each other. + */ +var NextId = 1; +// For more info about the Real-time Event API see: +// https://geth.ethereum.org/docs/rpc/pubsub +var WebSocketProvider = /** @class */ (function (_super) { + __extends(WebSocketProvider, _super); + function WebSocketProvider(url, network) { + var _this = this; + // This will be added in the future; please open an issue to expedite + if (network === "any") { + logger.throwError("WebSocketProvider does not support 'any' network yet", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "network:any" + }); + } + _this = _super.call(this, url, network) || this; + _this._pollingInterval = -1; + _this._wsReady = false; + properties_1.defineReadOnly(_this, "_websocket", new ws_1.WebSocket(_this.connection.url)); + properties_1.defineReadOnly(_this, "_requests", {}); + properties_1.defineReadOnly(_this, "_subs", {}); + properties_1.defineReadOnly(_this, "_subIds", {}); + properties_1.defineReadOnly(_this, "_detectNetwork", _super.prototype.detectNetwork.call(_this)); + // Stall sending requests until the socket is open... + _this._websocket.onopen = function () { + _this._wsReady = true; + Object.keys(_this._requests).forEach(function (id) { + _this._websocket.send(_this._requests[id].payload); + }); + }; + _this._websocket.onmessage = function (messageEvent) { + var data = messageEvent.data; + var result = JSON.parse(data); + if (result.id != null) { + var id = String(result.id); + var request = _this._requests[id]; + delete _this._requests[id]; + if (result.result !== undefined) { + request.callback(null, result.result); + _this.emit("debug", { + action: "response", + request: JSON.parse(request.payload), + response: result.result, + provider: _this + }); + } + else { + var error = null; + if (result.error) { + error = new Error(result.error.message || "unknown error"); + properties_1.defineReadOnly(error, "code", result.error.code || null); + properties_1.defineReadOnly(error, "response", data); + } + else { + error = new Error("unknown error"); + } + request.callback(error, undefined); + _this.emit("debug", { + action: "response", + error: error, + request: JSON.parse(request.payload), + provider: _this + }); + } + } + else if (result.method === "eth_subscription") { + // Subscription... + var sub = _this._subs[result.params.subscription]; + if (sub) { + //this.emit.apply(this, ); + sub.processFunc(result.params.result); + } + } + else { + console.warn("this should not happen"); + } + }; + // This Provider does not actually poll, but we want to trigger + // poll events for things that depend on them (like stalling for + // block and transaction lookups) + var fauxPoll = setInterval(function () { + _this.emit("poll"); + }, 1000); + if (fauxPoll.unref) { + fauxPoll.unref(); + } + return _this; + } + WebSocketProvider.prototype.detectNetwork = function () { + return this._detectNetwork; + }; + Object.defineProperty(WebSocketProvider.prototype, "pollingInterval", { + get: function () { + return 0; + }, + set: function (value) { + logger.throwError("cannot set polling interval on WebSocketProvider", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "setPollingInterval" + }); + }, + enumerable: false, + configurable: true + }); + WebSocketProvider.prototype.resetEventsBlock = function (blockNumber) { + logger.throwError("cannot reset events block on WebSocketProvider", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "resetEventBlock" + }); + }; + WebSocketProvider.prototype.poll = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, null]; + }); + }); + }; + Object.defineProperty(WebSocketProvider.prototype, "polling", { + set: function (value) { + if (!value) { + return; + } + logger.throwError("cannot set polling on WebSocketProvider", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "setPolling" + }); + }, + enumerable: false, + configurable: true + }); + WebSocketProvider.prototype.send = function (method, params) { + var _this = this; + var rid = NextId++; + return new Promise(function (resolve, reject) { + function callback(error, result) { + if (error) { + return reject(error); + } + return resolve(result); + } + var payload = JSON.stringify({ + method: method, + params: params, + id: rid, + jsonrpc: "2.0" + }); + _this.emit("debug", { + action: "request", + request: JSON.parse(payload), + provider: _this + }); + _this._requests[String(rid)] = { callback: callback, payload: payload }; + if (_this._wsReady) { + _this._websocket.send(payload); + } + }); + }; + WebSocketProvider.defaultUrl = function () { + return "ws:/\/localhost:8546"; + }; + WebSocketProvider.prototype._subscribe = function (tag, param, processFunc) { + return __awaiter(this, void 0, void 0, function () { + var subIdPromise, subId; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + subIdPromise = this._subIds[tag]; + if (subIdPromise == null) { + subIdPromise = Promise.all(param).then(function (param) { + return _this.send("eth_subscribe", param); + }); + this._subIds[tag] = subIdPromise; + } + return [4 /*yield*/, subIdPromise]; + case 1: + subId = _a.sent(); + this._subs[subId] = { tag: tag, processFunc: processFunc }; + return [2 /*return*/]; + } + }); + }); + }; + WebSocketProvider.prototype._startEvent = function (event) { + var _this = this; + switch (event.type) { + case "block": + this._subscribe("block", ["newHeads"], function (result) { + var blockNumber = bignumber_1.BigNumber.from(result.number).toNumber(); + _this._emitted.block = blockNumber; + _this.emit("block", blockNumber); + }); + break; + case "pending": + this._subscribe("pending", ["newPendingTransactions"], function (result) { + _this.emit("pending", result); + }); + break; + case "filter": + this._subscribe(event.tag, ["logs", this._getFilter(event.filter)], function (result) { + if (result.removed == null) { + result.removed = false; + } + _this.emit(event.filter, _this.formatter.filterLog(result)); + }); + break; + case "tx": { + var emitReceipt_1 = function (event) { + var hash = event.hash; + _this.getTransactionReceipt(hash).then(function (receipt) { + if (!receipt) { + return; + } + _this.emit(hash, receipt); + }); + }; + // In case it is already mined + emitReceipt_1(event); + // To keep things simple, we start up a single newHeads subscription + // to keep an eye out for transactions we are watching for. + // Starting a subscription for an event (i.e. "tx") that is already + // running is (basically) a nop. + this._subscribe("tx", ["newHeads"], function (result) { + _this._events.filter(function (e) { return (e.type === "tx"); }).forEach(emitReceipt_1); + }); + break; + } + // Nothing is needed + case "debug": + case "poll": + case "willPoll": + case "didPoll": + case "error": + break; + default: + console.log("unhandled:", event); + break; + } + }; + WebSocketProvider.prototype._stopEvent = function (event) { + var _this = this; + var tag = event.tag; + if (event.type === "tx") { + // There are remaining transaction event listeners + if (this._events.filter(function (e) { return (e.type === "tx"); }).length) { + return; + } + tag = "tx"; + } + else if (this.listenerCount(event.event)) { + // There are remaining event listeners + return; + } + var subId = this._subIds[tag]; + if (!subId) { + return; + } + delete this._subIds[tag]; + subId.then(function (subId) { + if (!_this._subs[subId]) { + return; + } + delete _this._subs[subId]; + _this.send("eth_unsubscribe", [subId]); + }); + }; + WebSocketProvider.prototype.destroy = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(this._websocket.readyState === ws_1.WebSocket.CONNECTING)) return [3 /*break*/, 2]; + return [4 /*yield*/, (new Promise(function (resolve) { + _this._websocket.onopen = function () { + resolve(true); + }; + _this._websocket.onerror = function () { + resolve(false); + }; + }))]; + case 1: + _a.sent(); + _a.label = 2; + case 2: + // Hangup + // See: https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes + this._websocket.close(1000); + return [2 /*return*/]; + } + }); + }); + }; + return WebSocketProvider; +}(json_rpc_provider_1.JsonRpcProvider)); +exports.WebSocketProvider = WebSocketProvider; + +},{"./_version":64,"./json-rpc-provider":76,"./ws":68,"@ethersproject/bignumber":31,"@ethersproject/logger":57,"@ethersproject/properties":63}],82:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "random/5.4.0"; + +},{}],83:[function(require,module,exports){ +(function (global){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.randomBytes = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var anyGlobal = null; +try { + anyGlobal = window; + if (anyGlobal == null) { + throw new Error("try next"); + } +} +catch (error) { + try { + anyGlobal = global; + if (anyGlobal == null) { + throw new Error("try next"); + } + } + catch (error) { + anyGlobal = {}; + } +} +var crypto = anyGlobal.crypto || anyGlobal.msCrypto; +if (!crypto || !crypto.getRandomValues) { + logger.warn("WARNING: Missing strong random number source"); + crypto = { + getRandomValues: function (buffer) { + return logger.throwError("no secure random source avaialble", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "crypto.getRandomValues" + }); + } + }; +} +function randomBytes(length) { + if (length <= 0 || length > 1024 || (length % 1)) { + logger.throwArgumentError("invalid length", "length", length); + } + var result = new Uint8Array(length); + crypto.getRandomValues(result); + return bytes_1.arrayify(result); +} +exports.randomBytes = randomBytes; +; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./_version":82,"@ethersproject/bytes":33,"@ethersproject/logger":57}],84:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.shuffled = exports.randomBytes = void 0; +var random_1 = require("./random"); +Object.defineProperty(exports, "randomBytes", { enumerable: true, get: function () { return random_1.randomBytes; } }); +var shuffle_1 = require("./shuffle"); +Object.defineProperty(exports, "shuffled", { enumerable: true, get: function () { return shuffle_1.shuffled; } }); + +},{"./random":83,"./shuffle":85}],85:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.shuffled = void 0; +function shuffled(array) { + array = array.slice(); + for (var i = array.length - 1; i > 0; i--) { + var j = Math.floor(Math.random() * (i + 1)); + var tmp = array[i]; + array[i] = array[j]; + array[j] = tmp; + } + return array; +} +exports.shuffled = shuffled; + +},{}],86:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "rlp/5.4.0"; + +},{}],87:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decode = exports.encode = void 0; +//See: https://github.com/ethereum/wiki/wiki/RLP +var bytes_1 = require("@ethersproject/bytes"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +function arrayifyInteger(value) { + var result = []; + while (value) { + result.unshift(value & 0xff); + value >>= 8; + } + return result; +} +function unarrayifyInteger(data, offset, length) { + var result = 0; + for (var i = 0; i < length; i++) { + result = (result * 256) + data[offset + i]; + } + return result; +} +function _encode(object) { + if (Array.isArray(object)) { + var payload_1 = []; + object.forEach(function (child) { + payload_1 = payload_1.concat(_encode(child)); + }); + if (payload_1.length <= 55) { + payload_1.unshift(0xc0 + payload_1.length); + return payload_1; + } + var length_1 = arrayifyInteger(payload_1.length); + length_1.unshift(0xf7 + length_1.length); + return length_1.concat(payload_1); + } + if (!bytes_1.isBytesLike(object)) { + logger.throwArgumentError("RLP object must be BytesLike", "object", object); + } + var data = Array.prototype.slice.call(bytes_1.arrayify(object)); + if (data.length === 1 && data[0] <= 0x7f) { + return data; + } + else if (data.length <= 55) { + data.unshift(0x80 + data.length); + return data; + } + var length = arrayifyInteger(data.length); + length.unshift(0xb7 + length.length); + return length.concat(data); +} +function encode(object) { + return bytes_1.hexlify(_encode(object)); +} +exports.encode = encode; +function _decodeChildren(data, offset, childOffset, length) { + var result = []; + while (childOffset < offset + 1 + length) { + var decoded = _decode(data, childOffset); + result.push(decoded.result); + childOffset += decoded.consumed; + if (childOffset > offset + 1 + length) { + logger.throwError("child data too short", logger_1.Logger.errors.BUFFER_OVERRUN, {}); + } + } + return { consumed: (1 + length), result: result }; +} +// returns { consumed: number, result: Object } +function _decode(data, offset) { + if (data.length === 0) { + logger.throwError("data too short", logger_1.Logger.errors.BUFFER_OVERRUN, {}); + } + // Array with extra length prefix + if (data[offset] >= 0xf8) { + var lengthLength = data[offset] - 0xf7; + if (offset + 1 + lengthLength > data.length) { + logger.throwError("data short segment too short", logger_1.Logger.errors.BUFFER_OVERRUN, {}); + } + var length_2 = unarrayifyInteger(data, offset + 1, lengthLength); + if (offset + 1 + lengthLength + length_2 > data.length) { + logger.throwError("data long segment too short", logger_1.Logger.errors.BUFFER_OVERRUN, {}); + } + return _decodeChildren(data, offset, offset + 1 + lengthLength, lengthLength + length_2); + } + else if (data[offset] >= 0xc0) { + var length_3 = data[offset] - 0xc0; + if (offset + 1 + length_3 > data.length) { + logger.throwError("data array too short", logger_1.Logger.errors.BUFFER_OVERRUN, {}); + } + return _decodeChildren(data, offset, offset + 1, length_3); + } + else if (data[offset] >= 0xb8) { + var lengthLength = data[offset] - 0xb7; + if (offset + 1 + lengthLength > data.length) { + logger.throwError("data array too short", logger_1.Logger.errors.BUFFER_OVERRUN, {}); + } + var length_4 = unarrayifyInteger(data, offset + 1, lengthLength); + if (offset + 1 + lengthLength + length_4 > data.length) { + logger.throwError("data array too short", logger_1.Logger.errors.BUFFER_OVERRUN, {}); + } + var result = bytes_1.hexlify(data.slice(offset + 1 + lengthLength, offset + 1 + lengthLength + length_4)); + return { consumed: (1 + lengthLength + length_4), result: result }; + } + else if (data[offset] >= 0x80) { + var length_5 = data[offset] - 0x80; + if (offset + 1 + length_5 > data.length) { + logger.throwError("data too short", logger_1.Logger.errors.BUFFER_OVERRUN, {}); + } + var result = bytes_1.hexlify(data.slice(offset + 1, offset + 1 + length_5)); + return { consumed: (1 + length_5), result: result }; + } + return { consumed: 1, result: bytes_1.hexlify(data[offset]) }; +} +function decode(data) { + var bytes = bytes_1.arrayify(data); + var decoded = _decode(bytes, 0); + if (decoded.consumed !== bytes.length) { + logger.throwArgumentError("invalid rlp data", "data", data); + } + return decoded.result; +} +exports.decode = decode; + +},{"./_version":86,"@ethersproject/bytes":33,"@ethersproject/logger":57}],88:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "sha2/5.4.0"; + +},{}],89:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.computeHmac = exports.sha512 = exports.sha256 = exports.ripemd160 = void 0; +var hash_js_1 = __importDefault(require("hash.js")); +//const _ripemd160 = _hash.ripemd160; +var bytes_1 = require("@ethersproject/bytes"); +var types_1 = require("./types"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +function ripemd160(data) { + return "0x" + (hash_js_1.default.ripemd160().update(bytes_1.arrayify(data)).digest("hex")); +} +exports.ripemd160 = ripemd160; +function sha256(data) { + return "0x" + (hash_js_1.default.sha256().update(bytes_1.arrayify(data)).digest("hex")); +} +exports.sha256 = sha256; +function sha512(data) { + return "0x" + (hash_js_1.default.sha512().update(bytes_1.arrayify(data)).digest("hex")); +} +exports.sha512 = sha512; +function computeHmac(algorithm, key, data) { + if (!types_1.SupportedAlgorithm[algorithm]) { + logger.throwError("unsupported algorithm " + algorithm, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "hmac", + algorithm: algorithm + }); + } + return "0x" + hash_js_1.default.hmac(hash_js_1.default[algorithm], bytes_1.arrayify(key)).update(bytes_1.arrayify(data)).digest("hex"); +} +exports.computeHmac = computeHmac; + +},{"./_version":88,"./types":91,"@ethersproject/bytes":33,"@ethersproject/logger":57,"hash.js":195}],90:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SupportedAlgorithm = exports.sha512 = exports.sha256 = exports.ripemd160 = exports.computeHmac = void 0; +var sha2_1 = require("./sha2"); +Object.defineProperty(exports, "computeHmac", { enumerable: true, get: function () { return sha2_1.computeHmac; } }); +Object.defineProperty(exports, "ripemd160", { enumerable: true, get: function () { return sha2_1.ripemd160; } }); +Object.defineProperty(exports, "sha256", { enumerable: true, get: function () { return sha2_1.sha256; } }); +Object.defineProperty(exports, "sha512", { enumerable: true, get: function () { return sha2_1.sha512; } }); +var types_1 = require("./types"); +Object.defineProperty(exports, "SupportedAlgorithm", { enumerable: true, get: function () { return types_1.SupportedAlgorithm; } }); + +},{"./sha2":89,"./types":91}],91:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SupportedAlgorithm = void 0; +var SupportedAlgorithm; +(function (SupportedAlgorithm) { + SupportedAlgorithm["sha256"] = "sha256"; + SupportedAlgorithm["sha512"] = "sha512"; +})(SupportedAlgorithm = exports.SupportedAlgorithm || (exports.SupportedAlgorithm = {})); +; + +},{}],92:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "signing-key/5.4.0"; + +},{}],93:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EC = void 0; +var elliptic_1 = __importDefault(require("elliptic")); +var EC = elliptic_1.default.ec; +exports.EC = EC; + +},{"elliptic":173}],94:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.computePublicKey = exports.recoverPublicKey = exports.SigningKey = void 0; +var elliptic_1 = require("./elliptic"); +var bytes_1 = require("@ethersproject/bytes"); +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var _curve = null; +function getCurve() { + if (!_curve) { + _curve = new elliptic_1.EC("secp256k1"); + } + return _curve; +} +var SigningKey = /** @class */ (function () { + function SigningKey(privateKey) { + properties_1.defineReadOnly(this, "curve", "secp256k1"); + properties_1.defineReadOnly(this, "privateKey", bytes_1.hexlify(privateKey)); + var keyPair = getCurve().keyFromPrivate(bytes_1.arrayify(this.privateKey)); + properties_1.defineReadOnly(this, "publicKey", "0x" + keyPair.getPublic(false, "hex")); + properties_1.defineReadOnly(this, "compressedPublicKey", "0x" + keyPair.getPublic(true, "hex")); + properties_1.defineReadOnly(this, "_isSigningKey", true); + } + SigningKey.prototype._addPoint = function (other) { + var p0 = getCurve().keyFromPublic(bytes_1.arrayify(this.publicKey)); + var p1 = getCurve().keyFromPublic(bytes_1.arrayify(other)); + return "0x" + p0.pub.add(p1.pub).encodeCompressed("hex"); + }; + SigningKey.prototype.signDigest = function (digest) { + var keyPair = getCurve().keyFromPrivate(bytes_1.arrayify(this.privateKey)); + var digestBytes = bytes_1.arrayify(digest); + if (digestBytes.length !== 32) { + logger.throwArgumentError("bad digest length", "digest", digest); + } + var signature = keyPair.sign(digestBytes, { canonical: true }); + return bytes_1.splitSignature({ + recoveryParam: signature.recoveryParam, + r: bytes_1.hexZeroPad("0x" + signature.r.toString(16), 32), + s: bytes_1.hexZeroPad("0x" + signature.s.toString(16), 32), + }); + }; + SigningKey.prototype.computeSharedSecret = function (otherKey) { + var keyPair = getCurve().keyFromPrivate(bytes_1.arrayify(this.privateKey)); + var otherKeyPair = getCurve().keyFromPublic(bytes_1.arrayify(computePublicKey(otherKey))); + return bytes_1.hexZeroPad("0x" + keyPair.derive(otherKeyPair.getPublic()).toString(16), 32); + }; + SigningKey.isSigningKey = function (value) { + return !!(value && value._isSigningKey); + }; + return SigningKey; +}()); +exports.SigningKey = SigningKey; +function recoverPublicKey(digest, signature) { + var sig = bytes_1.splitSignature(signature); + var rs = { r: bytes_1.arrayify(sig.r), s: bytes_1.arrayify(sig.s) }; + return "0x" + getCurve().recoverPubKey(bytes_1.arrayify(digest), rs, sig.recoveryParam).encode("hex", false); +} +exports.recoverPublicKey = recoverPublicKey; +function computePublicKey(key, compressed) { + var bytes = bytes_1.arrayify(key); + if (bytes.length === 32) { + var signingKey = new SigningKey(bytes); + if (compressed) { + return "0x" + getCurve().keyFromPrivate(bytes).getPublic(true, "hex"); + } + return signingKey.publicKey; + } + else if (bytes.length === 33) { + if (compressed) { + return bytes_1.hexlify(bytes); + } + return "0x" + getCurve().keyFromPublic(bytes).getPublic(false, "hex"); + } + else if (bytes.length === 65) { + if (!compressed) { + return bytes_1.hexlify(bytes); + } + return "0x" + getCurve().keyFromPublic(bytes).getPublic(true, "hex"); + } + return logger.throwArgumentError("invalid public or private key", "key", "[REDACTED]"); +} +exports.computePublicKey = computePublicKey; + +},{"./_version":92,"./elliptic":93,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/properties":63}],95:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sha256 = exports.keccak256 = exports.pack = void 0; +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var keccak256_1 = require("@ethersproject/keccak256"); +var sha2_1 = require("@ethersproject/sha2"); +var strings_1 = require("@ethersproject/strings"); +var regexBytes = new RegExp("^bytes([0-9]+)$"); +var regexNumber = new RegExp("^(u?int)([0-9]*)$"); +var regexArray = new RegExp("^(.*)\\[([0-9]*)\\]$"); +var Zeros = "0000000000000000000000000000000000000000000000000000000000000000"; +function _pack(type, value, isArray) { + switch (type) { + case "address": + if (isArray) { + return bytes_1.zeroPad(value, 32); + } + return bytes_1.arrayify(value); + case "string": + return strings_1.toUtf8Bytes(value); + case "bytes": + return bytes_1.arrayify(value); + case "bool": + value = (value ? "0x01" : "0x00"); + if (isArray) { + return bytes_1.zeroPad(value, 32); + } + return bytes_1.arrayify(value); + } + var match = type.match(regexNumber); + if (match) { + //let signed = (match[1] === "int") + var size = parseInt(match[2] || "256"); + if ((match[2] && String(size) !== match[2]) || (size % 8 !== 0) || size === 0 || size > 256) { + throw new Error("invalid number type - " + type); + } + if (isArray) { + size = 256; + } + value = bignumber_1.BigNumber.from(value).toTwos(size); + return bytes_1.zeroPad(value, size / 8); + } + match = type.match(regexBytes); + if (match) { + var size = parseInt(match[1]); + if (String(size) !== match[1] || size === 0 || size > 32) { + throw new Error("invalid bytes type - " + type); + } + if (bytes_1.arrayify(value).byteLength !== size) { + throw new Error("invalid value for " + type); + } + if (isArray) { + return bytes_1.arrayify((value + Zeros).substring(0, 66)); + } + return value; + } + match = type.match(regexArray); + if (match && Array.isArray(value)) { + var baseType_1 = match[1]; + var count = parseInt(match[2] || String(value.length)); + if (count != value.length) { + throw new Error("invalid value for " + type); + } + var result_1 = []; + value.forEach(function (value) { + result_1.push(_pack(baseType_1, value, true)); + }); + return bytes_1.concat(result_1); + } + throw new Error("invalid type - " + type); +} +// @TODO: Array Enum +function pack(types, values) { + if (types.length != values.length) { + throw new Error("type/value count mismatch"); + } + var tight = []; + types.forEach(function (type, index) { + tight.push(_pack(type, values[index])); + }); + return bytes_1.hexlify(bytes_1.concat(tight)); +} +exports.pack = pack; +function keccak256(types, values) { + return keccak256_1.keccak256(pack(types, values)); +} +exports.keccak256 = keccak256; +function sha256(types, values) { + return sha2_1.sha256(pack(types, values)); +} +exports.sha256 = sha256; + +},{"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/keccak256":55,"@ethersproject/sha2":90,"@ethersproject/strings":99}],96:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "strings/5.4.0"; + +},{}],97:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseBytes32String = exports.formatBytes32String = void 0; +var constants_1 = require("@ethersproject/constants"); +var bytes_1 = require("@ethersproject/bytes"); +var utf8_1 = require("./utf8"); +function formatBytes32String(text) { + // Get the bytes + var bytes = utf8_1.toUtf8Bytes(text); + // Check we have room for null-termination + if (bytes.length > 31) { + throw new Error("bytes32 string must be less than 32 bytes"); + } + // Zero-pad (implicitly null-terminates) + return bytes_1.hexlify(bytes_1.concat([bytes, constants_1.HashZero]).slice(0, 32)); +} +exports.formatBytes32String = formatBytes32String; +function parseBytes32String(bytes) { + var data = bytes_1.arrayify(bytes); + // Must be 32 bytes with a null-termination + if (data.length !== 32) { + throw new Error("invalid bytes32 - not 32 bytes long"); + } + if (data[31] !== 0) { + throw new Error("invalid bytes32 string - no null terminator"); + } + // Find the null termination + var length = 31; + while (data[length - 1] === 0) { + length--; + } + // Determine the string value + return utf8_1.toUtf8String(data.slice(0, length)); +} +exports.parseBytes32String = parseBytes32String; + +},{"./utf8":100,"@ethersproject/bytes":33,"@ethersproject/constants":37}],98:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.nameprep = exports._nameprepTableC = exports._nameprepTableB2 = exports._nameprepTableA1 = void 0; +var utf8_1 = require("./utf8"); +function bytes2(data) { + if ((data.length % 4) !== 0) { + throw new Error("bad data"); + } + var result = []; + for (var i = 0; i < data.length; i += 4) { + result.push(parseInt(data.substring(i, i + 4), 16)); + } + return result; +} +function createTable(data, func) { + if (!func) { + func = function (value) { return [parseInt(value, 16)]; }; + } + var lo = 0; + var result = {}; + data.split(",").forEach(function (pair) { + var comps = pair.split(":"); + lo += parseInt(comps[0], 16); + result[lo] = func(comps[1]); + }); + return result; +} +function createRangeTable(data) { + var hi = 0; + return data.split(",").map(function (v) { + var comps = v.split("-"); + if (comps.length === 1) { + comps[1] = "0"; + } + else if (comps[1] === "") { + comps[1] = "1"; + } + var lo = hi + parseInt(comps[0], 16); + hi = parseInt(comps[1], 16); + return { l: lo, h: hi }; + }); +} +function matchMap(value, ranges) { + var lo = 0; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + lo += range.l; + if (value >= lo && value <= lo + range.h && ((value - lo) % (range.d || 1)) === 0) { + if (range.e && range.e.indexOf(value - lo) !== -1) { + continue; + } + return range; + } + } + return null; +} +var Table_A_1_ranges = createRangeTable("221,13-1b,5f-,40-10,51-f,11-3,3-3,2-2,2-4,8,2,15,2d,28-8,88,48,27-,3-5,11-20,27-,8,28,3-5,12,18,b-a,1c-4,6-16,2-d,2-2,2,1b-4,17-9,8f-,10,f,1f-2,1c-34,33-14e,4,36-,13-,6-2,1a-f,4,9-,3-,17,8,2-2,5-,2,8-,3-,4-8,2-3,3,6-,16-6,2-,7-3,3-,17,8,3,3,3-,2,6-3,3-,4-a,5,2-6,10-b,4,8,2,4,17,8,3,6-,b,4,4-,2-e,2-4,b-10,4,9-,3-,17,8,3-,5-,9-2,3-,4-7,3-3,3,4-3,c-10,3,7-2,4,5-2,3,2,3-2,3-2,4-2,9,4-3,6-2,4,5-8,2-e,d-d,4,9,4,18,b,6-3,8,4,5-6,3-8,3-3,b-11,3,9,4,18,b,6-3,8,4,5-6,3-6,2,3-3,b-11,3,9,4,18,11-3,7-,4,5-8,2-7,3-3,b-11,3,13-2,19,a,2-,8-2,2-3,7,2,9-11,4-b,3b-3,1e-24,3,2-,3,2-,2-5,5,8,4,2,2-,3,e,4-,6,2,7-,b-,3-21,49,23-5,1c-3,9,25,10-,2-2f,23,6,3,8-2,5-5,1b-45,27-9,2a-,2-3,5b-4,45-4,53-5,8,40,2,5-,8,2,5-,28,2,5-,20,2,5-,8,2,5-,8,8,18,20,2,5-,8,28,14-5,1d-22,56-b,277-8,1e-2,52-e,e,8-a,18-8,15-b,e,4,3-b,5e-2,b-15,10,b-5,59-7,2b-555,9d-3,5b-5,17-,7-,27-,7-,9,2,2,2,20-,36,10,f-,7,14-,4,a,54-3,2-6,6-5,9-,1c-10,13-1d,1c-14,3c-,10-6,32-b,240-30,28-18,c-14,a0,115-,3,66-,b-76,5,5-,1d,24,2,5-2,2,8-,35-2,19,f-10,1d-3,311-37f,1b,5a-b,d7-19,d-3,41,57-,68-4,29-3,5f,29-37,2e-2,25-c,2c-2,4e-3,30,78-3,64-,20,19b7-49,51a7-59,48e-2,38-738,2ba5-5b,222f-,3c-94,8-b,6-4,1b,6,2,3,3,6d-20,16e-f,41-,37-7,2e-2,11-f,5-b,18-,b,14,5-3,6,88-,2,bf-2,7-,7-,7-,4-2,8,8-9,8-2ff,20,5-b,1c-b4,27-,27-cbb1,f7-9,28-2,b5-221,56,48,3-,2-,3-,5,d,2,5,3,42,5-,9,8,1d,5,6,2-2,8,153-3,123-3,33-27fd,a6da-5128,21f-5df,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3,2-1d,61-ff7d"); +// @TODO: Make this relative... +var Table_B_1_flags = "ad,34f,1806,180b,180c,180d,200b,200c,200d,2060,feff".split(",").map(function (v) { return parseInt(v, 16); }); +var Table_B_2_ranges = [ + { h: 25, s: 32, l: 65 }, + { h: 30, s: 32, e: [23], l: 127 }, + { h: 54, s: 1, e: [48], l: 64, d: 2 }, + { h: 14, s: 1, l: 57, d: 2 }, + { h: 44, s: 1, l: 17, d: 2 }, + { h: 10, s: 1, e: [2, 6, 8], l: 61, d: 2 }, + { h: 16, s: 1, l: 68, d: 2 }, + { h: 84, s: 1, e: [18, 24, 66], l: 19, d: 2 }, + { h: 26, s: 32, e: [17], l: 435 }, + { h: 22, s: 1, l: 71, d: 2 }, + { h: 15, s: 80, l: 40 }, + { h: 31, s: 32, l: 16 }, + { h: 32, s: 1, l: 80, d: 2 }, + { h: 52, s: 1, l: 42, d: 2 }, + { h: 12, s: 1, l: 55, d: 2 }, + { h: 40, s: 1, e: [38], l: 15, d: 2 }, + { h: 14, s: 1, l: 48, d: 2 }, + { h: 37, s: 48, l: 49 }, + { h: 148, s: 1, l: 6351, d: 2 }, + { h: 88, s: 1, l: 160, d: 2 }, + { h: 15, s: 16, l: 704 }, + { h: 25, s: 26, l: 854 }, + { h: 25, s: 32, l: 55915 }, + { h: 37, s: 40, l: 1247 }, + { h: 25, s: -119711, l: 53248 }, + { h: 25, s: -119763, l: 52 }, + { h: 25, s: -119815, l: 52 }, + { h: 25, s: -119867, e: [1, 4, 5, 7, 8, 11, 12, 17], l: 52 }, + { h: 25, s: -119919, l: 52 }, + { h: 24, s: -119971, e: [2, 7, 8, 17], l: 52 }, + { h: 24, s: -120023, e: [2, 7, 13, 15, 16, 17], l: 52 }, + { h: 25, s: -120075, l: 52 }, + { h: 25, s: -120127, l: 52 }, + { h: 25, s: -120179, l: 52 }, + { h: 25, s: -120231, l: 52 }, + { h: 25, s: -120283, l: 52 }, + { h: 25, s: -120335, l: 52 }, + { h: 24, s: -119543, e: [17], l: 56 }, + { h: 24, s: -119601, e: [17], l: 58 }, + { h: 24, s: -119659, e: [17], l: 58 }, + { h: 24, s: -119717, e: [17], l: 58 }, + { h: 24, s: -119775, e: [17], l: 58 } +]; +var Table_B_2_lut_abs = createTable("b5:3bc,c3:ff,7:73,2:253,5:254,3:256,1:257,5:259,1:25b,3:260,1:263,2:269,1:268,5:26f,1:272,2:275,7:280,3:283,5:288,3:28a,1:28b,5:292,3f:195,1:1bf,29:19e,125:3b9,8b:3b2,1:3b8,1:3c5,3:3c6,1:3c0,1a:3ba,1:3c1,1:3c3,2:3b8,1:3b5,1bc9:3b9,1c:1f76,1:1f77,f:1f7a,1:1f7b,d:1f78,1:1f79,1:1f7c,1:1f7d,107:63,5:25b,4:68,1:68,1:68,3:69,1:69,1:6c,3:6e,4:70,1:71,1:72,1:72,1:72,7:7a,2:3c9,2:7a,2:6b,1:e5,1:62,1:63,3:65,1:66,2:6d,b:3b3,1:3c0,6:64,1b574:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3"); +var Table_B_2_lut_rel = createTable("179:1,2:1,2:1,5:1,2:1,a:4f,a:1,8:1,2:1,2:1,3:1,5:1,3:1,4:1,2:1,3:1,4:1,8:2,1:1,2:2,1:1,2:2,27:2,195:26,2:25,1:25,1:25,2:40,2:3f,1:3f,33:1,11:-6,1:-9,1ac7:-3a,6d:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,b:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,c:-8,2:-8,2:-8,2:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,49:-8,1:-8,1:-4a,1:-4a,d:-56,1:-56,1:-56,1:-56,d:-8,1:-8,f:-8,1:-8,3:-7"); +var Table_B_2_complex = createTable("df:00730073,51:00690307,19:02BC006E,a7:006A030C,18a:002003B9,16:03B903080301,20:03C503080301,1d7:05650582,190f:00680331,1:00740308,1:0077030A,1:0079030A,1:006102BE,b6:03C50313,2:03C503130300,2:03C503130301,2:03C503130342,2a:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,3:1F7003B9,1:03B103B9,1:03AC03B9,2:03B10342,1:03B1034203B9,5:03B103B9,6:1F7403B9,1:03B703B9,1:03AE03B9,2:03B70342,1:03B7034203B9,5:03B703B9,6:03B903080300,1:03B903080301,3:03B90342,1:03B903080342,b:03C503080300,1:03C503080301,1:03C10313,2:03C50342,1:03C503080342,b:1F7C03B9,1:03C903B9,1:03CE03B9,2:03C90342,1:03C9034203B9,5:03C903B9,ac:00720073,5b:00B00063,6:00B00066,d:006E006F,a:0073006D,1:00740065006C,1:0074006D,124f:006800700061,2:00610075,2:006F0076,b:00700061,1:006E0061,1:03BC0061,1:006D0061,1:006B0061,1:006B0062,1:006D0062,1:00670062,3:00700066,1:006E0066,1:03BC0066,4:0068007A,1:006B0068007A,1:006D0068007A,1:00670068007A,1:00740068007A,15:00700061,1:006B00700061,1:006D00700061,1:006700700061,8:00700076,1:006E0076,1:03BC0076,1:006D0076,1:006B0076,1:006D0076,1:00700077,1:006E0077,1:03BC0077,1:006D0077,1:006B0077,1:006D0077,1:006B03C9,1:006D03C9,2:00620071,3:00632215006B0067,1:0063006F002E,1:00640062,1:00670079,2:00680070,2:006B006B,1:006B006D,9:00700068,2:00700070006D,1:00700072,2:00730076,1:00770062,c723:00660066,1:00660069,1:0066006C,1:006600660069,1:00660066006C,1:00730074,1:00730074,d:05740576,1:05740565,1:0574056B,1:057E0576,1:0574056D", bytes2); +var Table_C_ranges = createRangeTable("80-20,2a0-,39c,32,f71,18e,7f2-f,19-7,30-4,7-5,f81-b,5,a800-20ff,4d1-1f,110,fa-6,d174-7,2e84-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,2,1f-5f,ff7f-20001"); +function flatten(values) { + return values.reduce(function (accum, value) { + value.forEach(function (value) { accum.push(value); }); + return accum; + }, []); +} +function _nameprepTableA1(codepoint) { + return !!matchMap(codepoint, Table_A_1_ranges); +} +exports._nameprepTableA1 = _nameprepTableA1; +function _nameprepTableB2(codepoint) { + var range = matchMap(codepoint, Table_B_2_ranges); + if (range) { + return [codepoint + range.s]; + } + var codes = Table_B_2_lut_abs[codepoint]; + if (codes) { + return codes; + } + var shift = Table_B_2_lut_rel[codepoint]; + if (shift) { + return [codepoint + shift[0]]; + } + var complex = Table_B_2_complex[codepoint]; + if (complex) { + return complex; + } + return null; +} +exports._nameprepTableB2 = _nameprepTableB2; +function _nameprepTableC(codepoint) { + return !!matchMap(codepoint, Table_C_ranges); +} +exports._nameprepTableC = _nameprepTableC; +function nameprep(value) { + // This allows platforms with incomplete normalize to bypass + // it for very basic names which the built-in toLowerCase + // will certainly handle correctly + if (value.match(/^[a-z0-9-]*$/i) && value.length <= 59) { + return value.toLowerCase(); + } + // Get the code points (keeping the current normalization) + var codes = utf8_1.toUtf8CodePoints(value); + codes = flatten(codes.map(function (code) { + // Substitute Table B.1 (Maps to Nothing) + if (Table_B_1_flags.indexOf(code) >= 0) { + return []; + } + if (code >= 0xfe00 && code <= 0xfe0f) { + return []; + } + // Substitute Table B.2 (Case Folding) + var codesTableB2 = _nameprepTableB2(code); + if (codesTableB2) { + return codesTableB2; + } + // No Substitution + return [code]; + })); + // Normalize using form KC + codes = utf8_1.toUtf8CodePoints(utf8_1._toUtf8String(codes), utf8_1.UnicodeNormalizationForm.NFKC); + // Prohibit Tables C.1.2, C.2.2, C.3, C.4, C.5, C.6, C.7, C.8, C.9 + codes.forEach(function (code) { + if (_nameprepTableC(code)) { + throw new Error("STRINGPREP_CONTAINS_PROHIBITED"); + } + }); + // Prohibit Unassigned Code Points (Table A.1) + codes.forEach(function (code) { + if (_nameprepTableA1(code)) { + throw new Error("STRINGPREP_CONTAINS_UNASSIGNED"); + } + }); + // IDNA extras + var name = utf8_1._toUtf8String(codes); + // IDNA: 4.2.3.1 + if (name.substring(0, 1) === "-" || name.substring(2, 4) === "--" || name.substring(name.length - 1) === "-") { + throw new Error("invalid hyphen"); + } + // IDNA: 4.2.4 + if (name.length > 63) { + throw new Error("too long"); + } + return name; +} +exports.nameprep = nameprep; + +},{"./utf8":100}],99:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.nameprep = exports.parseBytes32String = exports.formatBytes32String = exports.UnicodeNormalizationForm = exports.Utf8ErrorReason = exports.Utf8ErrorFuncs = exports.toUtf8String = exports.toUtf8CodePoints = exports.toUtf8Bytes = exports._toEscapedUtf8String = void 0; +var bytes32_1 = require("./bytes32"); +Object.defineProperty(exports, "formatBytes32String", { enumerable: true, get: function () { return bytes32_1.formatBytes32String; } }); +Object.defineProperty(exports, "parseBytes32String", { enumerable: true, get: function () { return bytes32_1.parseBytes32String; } }); +var idna_1 = require("./idna"); +Object.defineProperty(exports, "nameprep", { enumerable: true, get: function () { return idna_1.nameprep; } }); +var utf8_1 = require("./utf8"); +Object.defineProperty(exports, "_toEscapedUtf8String", { enumerable: true, get: function () { return utf8_1._toEscapedUtf8String; } }); +Object.defineProperty(exports, "toUtf8Bytes", { enumerable: true, get: function () { return utf8_1.toUtf8Bytes; } }); +Object.defineProperty(exports, "toUtf8CodePoints", { enumerable: true, get: function () { return utf8_1.toUtf8CodePoints; } }); +Object.defineProperty(exports, "toUtf8String", { enumerable: true, get: function () { return utf8_1.toUtf8String; } }); +Object.defineProperty(exports, "UnicodeNormalizationForm", { enumerable: true, get: function () { return utf8_1.UnicodeNormalizationForm; } }); +Object.defineProperty(exports, "Utf8ErrorFuncs", { enumerable: true, get: function () { return utf8_1.Utf8ErrorFuncs; } }); +Object.defineProperty(exports, "Utf8ErrorReason", { enumerable: true, get: function () { return utf8_1.Utf8ErrorReason; } }); + +},{"./bytes32":97,"./idna":98,"./utf8":100}],100:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.toUtf8CodePoints = exports.toUtf8String = exports._toUtf8String = exports._toEscapedUtf8String = exports.toUtf8Bytes = exports.Utf8ErrorFuncs = exports.Utf8ErrorReason = exports.UnicodeNormalizationForm = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +/////////////////////////////// +var UnicodeNormalizationForm; +(function (UnicodeNormalizationForm) { + UnicodeNormalizationForm["current"] = ""; + UnicodeNormalizationForm["NFC"] = "NFC"; + UnicodeNormalizationForm["NFD"] = "NFD"; + UnicodeNormalizationForm["NFKC"] = "NFKC"; + UnicodeNormalizationForm["NFKD"] = "NFKD"; +})(UnicodeNormalizationForm = exports.UnicodeNormalizationForm || (exports.UnicodeNormalizationForm = {})); +; +var Utf8ErrorReason; +(function (Utf8ErrorReason) { + // A continuation byte was present where there was nothing to continue + // - offset = the index the codepoint began in + Utf8ErrorReason["UNEXPECTED_CONTINUE"] = "unexpected continuation byte"; + // An invalid (non-continuation) byte to start a UTF-8 codepoint was found + // - offset = the index the codepoint began in + Utf8ErrorReason["BAD_PREFIX"] = "bad codepoint prefix"; + // The string is too short to process the expected codepoint + // - offset = the index the codepoint began in + Utf8ErrorReason["OVERRUN"] = "string overrun"; + // A missing continuation byte was expected but not found + // - offset = the index the continuation byte was expected at + Utf8ErrorReason["MISSING_CONTINUE"] = "missing continuation byte"; + // The computed code point is outside the range for UTF-8 + // - offset = start of this codepoint + // - badCodepoint = the computed codepoint; outside the UTF-8 range + Utf8ErrorReason["OUT_OF_RANGE"] = "out of UTF-8 range"; + // UTF-8 strings may not contain UTF-16 surrogate pairs + // - offset = start of this codepoint + // - badCodepoint = the computed codepoint; inside the UTF-16 surrogate range + Utf8ErrorReason["UTF16_SURROGATE"] = "UTF-16 surrogate"; + // The string is an overlong reperesentation + // - offset = start of this codepoint + // - badCodepoint = the computed codepoint; already bounds checked + Utf8ErrorReason["OVERLONG"] = "overlong representation"; +})(Utf8ErrorReason = exports.Utf8ErrorReason || (exports.Utf8ErrorReason = {})); +; +function errorFunc(reason, offset, bytes, output, badCodepoint) { + return logger.throwArgumentError("invalid codepoint at offset " + offset + "; " + reason, "bytes", bytes); +} +function ignoreFunc(reason, offset, bytes, output, badCodepoint) { + // If there is an invalid prefix (including stray continuation), skip any additional continuation bytes + if (reason === Utf8ErrorReason.BAD_PREFIX || reason === Utf8ErrorReason.UNEXPECTED_CONTINUE) { + var i = 0; + for (var o = offset + 1; o < bytes.length; o++) { + if (bytes[o] >> 6 !== 0x02) { + break; + } + i++; + } + return i; + } + // This byte runs us past the end of the string, so just jump to the end + // (but the first byte was read already read and therefore skipped) + if (reason === Utf8ErrorReason.OVERRUN) { + return bytes.length - offset - 1; + } + // Nothing to skip + return 0; +} +function replaceFunc(reason, offset, bytes, output, badCodepoint) { + // Overlong representations are otherwise "valid" code points; just non-deistingtished + if (reason === Utf8ErrorReason.OVERLONG) { + output.push(badCodepoint); + return 0; + } + // Put the replacement character into the output + output.push(0xfffd); + // Otherwise, process as if ignoring errors + return ignoreFunc(reason, offset, bytes, output, badCodepoint); +} +// Common error handing strategies +exports.Utf8ErrorFuncs = Object.freeze({ + error: errorFunc, + ignore: ignoreFunc, + replace: replaceFunc +}); +// http://stackoverflow.com/questions/13356493/decode-utf-8-with-javascript#13691499 +function getUtf8CodePoints(bytes, onError) { + if (onError == null) { + onError = exports.Utf8ErrorFuncs.error; + } + bytes = bytes_1.arrayify(bytes); + var result = []; + var i = 0; + // Invalid bytes are ignored + while (i < bytes.length) { + var c = bytes[i++]; + // 0xxx xxxx + if (c >> 7 === 0) { + result.push(c); + continue; + } + // Multibyte; how many bytes left for this character? + var extraLength = null; + var overlongMask = null; + // 110x xxxx 10xx xxxx + if ((c & 0xe0) === 0xc0) { + extraLength = 1; + overlongMask = 0x7f; + // 1110 xxxx 10xx xxxx 10xx xxxx + } + else if ((c & 0xf0) === 0xe0) { + extraLength = 2; + overlongMask = 0x7ff; + // 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx + } + else if ((c & 0xf8) === 0xf0) { + extraLength = 3; + overlongMask = 0xffff; + } + else { + if ((c & 0xc0) === 0x80) { + i += onError(Utf8ErrorReason.UNEXPECTED_CONTINUE, i - 1, bytes, result); + } + else { + i += onError(Utf8ErrorReason.BAD_PREFIX, i - 1, bytes, result); + } + continue; + } + // Do we have enough bytes in our data? + if (i - 1 + extraLength >= bytes.length) { + i += onError(Utf8ErrorReason.OVERRUN, i - 1, bytes, result); + continue; + } + // Remove the length prefix from the char + var res = c & ((1 << (8 - extraLength - 1)) - 1); + for (var j = 0; j < extraLength; j++) { + var nextChar = bytes[i]; + // Invalid continuation byte + if ((nextChar & 0xc0) != 0x80) { + i += onError(Utf8ErrorReason.MISSING_CONTINUE, i, bytes, result); + res = null; + break; + } + ; + res = (res << 6) | (nextChar & 0x3f); + i++; + } + // See above loop for invalid contimuation byte + if (res === null) { + continue; + } + // Maximum code point + if (res > 0x10ffff) { + i += onError(Utf8ErrorReason.OUT_OF_RANGE, i - 1 - extraLength, bytes, result, res); + continue; + } + // Reserved for UTF-16 surrogate halves + if (res >= 0xd800 && res <= 0xdfff) { + i += onError(Utf8ErrorReason.UTF16_SURROGATE, i - 1 - extraLength, bytes, result, res); + continue; + } + // Check for overlong sequences (more bytes than needed) + if (res <= overlongMask) { + i += onError(Utf8ErrorReason.OVERLONG, i - 1 - extraLength, bytes, result, res); + continue; + } + result.push(res); + } + return result; +} +// http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array +function toUtf8Bytes(str, form) { + if (form === void 0) { form = UnicodeNormalizationForm.current; } + if (form != UnicodeNormalizationForm.current) { + logger.checkNormalize(); + str = str.normalize(form); + } + var result = []; + for (var i = 0; i < str.length; i++) { + var c = str.charCodeAt(i); + if (c < 0x80) { + result.push(c); + } + else if (c < 0x800) { + result.push((c >> 6) | 0xc0); + result.push((c & 0x3f) | 0x80); + } + else if ((c & 0xfc00) == 0xd800) { + i++; + var c2 = str.charCodeAt(i); + if (i >= str.length || (c2 & 0xfc00) !== 0xdc00) { + throw new Error("invalid utf-8 string"); + } + // Surrogate Pair + var pair = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff); + result.push((pair >> 18) | 0xf0); + result.push(((pair >> 12) & 0x3f) | 0x80); + result.push(((pair >> 6) & 0x3f) | 0x80); + result.push((pair & 0x3f) | 0x80); + } + else { + result.push((c >> 12) | 0xe0); + result.push(((c >> 6) & 0x3f) | 0x80); + result.push((c & 0x3f) | 0x80); + } + } + return bytes_1.arrayify(result); +} +exports.toUtf8Bytes = toUtf8Bytes; +; +function escapeChar(value) { + var hex = ("0000" + value.toString(16)); + return "\\u" + hex.substring(hex.length - 4); +} +function _toEscapedUtf8String(bytes, onError) { + return '"' + getUtf8CodePoints(bytes, onError).map(function (codePoint) { + if (codePoint < 256) { + switch (codePoint) { + case 8: return "\\b"; + case 9: return "\\t"; + case 10: return "\\n"; + case 13: return "\\r"; + case 34: return "\\\""; + case 92: return "\\\\"; + } + if (codePoint >= 32 && codePoint < 127) { + return String.fromCharCode(codePoint); + } + } + if (codePoint <= 0xffff) { + return escapeChar(codePoint); + } + codePoint -= 0x10000; + return escapeChar(((codePoint >> 10) & 0x3ff) + 0xd800) + escapeChar((codePoint & 0x3ff) + 0xdc00); + }).join("") + '"'; +} +exports._toEscapedUtf8String = _toEscapedUtf8String; +function _toUtf8String(codePoints) { + return codePoints.map(function (codePoint) { + if (codePoint <= 0xffff) { + return String.fromCharCode(codePoint); + } + codePoint -= 0x10000; + return String.fromCharCode((((codePoint >> 10) & 0x3ff) + 0xd800), ((codePoint & 0x3ff) + 0xdc00)); + }).join(""); +} +exports._toUtf8String = _toUtf8String; +function toUtf8String(bytes, onError) { + return _toUtf8String(getUtf8CodePoints(bytes, onError)); +} +exports.toUtf8String = toUtf8String; +function toUtf8CodePoints(str, form) { + if (form === void 0) { form = UnicodeNormalizationForm.current; } + return getUtf8CodePoints(toUtf8Bytes(str, form)); +} +exports.toUtf8CodePoints = toUtf8CodePoints; + +},{"./_version":96,"@ethersproject/bytes":33,"@ethersproject/logger":57}],101:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "transactions/5.4.0"; + +},{}],102:[function(require,module,exports){ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parse = exports.serialize = exports.accessListify = exports.recoverAddress = exports.computeAddress = exports.TransactionTypes = void 0; +var address_1 = require("@ethersproject/address"); +var bignumber_1 = require("@ethersproject/bignumber"); +var bytes_1 = require("@ethersproject/bytes"); +var constants_1 = require("@ethersproject/constants"); +var keccak256_1 = require("@ethersproject/keccak256"); +var properties_1 = require("@ethersproject/properties"); +var RLP = __importStar(require("@ethersproject/rlp")); +var signing_key_1 = require("@ethersproject/signing-key"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var TransactionTypes; +(function (TransactionTypes) { + TransactionTypes[TransactionTypes["legacy"] = 0] = "legacy"; + TransactionTypes[TransactionTypes["eip2930"] = 1] = "eip2930"; + TransactionTypes[TransactionTypes["eip1559"] = 2] = "eip1559"; +})(TransactionTypes = exports.TransactionTypes || (exports.TransactionTypes = {})); +; +/////////////////////////////// +function handleAddress(value) { + if (value === "0x") { + return null; + } + return address_1.getAddress(value); +} +function handleNumber(value) { + if (value === "0x") { + return constants_1.Zero; + } + return bignumber_1.BigNumber.from(value); +} +// Legacy Transaction Fields +var transactionFields = [ + { name: "nonce", maxLength: 32, numeric: true }, + { name: "gasPrice", maxLength: 32, numeric: true }, + { name: "gasLimit", maxLength: 32, numeric: true }, + { name: "to", length: 20 }, + { name: "value", maxLength: 32, numeric: true }, + { name: "data" }, +]; +var allowedTransactionKeys = { + chainId: true, data: true, gasLimit: true, gasPrice: true, nonce: true, to: true, type: true, value: true +}; +function computeAddress(key) { + var publicKey = signing_key_1.computePublicKey(key); + return address_1.getAddress(bytes_1.hexDataSlice(keccak256_1.keccak256(bytes_1.hexDataSlice(publicKey, 1)), 12)); +} +exports.computeAddress = computeAddress; +function recoverAddress(digest, signature) { + return computeAddress(signing_key_1.recoverPublicKey(bytes_1.arrayify(digest), signature)); +} +exports.recoverAddress = recoverAddress; +function formatNumber(value, name) { + var result = bytes_1.stripZeros(bignumber_1.BigNumber.from(value).toHexString()); + if (result.length > 32) { + logger.throwArgumentError("invalid length for " + name, ("transaction:" + name), value); + } + return result; +} +function accessSetify(addr, storageKeys) { + return { + address: address_1.getAddress(addr), + storageKeys: (storageKeys || []).map(function (storageKey, index) { + if (bytes_1.hexDataLength(storageKey) !== 32) { + logger.throwArgumentError("invalid access list storageKey", "accessList[" + addr + ":" + index + "]", storageKey); + } + return storageKey.toLowerCase(); + }) + }; +} +function accessListify(value) { + if (Array.isArray(value)) { + return value.map(function (set, index) { + if (Array.isArray(set)) { + if (set.length > 2) { + logger.throwArgumentError("access list expected to be [ address, storageKeys[] ]", "value[" + index + "]", set); + } + return accessSetify(set[0], set[1]); + } + return accessSetify(set.address, set.storageKeys); + }); + } + var result = Object.keys(value).map(function (addr) { + var storageKeys = value[addr].reduce(function (accum, storageKey) { + accum[storageKey] = true; + return accum; + }, {}); + return accessSetify(addr, Object.keys(storageKeys).sort()); + }); + result.sort(function (a, b) { return (a.address.localeCompare(b.address)); }); + return result; +} +exports.accessListify = accessListify; +function formatAccessList(value) { + return accessListify(value).map(function (set) { return [set.address, set.storageKeys]; }); +} +function _serializeEip1559(transaction, signature) { + // If there is an explicit gasPrice, make sure it matches the + // EIP-1559 fees; otherwise they may not understand what they + // think they are setting in terms of fee. + if (transaction.gasPrice != null) { + var gasPrice = bignumber_1.BigNumber.from(transaction.gasPrice); + var maxFeePerGas = bignumber_1.BigNumber.from(transaction.maxFeePerGas || 0); + if (!gasPrice.eq(maxFeePerGas)) { + logger.throwArgumentError("mismatch EIP-1559 gasPrice != maxFeePerGas", "tx", { + gasPrice: gasPrice, maxFeePerGas: maxFeePerGas + }); + } + } + var fields = [ + formatNumber(transaction.chainId || 0, "chainId"), + formatNumber(transaction.nonce || 0, "nonce"), + formatNumber(transaction.maxPriorityFeePerGas || 0, "maxPriorityFeePerGas"), + formatNumber(transaction.maxFeePerGas || 0, "maxFeePerGas"), + formatNumber(transaction.gasLimit || 0, "gasLimit"), + ((transaction.to != null) ? address_1.getAddress(transaction.to) : "0x"), + formatNumber(transaction.value || 0, "value"), + (transaction.data || "0x"), + (formatAccessList(transaction.accessList || [])) + ]; + if (signature) { + var sig = bytes_1.splitSignature(signature); + fields.push(formatNumber(sig.recoveryParam, "recoveryParam")); + fields.push(bytes_1.stripZeros(sig.r)); + fields.push(bytes_1.stripZeros(sig.s)); + } + return bytes_1.hexConcat(["0x02", RLP.encode(fields)]); +} +function _serializeEip2930(transaction, signature) { + var fields = [ + formatNumber(transaction.chainId || 0, "chainId"), + formatNumber(transaction.nonce || 0, "nonce"), + formatNumber(transaction.gasPrice || 0, "gasPrice"), + formatNumber(transaction.gasLimit || 0, "gasLimit"), + ((transaction.to != null) ? address_1.getAddress(transaction.to) : "0x"), + formatNumber(transaction.value || 0, "value"), + (transaction.data || "0x"), + (formatAccessList(transaction.accessList || [])) + ]; + if (signature) { + var sig = bytes_1.splitSignature(signature); + fields.push(formatNumber(sig.recoveryParam, "recoveryParam")); + fields.push(bytes_1.stripZeros(sig.r)); + fields.push(bytes_1.stripZeros(sig.s)); + } + return bytes_1.hexConcat(["0x01", RLP.encode(fields)]); +} +// Legacy Transactions and EIP-155 +function _serialize(transaction, signature) { + properties_1.checkProperties(transaction, allowedTransactionKeys); + var raw = []; + transactionFields.forEach(function (fieldInfo) { + var value = transaction[fieldInfo.name] || ([]); + var options = {}; + if (fieldInfo.numeric) { + options.hexPad = "left"; + } + value = bytes_1.arrayify(bytes_1.hexlify(value, options)); + // Fixed-width field + if (fieldInfo.length && value.length !== fieldInfo.length && value.length > 0) { + logger.throwArgumentError("invalid length for " + fieldInfo.name, ("transaction:" + fieldInfo.name), value); + } + // Variable-width (with a maximum) + if (fieldInfo.maxLength) { + value = bytes_1.stripZeros(value); + if (value.length > fieldInfo.maxLength) { + logger.throwArgumentError("invalid length for " + fieldInfo.name, ("transaction:" + fieldInfo.name), value); + } + } + raw.push(bytes_1.hexlify(value)); + }); + var chainId = 0; + if (transaction.chainId != null) { + // A chainId was provided; if non-zero we'll use EIP-155 + chainId = transaction.chainId; + if (typeof (chainId) !== "number") { + logger.throwArgumentError("invalid transaction.chainId", "transaction", transaction); + } + } + else if (signature && !bytes_1.isBytesLike(signature) && signature.v > 28) { + // No chainId provided, but the signature is signing with EIP-155; derive chainId + chainId = Math.floor((signature.v - 35) / 2); + } + // We have an EIP-155 transaction (chainId was specified and non-zero) + if (chainId !== 0) { + raw.push(bytes_1.hexlify(chainId)); // @TODO: hexValue? + raw.push("0x"); + raw.push("0x"); + } + // Requesting an unsigned transation + if (!signature) { + return RLP.encode(raw); + } + // The splitSignature will ensure the transaction has a recoveryParam in the + // case that the signTransaction function only adds a v. + var sig = bytes_1.splitSignature(signature); + // We pushed a chainId and null r, s on for hashing only; remove those + var v = 27 + sig.recoveryParam; + if (chainId !== 0) { + raw.pop(); + raw.pop(); + raw.pop(); + v += chainId * 2 + 8; + // If an EIP-155 v (directly or indirectly; maybe _vs) was provided, check it! + if (sig.v > 28 && sig.v !== v) { + logger.throwArgumentError("transaction.chainId/signature.v mismatch", "signature", signature); + } + } + else if (sig.v !== v) { + logger.throwArgumentError("transaction.chainId/signature.v mismatch", "signature", signature); + } + raw.push(bytes_1.hexlify(v)); + raw.push(bytes_1.stripZeros(bytes_1.arrayify(sig.r))); + raw.push(bytes_1.stripZeros(bytes_1.arrayify(sig.s))); + return RLP.encode(raw); +} +function serialize(transaction, signature) { + // Legacy and EIP-155 Transactions + if (transaction.type == null || transaction.type === 0) { + if (transaction.accessList != null) { + logger.throwArgumentError("untyped transactions do not support accessList; include type: 1", "transaction", transaction); + } + return _serialize(transaction, signature); + } + // Typed Transactions (EIP-2718) + switch (transaction.type) { + case 1: + return _serializeEip2930(transaction, signature); + case 2: + return _serializeEip1559(transaction, signature); + default: + break; + } + return logger.throwError("unsupported transaction type: " + transaction.type, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "serializeTransaction", + transactionType: transaction.type + }); +} +exports.serialize = serialize; +function _parseEipSignature(tx, fields, serialize) { + try { + var recid = handleNumber(fields[0]).toNumber(); + if (recid !== 0 && recid !== 1) { + throw new Error("bad recid"); + } + tx.v = recid; + } + catch (error) { + logger.throwArgumentError("invalid v for transaction type: 1", "v", fields[0]); + } + tx.r = bytes_1.hexZeroPad(fields[1], 32); + tx.s = bytes_1.hexZeroPad(fields[2], 32); + try { + var digest = keccak256_1.keccak256(serialize(tx)); + tx.from = recoverAddress(digest, { r: tx.r, s: tx.s, recoveryParam: tx.v }); + } + catch (error) { + console.log(error); + } +} +function _parseEip1559(payload) { + var transaction = RLP.decode(payload.slice(1)); + if (transaction.length !== 9 && transaction.length !== 12) { + logger.throwArgumentError("invalid component count for transaction type: 2", "payload", bytes_1.hexlify(payload)); + } + var maxPriorityFeePerGas = handleNumber(transaction[2]); + var maxFeePerGas = handleNumber(transaction[3]); + var tx = { + type: 2, + chainId: handleNumber(transaction[0]).toNumber(), + nonce: handleNumber(transaction[1]).toNumber(), + maxPriorityFeePerGas: maxPriorityFeePerGas, + maxFeePerGas: maxFeePerGas, + gasPrice: null, + gasLimit: handleNumber(transaction[4]), + to: handleAddress(transaction[5]), + value: handleNumber(transaction[6]), + data: transaction[7], + accessList: accessListify(transaction[8]), + }; + // Unsigned EIP-1559 Transaction + if (transaction.length === 9) { + return tx; + } + tx.hash = keccak256_1.keccak256(payload); + _parseEipSignature(tx, transaction.slice(9), _serializeEip1559); + return tx; +} +function _parseEip2930(payload) { + var transaction = RLP.decode(payload.slice(1)); + if (transaction.length !== 8 && transaction.length !== 11) { + logger.throwArgumentError("invalid component count for transaction type: 1", "payload", bytes_1.hexlify(payload)); + } + var tx = { + type: 1, + chainId: handleNumber(transaction[0]).toNumber(), + nonce: handleNumber(transaction[1]).toNumber(), + gasPrice: handleNumber(transaction[2]), + gasLimit: handleNumber(transaction[3]), + to: handleAddress(transaction[4]), + value: handleNumber(transaction[5]), + data: transaction[6], + accessList: accessListify(transaction[7]) + }; + // Unsigned EIP-2930 Transaction + if (transaction.length === 8) { + return tx; + } + tx.hash = keccak256_1.keccak256(payload); + _parseEipSignature(tx, transaction.slice(8), _serializeEip2930); + return tx; +} +// Legacy Transactions and EIP-155 +function _parse(rawTransaction) { + var transaction = RLP.decode(rawTransaction); + if (transaction.length !== 9 && transaction.length !== 6) { + logger.throwArgumentError("invalid raw transaction", "rawTransaction", rawTransaction); + } + var tx = { + nonce: handleNumber(transaction[0]).toNumber(), + gasPrice: handleNumber(transaction[1]), + gasLimit: handleNumber(transaction[2]), + to: handleAddress(transaction[3]), + value: handleNumber(transaction[4]), + data: transaction[5], + chainId: 0 + }; + // Legacy unsigned transaction + if (transaction.length === 6) { + return tx; + } + try { + tx.v = bignumber_1.BigNumber.from(transaction[6]).toNumber(); + } + catch (error) { + console.log(error); + return tx; + } + tx.r = bytes_1.hexZeroPad(transaction[7], 32); + tx.s = bytes_1.hexZeroPad(transaction[8], 32); + if (bignumber_1.BigNumber.from(tx.r).isZero() && bignumber_1.BigNumber.from(tx.s).isZero()) { + // EIP-155 unsigned transaction + tx.chainId = tx.v; + tx.v = 0; + } + else { + // Signed Tranasaction + tx.chainId = Math.floor((tx.v - 35) / 2); + if (tx.chainId < 0) { + tx.chainId = 0; + } + var recoveryParam = tx.v - 27; + var raw = transaction.slice(0, 6); + if (tx.chainId !== 0) { + raw.push(bytes_1.hexlify(tx.chainId)); + raw.push("0x"); + raw.push("0x"); + recoveryParam -= tx.chainId * 2 + 8; + } + var digest = keccak256_1.keccak256(RLP.encode(raw)); + try { + tx.from = recoverAddress(digest, { r: bytes_1.hexlify(tx.r), s: bytes_1.hexlify(tx.s), recoveryParam: recoveryParam }); + } + catch (error) { + console.log(error); + } + tx.hash = keccak256_1.keccak256(rawTransaction); + } + tx.type = null; + return tx; +} +function parse(rawTransaction) { + var payload = bytes_1.arrayify(rawTransaction); + // Legacy and EIP-155 Transactions + if (payload[0] > 0x7f) { + return _parse(payload); + } + // Typed Transaction (EIP-2718) + switch (payload[0]) { + case 1: + return _parseEip2930(payload); + case 2: + return _parseEip1559(payload); + default: + break; + } + return logger.throwError("unsupported transaction type: " + payload[0], logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "parseTransaction", + transactionType: payload[0] + }); +} +exports.parse = parse; + +},{"./_version":101,"@ethersproject/address":24,"@ethersproject/bignumber":31,"@ethersproject/bytes":33,"@ethersproject/constants":37,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/rlp":87,"@ethersproject/signing-key":94}],103:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "units/5.4.0"; + +},{}],104:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseEther = exports.formatEther = exports.parseUnits = exports.formatUnits = exports.commify = void 0; +var bignumber_1 = require("@ethersproject/bignumber"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var names = [ + "wei", + "kwei", + "mwei", + "gwei", + "szabo", + "finney", + "ether", +]; +// Some environments have issues with RegEx that contain back-tracking, so we cannot +// use them. +function commify(value) { + var comps = String(value).split("."); + if (comps.length > 2 || !comps[0].match(/^-?[0-9]*$/) || (comps[1] && !comps[1].match(/^[0-9]*$/)) || value === "." || value === "-.") { + logger.throwArgumentError("invalid value", "value", value); + } + // Make sure we have at least one whole digit (0 if none) + var whole = comps[0]; + var negative = ""; + if (whole.substring(0, 1) === "-") { + negative = "-"; + whole = whole.substring(1); + } + // Make sure we have at least 1 whole digit with no leading zeros + while (whole.substring(0, 1) === "0") { + whole = whole.substring(1); + } + if (whole === "") { + whole = "0"; + } + var suffix = ""; + if (comps.length === 2) { + suffix = "." + (comps[1] || "0"); + } + while (suffix.length > 2 && suffix[suffix.length - 1] === "0") { + suffix = suffix.substring(0, suffix.length - 1); + } + var formatted = []; + while (whole.length) { + if (whole.length <= 3) { + formatted.unshift(whole); + break; + } + else { + var index = whole.length - 3; + formatted.unshift(whole.substring(index)); + whole = whole.substring(0, index); + } + } + return negative + formatted.join(",") + suffix; +} +exports.commify = commify; +function formatUnits(value, unitName) { + if (typeof (unitName) === "string") { + var index = names.indexOf(unitName); + if (index !== -1) { + unitName = 3 * index; + } + } + return bignumber_1.formatFixed(value, (unitName != null) ? unitName : 18); +} +exports.formatUnits = formatUnits; +function parseUnits(value, unitName) { + if (typeof (value) !== "string") { + logger.throwArgumentError("value must be a string", "value", value); + } + if (typeof (unitName) === "string") { + var index = names.indexOf(unitName); + if (index !== -1) { + unitName = 3 * index; + } + } + return bignumber_1.parseFixed(value, (unitName != null) ? unitName : 18); +} +exports.parseUnits = parseUnits; +function formatEther(wei) { + return formatUnits(wei, 18); +} +exports.formatEther = formatEther; +function parseEther(ether) { + return parseUnits(ether, 18); +} +exports.parseEther = parseEther; + +},{"./_version":103,"@ethersproject/bignumber":31,"@ethersproject/logger":57}],105:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "wallet/5.4.0"; + +},{}],106:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifyTypedData = exports.verifyMessage = exports.Wallet = void 0; +var address_1 = require("@ethersproject/address"); +var abstract_provider_1 = require("@ethersproject/abstract-provider"); +var abstract_signer_1 = require("@ethersproject/abstract-signer"); +var bytes_1 = require("@ethersproject/bytes"); +var hash_1 = require("@ethersproject/hash"); +var hdnode_1 = require("@ethersproject/hdnode"); +var keccak256_1 = require("@ethersproject/keccak256"); +var properties_1 = require("@ethersproject/properties"); +var random_1 = require("@ethersproject/random"); +var signing_key_1 = require("@ethersproject/signing-key"); +var json_wallets_1 = require("@ethersproject/json-wallets"); +var transactions_1 = require("@ethersproject/transactions"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +function isAccount(value) { + return (value != null && bytes_1.isHexString(value.privateKey, 32) && value.address != null); +} +function hasMnemonic(value) { + var mnemonic = value.mnemonic; + return (mnemonic && mnemonic.phrase); +} +var Wallet = /** @class */ (function (_super) { + __extends(Wallet, _super); + function Wallet(privateKey, provider) { + var _newTarget = this.constructor; + var _this = this; + logger.checkNew(_newTarget, Wallet); + _this = _super.call(this) || this; + if (isAccount(privateKey)) { + var signingKey_1 = new signing_key_1.SigningKey(privateKey.privateKey); + properties_1.defineReadOnly(_this, "_signingKey", function () { return signingKey_1; }); + properties_1.defineReadOnly(_this, "address", transactions_1.computeAddress(_this.publicKey)); + if (_this.address !== address_1.getAddress(privateKey.address)) { + logger.throwArgumentError("privateKey/address mismatch", "privateKey", "[REDACTED]"); + } + if (hasMnemonic(privateKey)) { + var srcMnemonic_1 = privateKey.mnemonic; + properties_1.defineReadOnly(_this, "_mnemonic", function () { return ({ + phrase: srcMnemonic_1.phrase, + path: srcMnemonic_1.path || hdnode_1.defaultPath, + locale: srcMnemonic_1.locale || "en" + }); }); + var mnemonic = _this.mnemonic; + var node = hdnode_1.HDNode.fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path); + if (transactions_1.computeAddress(node.privateKey) !== _this.address) { + logger.throwArgumentError("mnemonic/address mismatch", "privateKey", "[REDACTED]"); + } + } + else { + properties_1.defineReadOnly(_this, "_mnemonic", function () { return null; }); + } + } + else { + if (signing_key_1.SigningKey.isSigningKey(privateKey)) { + /* istanbul ignore if */ + if (privateKey.curve !== "secp256k1") { + logger.throwArgumentError("unsupported curve; must be secp256k1", "privateKey", "[REDACTED]"); + } + properties_1.defineReadOnly(_this, "_signingKey", function () { return privateKey; }); + } + else { + // A lot of common tools do not prefix private keys with a 0x (see: #1166) + if (typeof (privateKey) === "string") { + if (privateKey.match(/^[0-9a-f]*$/i) && privateKey.length === 64) { + privateKey = "0x" + privateKey; + } + } + var signingKey_2 = new signing_key_1.SigningKey(privateKey); + properties_1.defineReadOnly(_this, "_signingKey", function () { return signingKey_2; }); + } + properties_1.defineReadOnly(_this, "_mnemonic", function () { return null; }); + properties_1.defineReadOnly(_this, "address", transactions_1.computeAddress(_this.publicKey)); + } + /* istanbul ignore if */ + if (provider && !abstract_provider_1.Provider.isProvider(provider)) { + logger.throwArgumentError("invalid provider", "provider", provider); + } + properties_1.defineReadOnly(_this, "provider", provider || null); + return _this; + } + Object.defineProperty(Wallet.prototype, "mnemonic", { + get: function () { return this._mnemonic(); }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Wallet.prototype, "privateKey", { + get: function () { return this._signingKey().privateKey; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Wallet.prototype, "publicKey", { + get: function () { return this._signingKey().publicKey; }, + enumerable: false, + configurable: true + }); + Wallet.prototype.getAddress = function () { + return Promise.resolve(this.address); + }; + Wallet.prototype.connect = function (provider) { + return new Wallet(this, provider); + }; + Wallet.prototype.signTransaction = function (transaction) { + var _this = this; + return properties_1.resolveProperties(transaction).then(function (tx) { + if (tx.from != null) { + if (address_1.getAddress(tx.from) !== _this.address) { + logger.throwArgumentError("transaction from address mismatch", "transaction.from", transaction.from); + } + delete tx.from; + } + var signature = _this._signingKey().signDigest(keccak256_1.keccak256(transactions_1.serialize(tx))); + return transactions_1.serialize(tx, signature); + }); + }; + Wallet.prototype.signMessage = function (message) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, bytes_1.joinSignature(this._signingKey().signDigest(hash_1.hashMessage(message)))]; + }); + }); + }; + Wallet.prototype._signTypedData = function (domain, types, value) { + return __awaiter(this, void 0, void 0, function () { + var populated; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, hash_1._TypedDataEncoder.resolveNames(domain, types, value, function (name) { + if (_this.provider == null) { + logger.throwError("cannot resolve ENS names without a provider", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { + operation: "resolveName", + value: name + }); + } + return _this.provider.resolveName(name); + })]; + case 1: + populated = _a.sent(); + return [2 /*return*/, bytes_1.joinSignature(this._signingKey().signDigest(hash_1._TypedDataEncoder.hash(populated.domain, types, populated.value)))]; + } + }); + }); + }; + Wallet.prototype.encrypt = function (password, options, progressCallback) { + if (typeof (options) === "function" && !progressCallback) { + progressCallback = options; + options = {}; + } + if (progressCallback && typeof (progressCallback) !== "function") { + throw new Error("invalid callback"); + } + if (!options) { + options = {}; + } + return json_wallets_1.encryptKeystore(this, password, options, progressCallback); + }; + /** + * Static methods to create Wallet instances. + */ + Wallet.createRandom = function (options) { + var entropy = random_1.randomBytes(16); + if (!options) { + options = {}; + } + if (options.extraEntropy) { + entropy = bytes_1.arrayify(bytes_1.hexDataSlice(keccak256_1.keccak256(bytes_1.concat([entropy, options.extraEntropy])), 0, 16)); + } + var mnemonic = hdnode_1.entropyToMnemonic(entropy, options.locale); + return Wallet.fromMnemonic(mnemonic, options.path, options.locale); + }; + Wallet.fromEncryptedJson = function (json, password, progressCallback) { + return json_wallets_1.decryptJsonWallet(json, password, progressCallback).then(function (account) { + return new Wallet(account); + }); + }; + Wallet.fromEncryptedJsonSync = function (json, password) { + return new Wallet(json_wallets_1.decryptJsonWalletSync(json, password)); + }; + Wallet.fromMnemonic = function (mnemonic, path, wordlist) { + if (!path) { + path = hdnode_1.defaultPath; + } + return new Wallet(hdnode_1.HDNode.fromMnemonic(mnemonic, null, wordlist).derivePath(path)); + }; + return Wallet; +}(abstract_signer_1.Signer)); +exports.Wallet = Wallet; +function verifyMessage(message, signature) { + return transactions_1.recoverAddress(hash_1.hashMessage(message), signature); +} +exports.verifyMessage = verifyMessage; +function verifyTypedData(domain, types, value, signature) { + return transactions_1.recoverAddress(hash_1._TypedDataEncoder.hash(domain, types, value), signature); +} +exports.verifyTypedData = verifyTypedData; + +},{"./_version":105,"@ethersproject/abstract-provider":20,"@ethersproject/abstract-signer":22,"@ethersproject/address":24,"@ethersproject/bytes":33,"@ethersproject/hash":43,"@ethersproject/hdnode":48,"@ethersproject/json-wallets":51,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/random":84,"@ethersproject/signing-key":94,"@ethersproject/transactions":102}],107:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "web/5.4.0"; + +},{}],108:[function(require,module,exports){ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getUrl = void 0; +var bytes_1 = require("@ethersproject/bytes"); +function getUrl(href, options) { + return __awaiter(this, void 0, void 0, function () { + var request, response, body, headers; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (options == null) { + options = {}; + } + request = { + method: (options.method || "GET"), + headers: (options.headers || {}), + body: (options.body || undefined), + mode: "cors", + cache: "no-cache", + credentials: "same-origin", + redirect: "follow", + referrer: "client", // no-referrer, *client + }; + return [4 /*yield*/, fetch(href, request)]; + case 1: + response = _a.sent(); + return [4 /*yield*/, response.arrayBuffer()]; + case 2: + body = _a.sent(); + headers = {}; + if (response.headers.forEach) { + response.headers.forEach(function (value, key) { + headers[key.toLowerCase()] = value; + }); + } + else { + ((response.headers).keys)().forEach(function (key) { + headers[key.toLowerCase()] = response.headers.get(key); + }); + } + return [2 /*return*/, { + headers: headers, + statusCode: response.status, + statusMessage: response.statusText, + body: bytes_1.arrayify(new Uint8Array(body)), + }]; + } + }); + }); +} +exports.getUrl = getUrl; + +},{"@ethersproject/bytes":33}],109:[function(require,module,exports){ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.poll = exports.fetchJson = exports._fetchData = void 0; +var base64_1 = require("@ethersproject/base64"); +var bytes_1 = require("@ethersproject/bytes"); +var properties_1 = require("@ethersproject/properties"); +var strings_1 = require("@ethersproject/strings"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +var logger = new logger_1.Logger(_version_1.version); +var geturl_1 = require("./geturl"); +function staller(duration) { + return new Promise(function (resolve) { + setTimeout(resolve, duration); + }); +} +function bodyify(value, type) { + if (value == null) { + return null; + } + if (typeof (value) === "string") { + return value; + } + if (bytes_1.isBytesLike(value)) { + if (type && (type.split("/")[0] === "text" || type.split(";")[0].trim() === "application/json")) { + try { + return strings_1.toUtf8String(value); + } + catch (error) { } + ; + } + return bytes_1.hexlify(value); + } + return value; +} +// This API is still a work in progress; the future changes will likely be: +// - ConnectionInfo => FetchDataRequest +// - FetchDataRequest.body? = string | Uint8Array | { contentType: string, data: string | Uint8Array } +// - If string => text/plain, Uint8Array => application/octet-stream (if content-type unspecified) +// - FetchDataRequest.processFunc = (body: Uint8Array, response: FetchDataResponse) => T +// For this reason, it should be considered internal until the API is finalized +function _fetchData(connection, body, processFunc) { + // How many times to retry in the event of a throttle + var attemptLimit = (typeof (connection) === "object" && connection.throttleLimit != null) ? connection.throttleLimit : 12; + logger.assertArgument((attemptLimit > 0 && (attemptLimit % 1) === 0), "invalid connection throttle limit", "connection.throttleLimit", attemptLimit); + var throttleCallback = ((typeof (connection) === "object") ? connection.throttleCallback : null); + var throttleSlotInterval = ((typeof (connection) === "object" && typeof (connection.throttleSlotInterval) === "number") ? connection.throttleSlotInterval : 100); + logger.assertArgument((throttleSlotInterval > 0 && (throttleSlotInterval % 1) === 0), "invalid connection throttle slot interval", "connection.throttleSlotInterval", throttleSlotInterval); + var headers = {}; + var url = null; + // @TODO: Allow ConnectionInfo to override some of these values + var options = { + method: "GET", + }; + var allow304 = false; + var timeout = 2 * 60 * 1000; + if (typeof (connection) === "string") { + url = connection; + } + else if (typeof (connection) === "object") { + if (connection == null || connection.url == null) { + logger.throwArgumentError("missing URL", "connection.url", connection); + } + url = connection.url; + if (typeof (connection.timeout) === "number" && connection.timeout > 0) { + timeout = connection.timeout; + } + if (connection.headers) { + for (var key in connection.headers) { + headers[key.toLowerCase()] = { key: key, value: String(connection.headers[key]) }; + if (["if-none-match", "if-modified-since"].indexOf(key.toLowerCase()) >= 0) { + allow304 = true; + } + } + } + options.allowGzip = !!connection.allowGzip; + if (connection.user != null && connection.password != null) { + if (url.substring(0, 6) !== "https:" && connection.allowInsecureAuthentication !== true) { + logger.throwError("basic authentication requires a secure https url", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: "url", url: url, user: connection.user, password: "[REDACTED]" }); + } + var authorization = connection.user + ":" + connection.password; + headers["authorization"] = { + key: "Authorization", + value: "Basic " + base64_1.encode(strings_1.toUtf8Bytes(authorization)) + }; + } + } + if (body) { + options.method = "POST"; + options.body = body; + if (headers["content-type"] == null) { + headers["content-type"] = { key: "Content-Type", value: "application/octet-stream" }; + } + if (headers["content-length"] == null) { + headers["content-length"] = { key: "Content-Length", value: String(body.length) }; + } + } + var flatHeaders = {}; + Object.keys(headers).forEach(function (key) { + var header = headers[key]; + flatHeaders[header.key] = header.value; + }); + options.headers = flatHeaders; + var runningTimeout = (function () { + var timer = null; + var promise = new Promise(function (resolve, reject) { + if (timeout) { + timer = setTimeout(function () { + if (timer == null) { + return; + } + timer = null; + reject(logger.makeError("timeout", logger_1.Logger.errors.TIMEOUT, { + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + timeout: timeout, + url: url + })); + }, timeout); + } + }); + var cancel = function () { + if (timer == null) { + return; + } + clearTimeout(timer); + timer = null; + }; + return { promise: promise, cancel: cancel }; + })(); + var runningFetch = (function () { + return __awaiter(this, void 0, void 0, function () { + var attempt, response, tryAgain, stall, retryAfter, error_1, body_1, result, error_2, tryAgain, timeout_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + attempt = 0; + _a.label = 1; + case 1: + if (!(attempt < attemptLimit)) return [3 /*break*/, 19]; + response = null; + _a.label = 2; + case 2: + _a.trys.push([2, 8, , 9]); + return [4 /*yield*/, geturl_1.getUrl(url, options)]; + case 3: + response = _a.sent(); + if (!(response.statusCode === 429 && attempt < attemptLimit)) return [3 /*break*/, 7]; + tryAgain = true; + if (!throttleCallback) return [3 /*break*/, 5]; + return [4 /*yield*/, throttleCallback(attempt, url)]; + case 4: + tryAgain = _a.sent(); + _a.label = 5; + case 5: + if (!tryAgain) return [3 /*break*/, 7]; + stall = 0; + retryAfter = response.headers["retry-after"]; + if (typeof (retryAfter) === "string" && retryAfter.match(/^[1-9][0-9]*$/)) { + stall = parseInt(retryAfter) * 1000; + } + else { + stall = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt))); + } + //console.log("Stalling 429"); + return [4 /*yield*/, staller(stall)]; + case 6: + //console.log("Stalling 429"); + _a.sent(); + return [3 /*break*/, 18]; + case 7: return [3 /*break*/, 9]; + case 8: + error_1 = _a.sent(); + response = error_1.response; + if (response == null) { + runningTimeout.cancel(); + logger.throwError("missing response", logger_1.Logger.errors.SERVER_ERROR, { + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + serverError: error_1, + url: url + }); + } + return [3 /*break*/, 9]; + case 9: + body_1 = response.body; + if (allow304 && response.statusCode === 304) { + body_1 = null; + } + else if (response.statusCode < 200 || response.statusCode >= 300) { + runningTimeout.cancel(); + logger.throwError("bad response", logger_1.Logger.errors.SERVER_ERROR, { + status: response.statusCode, + headers: response.headers, + body: bodyify(body_1, ((response.headers) ? response.headers["content-type"] : null)), + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + url: url + }); + } + if (!processFunc) return [3 /*break*/, 17]; + _a.label = 10; + case 10: + _a.trys.push([10, 12, , 17]); + return [4 /*yield*/, processFunc(body_1, response)]; + case 11: + result = _a.sent(); + runningTimeout.cancel(); + return [2 /*return*/, result]; + case 12: + error_2 = _a.sent(); + if (!(error_2.throttleRetry && attempt < attemptLimit)) return [3 /*break*/, 16]; + tryAgain = true; + if (!throttleCallback) return [3 /*break*/, 14]; + return [4 /*yield*/, throttleCallback(attempt, url)]; + case 13: + tryAgain = _a.sent(); + _a.label = 14; + case 14: + if (!tryAgain) return [3 /*break*/, 16]; + timeout_1 = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt))); + //console.log("Stalling callback"); + return [4 /*yield*/, staller(timeout_1)]; + case 15: + //console.log("Stalling callback"); + _a.sent(); + return [3 /*break*/, 18]; + case 16: + runningTimeout.cancel(); + logger.throwError("processing response error", logger_1.Logger.errors.SERVER_ERROR, { + body: bodyify(body_1, ((response.headers) ? response.headers["content-type"] : null)), + error: error_2, + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + url: url + }); + return [3 /*break*/, 17]; + case 17: + runningTimeout.cancel(); + // If we had a processFunc, it eitehr returned a T or threw above. + // The "body" is now a Uint8Array. + return [2 /*return*/, body_1]; + case 18: + attempt++; + return [3 /*break*/, 1]; + case 19: return [2 /*return*/, logger.throwError("failed response", logger_1.Logger.errors.SERVER_ERROR, { + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + url: url + })]; + } + }); + }); + })(); + return Promise.race([runningTimeout.promise, runningFetch]); +} +exports._fetchData = _fetchData; +function fetchJson(connection, json, processFunc) { + var processJsonFunc = function (value, response) { + var result = null; + if (value != null) { + try { + result = JSON.parse(strings_1.toUtf8String(value)); + } + catch (error) { + logger.throwError("invalid JSON", logger_1.Logger.errors.SERVER_ERROR, { + body: value, + error: error + }); + } + } + if (processFunc) { + result = processFunc(result, response); + } + return result; + }; + // If we have json to send, we must + // - add content-type of application/json (unless already overridden) + // - convert the json to bytes + var body = null; + if (json != null) { + body = strings_1.toUtf8Bytes(json); + // Create a connection with the content-type set for JSON + var updated = (typeof (connection) === "string") ? ({ url: connection }) : properties_1.shallowCopy(connection); + if (updated.headers) { + var hasContentType = (Object.keys(updated.headers).filter(function (k) { return (k.toLowerCase() === "content-type"); }).length) !== 0; + if (!hasContentType) { + updated.headers = properties_1.shallowCopy(updated.headers); + updated.headers["content-type"] = "application/json"; + } + } + else { + updated.headers = { "content-type": "application/json" }; + } + connection = updated; + } + return _fetchData(connection, body, processJsonFunc); +} +exports.fetchJson = fetchJson; +function poll(func, options) { + if (!options) { + options = {}; + } + options = properties_1.shallowCopy(options); + if (options.floor == null) { + options.floor = 0; + } + if (options.ceiling == null) { + options.ceiling = 10000; + } + if (options.interval == null) { + options.interval = 250; + } + return new Promise(function (resolve, reject) { + var timer = null; + var done = false; + // Returns true if cancel was successful. Unsuccessful cancel means we're already done. + var cancel = function () { + if (done) { + return false; + } + done = true; + if (timer) { + clearTimeout(timer); + } + return true; + }; + if (options.timeout) { + timer = setTimeout(function () { + if (cancel()) { + reject(new Error("timeout")); + } + }, options.timeout); + } + var retryLimit = options.retryLimit; + var attempt = 0; + function check() { + return func().then(function (result) { + // If we have a result, or are allowed null then we're done + if (result !== undefined) { + if (cancel()) { + resolve(result); + } + } + else if (options.oncePoll) { + options.oncePoll.once("poll", check); + } + else if (options.onceBlock) { + options.onceBlock.once("block", check); + // Otherwise, exponential back-off (up to 10s) our next request + } + else if (!done) { + attempt++; + if (attempt > retryLimit) { + if (cancel()) { + reject(new Error("retry limit reached")); + } + return; + } + var timeout = options.interval * parseInt(String(Math.random() * Math.pow(2, attempt))); + if (timeout < options.floor) { + timeout = options.floor; + } + if (timeout > options.ceiling) { + timeout = options.ceiling; + } + setTimeout(check, timeout); + } + return null; + }, function (error) { + if (cancel()) { + reject(error); + } + }); + } + check(); + }); +} +exports.poll = poll; + +},{"./_version":107,"./geturl":108,"@ethersproject/base64":26,"@ethersproject/bytes":33,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/strings":99}],110:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "wordlists/5.4.0"; + +},{}],111:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.wordlists = exports.Wordlist = exports.logger = void 0; +// Wordlists +// See: https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md +var wordlist_1 = require("./wordlist"); +Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return wordlist_1.logger; } }); +Object.defineProperty(exports, "Wordlist", { enumerable: true, get: function () { return wordlist_1.Wordlist; } }); +var wordlists_1 = require("./wordlists"); +Object.defineProperty(exports, "wordlists", { enumerable: true, get: function () { return wordlists_1.wordlists; } }); + +},{"./wordlist":120,"./wordlists":121}],112:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.langCz = void 0; +var wordlist_1 = require("./wordlist"); +var words = "AbdikaceAbecedaAdresaAgreseAkceAktovkaAlejAlkoholAmputaceAnanasAndulkaAnekdotaAnketaAntikaAnulovatArchaAroganceAsfaltAsistentAspiraceAstmaAstronomAtlasAtletikaAtolAutobusAzylBabkaBachorBacilBaculkaBadatelBagetaBagrBahnoBakterieBaladaBaletkaBalkonBalonekBalvanBalzaBambusBankomatBarbarBaretBarmanBarokoBarvaBaterkaBatohBavlnaBazalkaBazilikaBazukaBednaBeranBesedaBestieBetonBezinkaBezmocBeztakBicyklBidloBiftekBikinyBilanceBiografBiologBitvaBizonBlahobytBlatouchBlechaBleduleBleskBlikatBliznaBlokovatBlouditBludBobekBobrBodlinaBodnoutBohatostBojkotBojovatBokorysBolestBorecBoroviceBotaBoubelBouchatBoudaBouleBouratBoxerBradavkaBramboraBrankaBratrBreptaBriketaBrkoBrlohBronzBroskevBrunetkaBrusinkaBrzdaBrzyBublinaBubnovatBuchtaBuditelBudkaBudovaBufetBujarostBukviceBuldokBulvaBundaBunkrBurzaButikBuvolBuzolaBydletBylinaBytovkaBzukotCapartCarevnaCedrCeduleCejchCejnCelaCelerCelkemCelniceCeninaCennostCenovkaCentrumCenzorCestopisCetkaChalupaChapadloCharitaChataChechtatChemieChichotChirurgChladChlebaChlubitChmelChmuraChobotChocholChodbaCholeraChomoutChopitChorobaChovChrapotChrlitChrtChrupChtivostChudinaChutnatChvatChvilkaChvostChybaChystatChytitCibuleCigaretaCihelnaCihlaCinkotCirkusCisternaCitaceCitrusCizinecCizostClonaCokolivCouvatCtitelCtnostCudnostCuketaCukrCupotCvaknoutCvalCvikCvrkotCyklistaDalekoDarebaDatelDatumDceraDebataDechovkaDecibelDeficitDeflaceDeklDekretDemokratDepreseDerbyDeskaDetektivDikobrazDiktovatDiodaDiplomDiskDisplejDivadloDivochDlahaDlouhoDluhopisDnesDobroDobytekDocentDochutitDodnesDohledDohodaDohraDojemDojniceDokladDokolaDoktorDokumentDolarDolevaDolinaDomaDominantDomluvitDomovDonutitDopadDopisDoplnitDoposudDoprovodDopustitDorazitDorostDortDosahDoslovDostatekDosudDosytaDotazDotekDotknoutDoufatDoutnatDovozceDozaduDoznatDozorceDrahotaDrakDramatikDravecDrazeDrdolDrobnostDrogerieDrozdDrsnostDrtitDrzostDubenDuchovnoDudekDuhaDuhovkaDusitDusnoDutostDvojiceDvorecDynamitEkologEkonomieElektronElipsaEmailEmiseEmoceEmpatieEpizodaEpochaEpopejEposEsejEsenceEskortaEskymoEtiketaEuforieEvoluceExekuceExkurzeExpediceExplozeExportExtraktFackaFajfkaFakultaFanatikFantazieFarmacieFavoritFazoleFederaceFejetonFenkaFialkaFigurantFilozofFiltrFinanceFintaFixaceFjordFlanelFlirtFlotilaFondFosforFotbalFotkaFotonFrakceFreskaFrontaFukarFunkceFyzikaGalejeGarantGenetikaGeologGilotinaGlazuraGlejtGolemGolfistaGotikaGrafGramofonGranuleGrepGrilGrogGroteskaGumaHadiceHadrHalaHalenkaHanbaHanopisHarfaHarpunaHavranHebkostHejkalHejnoHejtmanHektarHelmaHematomHerecHernaHesloHezkyHistorikHladovkaHlasivkyHlavaHledatHlenHlodavecHlohHloupostHltatHlubinaHluchotaHmatHmotaHmyzHnisHnojivoHnoutHoblinaHobojHochHodinyHodlatHodnotaHodovatHojnostHokejHolinkaHolkaHolubHomoleHonitbaHonoraceHoralHordaHorizontHorkoHorlivecHormonHorninaHoroskopHorstvoHospodaHostinaHotovostHoubaHoufHoupatHouskaHovorHradbaHraniceHravostHrazdaHrbolekHrdinaHrdloHrdostHrnekHrobkaHromadaHrotHroudaHrozenHrstkaHrubostHryzatHubenostHubnoutHudbaHukotHumrHusitaHustotaHvozdHybnostHydrantHygienaHymnaHysterikIdylkaIhnedIkonaIluzeImunitaInfekceInflaceInkasoInovaceInspekceInternetInvalidaInvestorInzerceIronieJablkoJachtaJahodaJakmileJakostJalovecJantarJarmarkJaroJasanJasnoJatkaJavorJazykJedinecJedleJednatelJehlanJekotJelenJelitoJemnostJenomJepiceJeseterJevitJezdecJezeroJinakJindyJinochJiskraJistotaJitrniceJizvaJmenovatJogurtJurtaKabaretKabelKabinetKachnaKadetKadidloKahanKajakKajutaKakaoKaktusKalamitaKalhotyKalibrKalnostKameraKamkolivKamnaKanibalKanoeKantorKapalinaKapelaKapitolaKapkaKapleKapotaKaprKapustaKapybaraKaramelKarotkaKartonKasaKatalogKatedraKauceKauzaKavalecKazajkaKazetaKazivostKdekolivKdesiKedlubenKempKeramikaKinoKlacekKladivoKlamKlapotKlasikaKlaunKlecKlenbaKlepatKlesnoutKlidKlimaKlisnaKloboukKlokanKlopaKloubKlubovnaKlusatKluzkostKmenKmitatKmotrKnihaKnotKoaliceKoberecKobkaKoblihaKobylaKocourKohoutKojenecKokosKoktejlKolapsKoledaKolizeKoloKomandoKometaKomikKomnataKomoraKompasKomunitaKonatKonceptKondiceKonecKonfeseKongresKoninaKonkursKontaktKonzervaKopanecKopieKopnoutKoprovkaKorbelKorektorKormidloKoroptevKorpusKorunaKorytoKorzetKosatecKostkaKotelKotletaKotoulKoukatKoupelnaKousekKouzloKovbojKozaKozorohKrabiceKrachKrajinaKralovatKrasopisKravataKreditKrejcarKresbaKrevetaKriketKritikKrizeKrkavecKrmelecKrmivoKrocanKrokKronikaKropitKroupaKrovkaKrtekKruhadloKrupiceKrutostKrvinkaKrychleKryptaKrystalKrytKudlankaKufrKujnostKuklaKulajdaKulichKulkaKulometKulturaKunaKupodivuKurtKurzorKutilKvalitaKvasinkaKvestorKynologKyselinaKytaraKyticeKytkaKytovecKyvadloLabradorLachtanLadnostLaikLakomecLamelaLampaLanovkaLasiceLasoLasturaLatinkaLavinaLebkaLeckdyLedenLedniceLedovkaLedvinaLegendaLegieLegraceLehceLehkostLehnoutLektvarLenochodLentilkaLepenkaLepidloLetadloLetecLetmoLetokruhLevhartLevitaceLevobokLibraLichotkaLidojedLidskostLihovinaLijavecLilekLimetkaLinieLinkaLinoleumListopadLitinaLitovatLobistaLodivodLogikaLogopedLokalitaLoketLomcovatLopataLopuchLordLososLotrLoudalLouhLoukaLouskatLovecLstivostLucernaLuciferLumpLuskLustraceLviceLyraLyrikaLysinaMadamMadloMagistrMahagonMajetekMajitelMajoritaMakakMakoviceMakrelaMalbaMalinaMalovatMalviceMaminkaMandleMankoMarnostMasakrMaskotMasopustMaticeMatrikaMaturitaMazanecMazivoMazlitMazurkaMdlobaMechanikMeditaceMedovinaMelasaMelounMentolkaMetlaMetodaMetrMezeraMigraceMihnoutMihuleMikinaMikrofonMilenecMilimetrMilostMimikaMincovnaMinibarMinometMinulostMiskaMistrMixovatMladostMlhaMlhovinaMlokMlsatMluvitMnichMnohemMobilMocnostModelkaModlitbaMohylaMokroMolekulaMomentkaMonarchaMonoklMonstrumMontovatMonzunMosazMoskytMostMotivaceMotorkaMotykaMouchaMoudrostMozaikaMozekMozolMramorMravenecMrkevMrtvolaMrzetMrzutostMstitelMudrcMuflonMulatMumieMuniceMusetMutaceMuzeumMuzikantMyslivecMzdaNabouratNachytatNadaceNadbytekNadhozNadobroNadpisNahlasNahnatNahodileNahraditNaivitaNajednouNajistoNajmoutNaklonitNakonecNakrmitNalevoNamazatNamluvitNanometrNaokoNaopakNaostroNapadatNapevnoNaplnitNapnoutNaposledNaprostoNaroditNarubyNarychloNasaditNasekatNaslepoNastatNatolikNavenekNavrchNavzdoryNazvatNebeNechatNeckyNedalekoNedbatNeduhNegaceNehetNehodaNejenNejprveNeklidNelibostNemilostNemocNeochotaNeonkaNepokojNerostNervNesmyslNesouladNetvorNeuronNevinaNezvykleNicotaNijakNikamNikdyNiklNikterakNitroNoclehNohaviceNominaceNoraNorekNositelNosnostNouzeNovinyNovotaNozdraNudaNudleNugetNutitNutnostNutrieNymfaObalObarvitObavaObdivObecObehnatObejmoutObezitaObhajobaObilniceObjasnitObjektObklopitOblastOblekOblibaOblohaObludaObnosObohatitObojekOboutObrazecObrnaObrubaObrysObsahObsluhaObstaratObuvObvazObvinitObvodObvykleObyvatelObzorOcasOcelOcenitOchladitOchotaOchranaOcitnoutOdbojOdbytOdchodOdcizitOdebratOdeslatOdevzdatOdezvaOdhadceOdhoditOdjetOdjinudOdkazOdkoupitOdlivOdlukaOdmlkaOdolnostOdpadOdpisOdploutOdporOdpustitOdpykatOdrazkaOdsouditOdstupOdsunOdtokOdtudOdvahaOdvetaOdvolatOdvracetOdznakOfinaOfsajdOhlasOhniskoOhradaOhrozitOhryzekOkapOkeniceOklikaOknoOkouzlitOkovyOkrasaOkresOkrsekOkruhOkupantOkurkaOkusitOlejninaOlizovatOmakOmeletaOmezitOmladinaOmlouvatOmluvaOmylOnehdyOpakovatOpasekOperaceOpiceOpilostOpisovatOporaOpoziceOpravduOprotiOrbitalOrchestrOrgieOrliceOrlojOrtelOsadaOschnoutOsikaOsivoOslavaOslepitOslnitOslovitOsnovaOsobaOsolitOspalecOstenOstrahaOstudaOstychOsvojitOteplitOtiskOtopOtrhatOtrlostOtrokOtrubyOtvorOvanoutOvarOvesOvlivnitOvoceOxidOzdobaPachatelPacientPadouchPahorekPaktPalandaPalecPalivoPalubaPamfletPamlsekPanenkaPanikaPannaPanovatPanstvoPantoflePaprikaParketaParodiePartaParukaParybaPasekaPasivitaPastelkaPatentPatronaPavoukPaznehtPazourekPeckaPedagogPejsekPekloPelotonPenaltaPendrekPenzePeriskopPeroPestrostPetardaPeticePetrolejPevninaPexesoPianistaPihaPijavicePiklePiknikPilinaPilnostPilulkaPinzetaPipetaPisatelPistolePitevnaPivnicePivovarPlacentaPlakatPlamenPlanetaPlastikaPlatitPlavidloPlazPlechPlemenoPlentaPlesPletivoPlevelPlivatPlnitPlnoPlochaPlodinaPlombaPloutPlukPlynPobavitPobytPochodPocitPoctivecPodatPodcenitPodepsatPodhledPodivitPodkladPodmanitPodnikPodobaPodporaPodrazPodstataPodvodPodzimPoeziePohankaPohnutkaPohovorPohromaPohybPointaPojistkaPojmoutPokazitPoklesPokojPokrokPokutaPokynPolednePolibekPolknoutPolohaPolynomPomaluPominoutPomlkaPomocPomstaPomysletPonechatPonorkaPonurostPopadatPopelPopisekPoplachPoprositPopsatPopudPoradcePorcePorodPoruchaPoryvPosaditPosedPosilaPoskokPoslanecPosouditPospoluPostavaPosudekPosypPotahPotkanPotleskPotomekPotravaPotupaPotvoraPoukazPoutoPouzdroPovahaPovidlaPovlakPovozPovrchPovstatPovykPovzdechPozdravPozemekPoznatekPozorPozvatPracovatPrahoryPraktikaPralesPraotecPraporekPrasePravdaPrincipPrknoProbuditProcentoProdejProfeseProhraProjektProlomitPromilePronikatPropadProrokProsbaProtonProutekProvazPrskavkaPrstenPrudkostPrutPrvekPrvohoryPsanecPsovodPstruhPtactvoPubertaPuchPudlPukavecPuklinaPukrlePultPumpaPuncPupenPusaPusinkaPustinaPutovatPutykaPyramidaPyskPytelRacekRachotRadiaceRadniceRadonRaftRagbyRaketaRakovinaRamenoRampouchRandeRarachRaritaRasovnaRastrRatolestRazanceRazidloReagovatReakceReceptRedaktorReferentReflexRejnokReklamaRekordRekrutRektorReputaceRevizeRevmaRevolverRezervaRiskovatRizikoRobotikaRodokmenRohovkaRokleRokokoRomanetoRopovodRopuchaRorejsRosolRostlinaRotmistrRotopedRotundaRoubenkaRouchoRoupRouraRovinaRovniceRozborRozchodRozdatRozeznatRozhodceRozinkaRozjezdRozkazRozlohaRozmarRozpadRozruchRozsahRoztokRozumRozvodRubrikaRuchadloRukaviceRukopisRybaRybolovRychlostRydloRypadloRytinaRyzostSadistaSahatSakoSamecSamizdatSamotaSanitkaSardinkaSasankaSatelitSazbaSazeniceSborSchovatSebrankaSeceseSedadloSedimentSedloSehnatSejmoutSekeraSektaSekundaSekvojeSemenoSenoServisSesaditSeshoraSeskokSeslatSestraSesuvSesypatSetbaSetinaSetkatSetnoutSetrvatSeverSeznamShodaShrnoutSifonSilniceSirkaSirotekSirupSituaceSkafandrSkaliskoSkanzenSkautSkeptikSkicaSkladbaSkleniceSkloSkluzSkobaSkokanSkoroSkriptaSkrzSkupinaSkvostSkvrnaSlabikaSladidloSlaninaSlastSlavnostSledovatSlepecSlevaSlezinaSlibSlinaSlizniceSlonSloupekSlovoSluchSluhaSlunceSlupkaSlzaSmaragdSmetanaSmilstvoSmlouvaSmogSmradSmrkSmrtkaSmutekSmyslSnadSnahaSnobSobotaSochaSodovkaSokolSopkaSotvaSoubojSoucitSoudceSouhlasSouladSoumrakSoupravaSousedSoutokSouvisetSpalovnaSpasitelSpisSplavSpodekSpojenecSpoluSponzorSpornostSpoustaSprchaSpustitSrandaSrazSrdceSrnaSrnecSrovnatSrpenSrstSrubStaniceStarostaStatikaStavbaStehnoStezkaStodolaStolekStopaStornoStoupatStrachStresStrhnoutStromStrunaStudnaStupniceStvolStykSubjektSubtropySucharSudostSuknoSundatSunoutSurikataSurovinaSvahSvalstvoSvetrSvatbaSvazekSvisleSvitekSvobodaSvodidloSvorkaSvrabSykavkaSykotSynekSynovecSypatSypkostSyrovostSyselSytostTabletkaTabuleTahounTajemnoTajfunTajgaTajitTajnostTaktikaTamhleTamponTancovatTanecTankerTapetaTaveninaTazatelTechnikaTehdyTekutinaTelefonTemnotaTendenceTenistaTenorTeplotaTepnaTeprveTerapieTermoskaTextilTichoTiskopisTitulekTkadlecTkaninaTlapkaTleskatTlukotTlupaTmelToaletaTopinkaTopolTorzoTouhaToulecTradiceTraktorTrampTrasaTraverzaTrefitTrestTrezorTrhavinaTrhlinaTrochuTrojiceTroskaTroubaTrpceTrpitelTrpkostTrubecTruchlitTruhliceTrusTrvatTudyTuhnoutTuhostTundraTuristaTurnajTuzemskoTvarohTvorbaTvrdostTvrzTygrTykevUbohostUbozeUbratUbrousekUbrusUbytovnaUchoUctivostUdivitUhraditUjednatUjistitUjmoutUkazatelUklidnitUklonitUkotvitUkrojitUliceUlitaUlovitUmyvadloUnavitUniformaUniknoutUpadnoutUplatnitUplynoutUpoutatUpravitUranUrazitUsednoutUsilovatUsmrtitUsnadnitUsnoutUsouditUstlatUstrnoutUtahovatUtkatUtlumitUtonoutUtopenecUtrousitUvalitUvolnitUvozovkaUzdravitUzelUzeninaUzlinaUznatVagonValchaValounVanaVandalVanilkaVaranVarhanyVarovatVcelkuVchodVdovaVedroVegetaceVejceVelbloudVeletrhVelitelVelmocVelrybaVenkovVerandaVerzeVeselkaVeskrzeVesniceVespoduVestaVeterinaVeverkaVibraceVichrVideohraVidinaVidleVilaViniceVisetVitalitaVizeVizitkaVjezdVkladVkusVlajkaVlakVlasecVlevoVlhkostVlivVlnovkaVloupatVnucovatVnukVodaVodivostVodoznakVodstvoVojenskyVojnaVojskoVolantVolbaVolitVolnoVoskovkaVozidloVozovnaVpravoVrabecVracetVrahVrataVrbaVrcholekVrhatVrstvaVrtuleVsaditVstoupitVstupVtipVybavitVybratVychovatVydatVydraVyfotitVyhledatVyhnoutVyhoditVyhraditVyhubitVyjasnitVyjetVyjmoutVyklopitVykonatVylekatVymazatVymezitVymizetVymysletVynechatVynikatVynutitVypadatVyplatitVypravitVypustitVyrazitVyrovnatVyrvatVyslovitVysokoVystavitVysunoutVysypatVytasitVytesatVytratitVyvinoutVyvolatVyvrhelVyzdobitVyznatVzaduVzbuditVzchopitVzdorVzduchVzdychatVzestupVzhledemVzkazVzlykatVznikVzorekVzpouraVztahVztekXylofonZabratZabydletZachovatZadarmoZadusitZafoukatZahltitZahoditZahradaZahynoutZajatecZajetZajistitZaklepatZakoupitZalepitZamezitZamotatZamysletZanechatZanikatZaplatitZapojitZapsatZarazitZastavitZasunoutZatajitZatemnitZatknoutZaujmoutZavalitZaveletZavinitZavolatZavrtatZazvonitZbavitZbrusuZbudovatZbytekZdalekaZdarmaZdatnostZdivoZdobitZdrojZdvihZdymadloZeleninaZemanZeminaZeptatZezaduZezdolaZhatitZhltnoutZhlubokaZhotovitZhrubaZimaZimniceZjemnitZklamatZkoumatZkratkaZkumavkaZlatoZlehkaZlobaZlomZlostZlozvykZmapovatZmarZmatekZmijeZmizetZmocnitZmodratZmrzlinaZmutovatZnakZnalostZnamenatZnovuZobrazitZotavitZoubekZoufaleZploditZpomalitZpravaZprostitZprudkaZprvuZradaZranitZrcadloZrnitostZrnoZrovnaZrychlitZrzavostZtichaZtratitZubovinaZubrZvednoutZvenkuZveselaZvonZvratZvukovodZvyk"; +var wordlist = null; +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" "); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (wordlist_1.Wordlist.check(lang) !== "0x25f44555f4af25b51a711136e1c7d6e50ce9f8917d39d6b1f076b2bb4d2fac1a") { + wordlist = null; + throw new Error("BIP39 Wordlist for en (English) FAILED"); + } +} +var LangCz = /** @class */ (function (_super) { + __extends(LangCz, _super); + function LangCz() { + return _super.call(this, "cz") || this; + } + LangCz.prototype.getWord = function (index) { + loadWords(this); + return wordlist[index]; + }; + LangCz.prototype.getWordIndex = function (word) { + loadWords(this); + return wordlist.indexOf(word); + }; + return LangCz; +}(wordlist_1.Wordlist)); +var langCz = new LangCz(); +exports.langCz = langCz; +wordlist_1.Wordlist.register(langCz); + +},{"./wordlist":120}],113:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.langEn = void 0; +var wordlist_1 = require("./wordlist"); +var words = "AbandonAbilityAbleAboutAboveAbsentAbsorbAbstractAbsurdAbuseAccessAccidentAccountAccuseAchieveAcidAcousticAcquireAcrossActActionActorActressActualAdaptAddAddictAddressAdjustAdmitAdultAdvanceAdviceAerobicAffairAffordAfraidAgainAgeAgentAgreeAheadAimAirAirportAisleAlarmAlbumAlcoholAlertAlienAllAlleyAllowAlmostAloneAlphaAlreadyAlsoAlterAlwaysAmateurAmazingAmongAmountAmusedAnalystAnchorAncientAngerAngleAngryAnimalAnkleAnnounceAnnualAnotherAnswerAntennaAntiqueAnxietyAnyApartApologyAppearAppleApproveAprilArchArcticAreaArenaArgueArmArmedArmorArmyAroundArrangeArrestArriveArrowArtArtefactArtistArtworkAskAspectAssaultAssetAssistAssumeAsthmaAthleteAtomAttackAttendAttitudeAttractAuctionAuditAugustAuntAuthorAutoAutumnAverageAvocadoAvoidAwakeAwareAwayAwesomeAwfulAwkwardAxisBabyBachelorBaconBadgeBagBalanceBalconyBallBambooBananaBannerBarBarelyBargainBarrelBaseBasicBasketBattleBeachBeanBeautyBecauseBecomeBeefBeforeBeginBehaveBehindBelieveBelowBeltBenchBenefitBestBetrayBetterBetweenBeyondBicycleBidBikeBindBiologyBirdBirthBitterBlackBladeBlameBlanketBlastBleakBlessBlindBloodBlossomBlouseBlueBlurBlushBoardBoatBodyBoilBombBoneBonusBookBoostBorderBoringBorrowBossBottomBounceBoxBoyBracketBrainBrandBrassBraveBreadBreezeBrickBridgeBriefBrightBringBriskBroccoliBrokenBronzeBroomBrotherBrownBrushBubbleBuddyBudgetBuffaloBuildBulbBulkBulletBundleBunkerBurdenBurgerBurstBusBusinessBusyButterBuyerBuzzCabbageCabinCableCactusCageCakeCallCalmCameraCampCanCanalCancelCandyCannonCanoeCanvasCanyonCapableCapitalCaptainCarCarbonCardCargoCarpetCarryCartCaseCashCasinoCastleCasualCatCatalogCatchCategoryCattleCaughtCauseCautionCaveCeilingCeleryCementCensusCenturyCerealCertainChairChalkChampionChangeChaosChapterChargeChaseChatCheapCheckCheeseChefCherryChestChickenChiefChildChimneyChoiceChooseChronicChuckleChunkChurnCigarCinnamonCircleCitizenCityCivilClaimClapClarifyClawClayCleanClerkCleverClickClientCliffClimbClinicClipClockClogCloseClothCloudClownClubClumpClusterClutchCoachCoastCoconutCodeCoffeeCoilCoinCollectColorColumnCombineComeComfortComicCommonCompanyConcertConductConfirmCongressConnectConsiderControlConvinceCookCoolCopperCopyCoralCoreCornCorrectCostCottonCouchCountryCoupleCourseCousinCoverCoyoteCrackCradleCraftCramCraneCrashCraterCrawlCrazyCreamCreditCreekCrewCricketCrimeCrispCriticCropCrossCrouchCrowdCrucialCruelCruiseCrumbleCrunchCrushCryCrystalCubeCultureCupCupboardCuriousCurrentCurtainCurveCushionCustomCuteCycleDadDamageDampDanceDangerDaringDashDaughterDawnDayDealDebateDebrisDecadeDecemberDecideDeclineDecorateDecreaseDeerDefenseDefineDefyDegreeDelayDeliverDemandDemiseDenialDentistDenyDepartDependDepositDepthDeputyDeriveDescribeDesertDesignDeskDespairDestroyDetailDetectDevelopDeviceDevoteDiagramDialDiamondDiaryDiceDieselDietDifferDigitalDignityDilemmaDinnerDinosaurDirectDirtDisagreeDiscoverDiseaseDishDismissDisorderDisplayDistanceDivertDivideDivorceDizzyDoctorDocumentDogDollDolphinDomainDonateDonkeyDonorDoorDoseDoubleDoveDraftDragonDramaDrasticDrawDreamDressDriftDrillDrinkDripDriveDropDrumDryDuckDumbDuneDuringDustDutchDutyDwarfDynamicEagerEagleEarlyEarnEarthEasilyEastEasyEchoEcologyEconomyEdgeEditEducateEffortEggEightEitherElbowElderElectricElegantElementElephantElevatorEliteElseEmbarkEmbodyEmbraceEmergeEmotionEmployEmpowerEmptyEnableEnactEndEndlessEndorseEnemyEnergyEnforceEngageEngineEnhanceEnjoyEnlistEnoughEnrichEnrollEnsureEnterEntireEntryEnvelopeEpisodeEqualEquipEraEraseErodeErosionErrorEruptEscapeEssayEssenceEstateEternalEthicsEvidenceEvilEvokeEvolveExactExampleExcessExchangeExciteExcludeExcuseExecuteExerciseExhaustExhibitExileExistExitExoticExpandExpectExpireExplainExposeExpressExtendExtraEyeEyebrowFabricFaceFacultyFadeFaintFaithFallFalseFameFamilyFamousFanFancyFantasyFarmFashionFatFatalFatherFatigueFaultFavoriteFeatureFebruaryFederalFeeFeedFeelFemaleFenceFestivalFetchFeverFewFiberFictionFieldFigureFileFilmFilterFinalFindFineFingerFinishFireFirmFirstFiscalFishFitFitnessFixFlagFlameFlashFlatFlavorFleeFlightFlipFloatFlockFloorFlowerFluidFlushFlyFoamFocusFogFoilFoldFollowFoodFootForceForestForgetForkFortuneForumForwardFossilFosterFoundFoxFragileFrameFrequentFreshFriendFringeFrogFrontFrostFrownFrozenFruitFuelFunFunnyFurnaceFuryFutureGadgetGainGalaxyGalleryGameGapGarageGarbageGardenGarlicGarmentGasGaspGateGatherGaugeGazeGeneralGeniusGenreGentleGenuineGestureGhostGiantGiftGiggleGingerGiraffeGirlGiveGladGlanceGlareGlassGlideGlimpseGlobeGloomGloryGloveGlowGlueGoatGoddessGoldGoodGooseGorillaGospelGossipGovernGownGrabGraceGrainGrantGrapeGrassGravityGreatGreenGridGriefGritGroceryGroupGrowGruntGuardGuessGuideGuiltGuitarGunGymHabitHairHalfHammerHamsterHandHappyHarborHardHarshHarvestHatHaveHawkHazardHeadHealthHeartHeavyHedgehogHeightHelloHelmetHelpHenHeroHiddenHighHillHintHipHireHistoryHobbyHockeyHoldHoleHolidayHollowHomeHoneyHoodHopeHornHorrorHorseHospitalHostHotelHourHoverHubHugeHumanHumbleHumorHundredHungryHuntHurdleHurryHurtHusbandHybridIceIconIdeaIdentifyIdleIgnoreIllIllegalIllnessImageImitateImmenseImmuneImpactImposeImproveImpulseInchIncludeIncomeIncreaseIndexIndicateIndoorIndustryInfantInflictInformInhaleInheritInitialInjectInjuryInmateInnerInnocentInputInquiryInsaneInsectInsideInspireInstallIntactInterestIntoInvestInviteInvolveIronIslandIsolateIssueItemIvoryJacketJaguarJarJazzJealousJeansJellyJewelJobJoinJokeJourneyJoyJudgeJuiceJumpJungleJuniorJunkJustKangarooKeenKeepKetchupKeyKickKidKidneyKindKingdomKissKitKitchenKiteKittenKiwiKneeKnifeKnockKnowLabLabelLaborLadderLadyLakeLampLanguageLaptopLargeLaterLatinLaughLaundryLavaLawLawnLawsuitLayerLazyLeaderLeafLearnLeaveLectureLeftLegLegalLegendLeisureLemonLendLengthLensLeopardLessonLetterLevelLiarLibertyLibraryLicenseLifeLiftLightLikeLimbLimitLinkLionLiquidListLittleLiveLizardLoadLoanLobsterLocalLockLogicLonelyLongLoopLotteryLoudLoungeLoveLoyalLuckyLuggageLumberLunarLunchLuxuryLyricsMachineMadMagicMagnetMaidMailMainMajorMakeMammalManManageMandateMangoMansionManualMapleMarbleMarchMarginMarineMarketMarriageMaskMassMasterMatchMaterialMathMatrixMatterMaximumMazeMeadowMeanMeasureMeatMechanicMedalMediaMelodyMeltMemberMemoryMentionMenuMercyMergeMeritMerryMeshMessageMetalMethodMiddleMidnightMilkMillionMimicMindMinimumMinorMinuteMiracleMirrorMiseryMissMistakeMixMixedMixtureMobileModelModifyMomMomentMonitorMonkeyMonsterMonthMoonMoralMoreMorningMosquitoMotherMotionMotorMountainMouseMoveMovieMuchMuffinMuleMultiplyMuscleMuseumMushroomMusicMustMutualMyselfMysteryMythNaiveNameNapkinNarrowNastyNationNatureNearNeckNeedNegativeNeglectNeitherNephewNerveNestNetNetworkNeutralNeverNewsNextNiceNightNobleNoiseNomineeNoodleNormalNorthNoseNotableNoteNothingNoticeNovelNowNuclearNumberNurseNutOakObeyObjectObligeObscureObserveObtainObviousOccurOceanOctoberOdorOffOfferOfficeOftenOilOkayOldOliveOlympicOmitOnceOneOnionOnlineOnlyOpenOperaOpinionOpposeOptionOrangeOrbitOrchardOrderOrdinaryOrganOrientOriginalOrphanOstrichOtherOutdoorOuterOutputOutsideOvalOvenOverOwnOwnerOxygenOysterOzonePactPaddlePagePairPalacePalmPandaPanelPanicPantherPaperParadeParentParkParrotPartyPassPatchPathPatientPatrolPatternPausePavePaymentPeacePeanutPearPeasantPelicanPenPenaltyPencilPeoplePepperPerfectPermitPersonPetPhonePhotoPhrasePhysicalPianoPicnicPicturePiecePigPigeonPillPilotPinkPioneerPipePistolPitchPizzaPlacePlanetPlasticPlatePlayPleasePledgePluckPlugPlungePoemPoetPointPolarPolePolicePondPonyPoolPopularPortionPositionPossiblePostPotatoPotteryPovertyPowderPowerPracticePraisePredictPreferPreparePresentPrettyPreventPricePridePrimaryPrintPriorityPrisonPrivatePrizeProblemProcessProduceProfitProgramProjectPromoteProofPropertyProsperProtectProudProvidePublicPuddingPullPulpPulsePumpkinPunchPupilPuppyPurchasePurityPurposePursePushPutPuzzlePyramidQualityQuantumQuarterQuestionQuickQuitQuizQuoteRabbitRaccoonRaceRackRadarRadioRailRainRaiseRallyRampRanchRandomRangeRapidRareRateRatherRavenRawRazorReadyRealReasonRebelRebuildRecallReceiveRecipeRecordRecycleReduceReflectReformRefuseRegionRegretRegularRejectRelaxReleaseReliefRelyRemainRememberRemindRemoveRenderRenewRentReopenRepairRepeatReplaceReportRequireRescueResembleResistResourceResponseResultRetireRetreatReturnReunionRevealReviewRewardRhythmRibRibbonRiceRichRideRidgeRifleRightRigidRingRiotRippleRiskRitualRivalRiverRoadRoastRobotRobustRocketRomanceRoofRookieRoomRoseRotateRoughRoundRouteRoyalRubberRudeRugRuleRunRunwayRuralSadSaddleSadnessSafeSailSaladSalmonSalonSaltSaluteSameSampleSandSatisfySatoshiSauceSausageSaveSayScaleScanScareScatterSceneSchemeSchoolScienceScissorsScorpionScoutScrapScreenScriptScrubSeaSearchSeasonSeatSecondSecretSectionSecuritySeedSeekSegmentSelectSellSeminarSeniorSenseSentenceSeriesServiceSessionSettleSetupSevenShadowShaftShallowShareShedShellSheriffShieldShiftShineShipShiverShockShoeShootShopShortShoulderShoveShrimpShrugShuffleShySiblingSickSideSiegeSightSignSilentSilkSillySilverSimilarSimpleSinceSingSirenSisterSituateSixSizeSkateSketchSkiSkillSkinSkirtSkullSlabSlamSleepSlenderSliceSlideSlightSlimSloganSlotSlowSlushSmallSmartSmileSmokeSmoothSnackSnakeSnapSniffSnowSoapSoccerSocialSockSodaSoftSolarSoldierSolidSolutionSolveSomeoneSongSoonSorrySortSoulSoundSoupSourceSouthSpaceSpareSpatialSpawnSpeakSpecialSpeedSpellSpendSphereSpiceSpiderSpikeSpinSpiritSplitSpoilSponsorSpoonSportSpotSpraySpreadSpringSpySquareSqueezeSquirrelStableStadiumStaffStageStairsStampStandStartStateStaySteakSteelStemStepStereoStickStillStingStockStomachStoneStoolStoryStoveStrategyStreetStrikeStrongStruggleStudentStuffStumbleStyleSubjectSubmitSubwaySuccessSuchSuddenSufferSugarSuggestSuitSummerSunSunnySunsetSuperSupplySupremeSureSurfaceSurgeSurpriseSurroundSurveySuspectSustainSwallowSwampSwapSwarmSwearSweetSwiftSwimSwingSwitchSwordSymbolSymptomSyrupSystemTableTackleTagTailTalentTalkTankTapeTargetTaskTasteTattooTaxiTeachTeamTellTenTenantTennisTentTermTestTextThankThatThemeThenTheoryThereTheyThingThisThoughtThreeThriveThrowThumbThunderTicketTideTigerTiltTimberTimeTinyTipTiredTissueTitleToastTobaccoTodayToddlerToeTogetherToiletTokenTomatoTomorrowToneTongueTonightToolToothTopTopicToppleTorchTornadoTortoiseTossTotalTouristTowardTowerTownToyTrackTradeTrafficTragicTrainTransferTrapTrashTravelTrayTreatTreeTrendTrialTribeTrickTriggerTrimTripTrophyTroubleTruckTrueTrulyTrumpetTrustTruthTryTubeTuitionTumbleTunaTunnelTurkeyTurnTurtleTwelveTwentyTwiceTwinTwistTwoTypeTypicalUglyUmbrellaUnableUnawareUncleUncoverUnderUndoUnfairUnfoldUnhappyUniformUniqueUnitUniverseUnknownUnlockUntilUnusualUnveilUpdateUpgradeUpholdUponUpperUpsetUrbanUrgeUsageUseUsedUsefulUselessUsualUtilityVacantVacuumVagueValidValleyValveVanVanishVaporVariousVastVaultVehicleVelvetVendorVentureVenueVerbVerifyVersionVeryVesselVeteranViableVibrantViciousVictoryVideoViewVillageVintageViolinVirtualVirusVisaVisitVisualVitalVividVocalVoiceVoidVolcanoVolumeVoteVoyageWageWagonWaitWalkWallWalnutWantWarfareWarmWarriorWashWaspWasteWaterWaveWayWealthWeaponWearWeaselWeatherWebWeddingWeekendWeirdWelcomeWestWetWhaleWhatWheatWheelWhenWhereWhipWhisperWideWidthWifeWildWillWinWindowWineWingWinkWinnerWinterWireWisdomWiseWishWitnessWolfWomanWonderWoodWoolWordWorkWorldWorryWorthWrapWreckWrestleWristWriteWrongYardYearYellowYouYoungYouthZebraZeroZoneZoo"; +var wordlist = null; +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" "); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (wordlist_1.Wordlist.check(lang) !== "0x3c8acc1e7b08d8e76f9fda015ef48dc8c710a73cb7e0f77b2c18a9b5a7adde60") { + wordlist = null; + throw new Error("BIP39 Wordlist for en (English) FAILED"); + } +} +var LangEn = /** @class */ (function (_super) { + __extends(LangEn, _super); + function LangEn() { + return _super.call(this, "en") || this; + } + LangEn.prototype.getWord = function (index) { + loadWords(this); + return wordlist[index]; + }; + LangEn.prototype.getWordIndex = function (word) { + loadWords(this); + return wordlist.indexOf(word); + }; + return LangEn; +}(wordlist_1.Wordlist)); +var langEn = new LangEn(); +exports.langEn = langEn; +wordlist_1.Wordlist.register(langEn); + +},{"./wordlist":120}],114:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.langEs = void 0; +var strings_1 = require("@ethersproject/strings"); +var wordlist_1 = require("./wordlist"); +var words = "A/bacoAbdomenAbejaAbiertoAbogadoAbonoAbortoAbrazoAbrirAbueloAbusoAcabarAcademiaAccesoAccio/nAceiteAcelgaAcentoAceptarA/cidoAclararAcne/AcogerAcosoActivoActoActrizActuarAcudirAcuerdoAcusarAdictoAdmitirAdoptarAdornoAduanaAdultoAe/reoAfectarAficio/nAfinarAfirmarA/gilAgitarAgoni/aAgostoAgotarAgregarAgrioAguaAgudoA/guilaAgujaAhogoAhorroAireAislarAjedrezAjenoAjusteAlacra/nAlambreAlarmaAlbaA/lbumAlcaldeAldeaAlegreAlejarAlertaAletaAlfilerAlgaAlgodo/nAliadoAlientoAlivioAlmaAlmejaAlmi/barAltarAltezaAltivoAltoAlturaAlumnoAlzarAmableAmanteAmapolaAmargoAmasarA/mbarA/mbitoAmenoAmigoAmistadAmorAmparoAmplioAnchoAncianoAnclaAndarAnde/nAnemiaA/nguloAnilloA/nimoAni/sAnotarAntenaAntiguoAntojoAnualAnularAnuncioA~adirA~ejoA~oApagarAparatoApetitoApioAplicarApodoAporteApoyoAprenderAprobarApuestaApuroAradoAra~aArarA/rbitroA/rbolArbustoArchivoArcoArderArdillaArduoA/reaA/ridoAriesArmoni/aArne/sAromaArpaArpo/nArregloArrozArrugaArteArtistaAsaAsadoAsaltoAscensoAsegurarAseoAsesorAsientoAsiloAsistirAsnoAsombroA/speroAstillaAstroAstutoAsumirAsuntoAtajoAtaqueAtarAtentoAteoA/ticoAtletaA/tomoAtraerAtrozAtu/nAudazAudioAugeAulaAumentoAusenteAutorAvalAvanceAvaroAveAvellanaAvenaAvestruzAvio/nAvisoAyerAyudaAyunoAzafra/nAzarAzoteAzu/carAzufreAzulBabaBaborBacheBahi/aBaileBajarBalanzaBalco/nBaldeBambu/BancoBandaBa~oBarbaBarcoBarnizBarroBa/sculaBasto/nBasuraBatallaBateri/aBatirBatutaBau/lBazarBebe/BebidaBelloBesarBesoBestiaBichoBienBingoBlancoBloqueBlusaBoaBobinaBoboBocaBocinaBodaBodegaBoinaBolaBoleroBolsaBombaBondadBonitoBonoBonsa/iBordeBorrarBosqueBoteBoti/nBo/vedaBozalBravoBrazoBrechaBreveBrilloBrincoBrisaBrocaBromaBronceBroteBrujaBruscoBrutoBuceoBucleBuenoBueyBufandaBufo/nBu/hoBuitreBultoBurbujaBurlaBurroBuscarButacaBuzo/nCaballoCabezaCabinaCabraCacaoCada/verCadenaCaerCafe/Cai/daCaima/nCajaCajo/nCalCalamarCalcioCaldoCalidadCalleCalmaCalorCalvoCamaCambioCamelloCaminoCampoCa/ncerCandilCanelaCanguroCanicaCantoCa~aCa~o/nCaobaCaosCapazCapita/nCapoteCaptarCapuchaCaraCarbo/nCa/rcelCaretaCargaCari~oCarneCarpetaCarroCartaCasaCascoCaseroCaspaCastorCatorceCatreCaudalCausaCazoCebollaCederCedroCeldaCe/lebreCelosoCe/lulaCementoCenizaCentroCercaCerdoCerezaCeroCerrarCertezaCe/spedCetroChacalChalecoChampu/ChanclaChapaCharlaChicoChisteChivoChoqueChozaChuletaChuparCiclo/nCiegoCieloCienCiertoCifraCigarroCimaCincoCineCintaCipre/sCircoCiruelaCisneCitaCiudadClamorClanClaroClaseClaveClienteClimaCli/nicaCobreCoccio/nCochinoCocinaCocoCo/digoCodoCofreCogerCoheteCoji/nCojoColaColchaColegioColgarColinaCollarColmoColumnaCombateComerComidaCo/modoCompraCondeConejoCongaConocerConsejoContarCopaCopiaCorazo/nCorbataCorchoCordo/nCoronaCorrerCoserCosmosCostaCra/neoCra/terCrearCrecerCrei/doCremaCri/aCrimenCriptaCrisisCromoCro/nicaCroquetaCrudoCruzCuadroCuartoCuatroCuboCubrirCucharaCuelloCuentoCuerdaCuestaCuevaCuidarCulebraCulpaCultoCumbreCumplirCunaCunetaCuotaCupo/nCu/pulaCurarCuriosoCursoCurvaCutisDamaDanzaDarDardoDa/tilDeberDe/bilDe/cadaDecirDedoDefensaDefinirDejarDelfi/nDelgadoDelitoDemoraDensoDentalDeporteDerechoDerrotaDesayunoDeseoDesfileDesnudoDestinoDesvi/oDetalleDetenerDeudaDi/aDiabloDiademaDiamanteDianaDiarioDibujoDictarDienteDietaDiezDifi/cilDignoDilemaDiluirDineroDirectoDirigirDiscoDise~oDisfrazDivaDivinoDobleDoceDolorDomingoDonDonarDoradoDormirDorsoDosDosisDrago/nDrogaDuchaDudaDueloDue~oDulceDu/oDuqueDurarDurezaDuroE/banoEbrioEcharEcoEcuadorEdadEdicio/nEdificioEditorEducarEfectoEficazEjeEjemploElefanteElegirElementoElevarElipseE/liteElixirElogioEludirEmbudoEmitirEmocio/nEmpateEmpe~oEmpleoEmpresaEnanoEncargoEnchufeEnci/aEnemigoEneroEnfadoEnfermoEnga~oEnigmaEnlaceEnormeEnredoEnsayoEnse~arEnteroEntrarEnvaseEnvi/oE/pocaEquipoErizoEscalaEscenaEscolarEscribirEscudoEsenciaEsferaEsfuerzoEspadaEspejoEspi/aEsposaEspumaEsqui/EstarEsteEstiloEstufaEtapaEternoE/ticaEtniaEvadirEvaluarEventoEvitarExactoExamenExcesoExcusaExentoExigirExilioExistirE/xitoExpertoExplicarExponerExtremoFa/bricaFa/bulaFachadaFa/cilFactorFaenaFajaFaldaFalloFalsoFaltarFamaFamiliaFamosoFarao/nFarmaciaFarolFarsaFaseFatigaFaunaFavorFaxFebreroFechaFelizFeoFeriaFerozFe/rtilFervorFesti/nFiableFianzaFiarFibraFiccio/nFichaFideoFiebreFielFieraFiestaFiguraFijarFijoFilaFileteFilialFiltroFinFincaFingirFinitoFirmaFlacoFlautaFlechaFlorFlotaFluirFlujoFlu/orFobiaFocaFogataFogo/nFolioFolletoFondoFormaForroFortunaForzarFosaFotoFracasoFra/gilFranjaFraseFraudeFrei/rFrenoFresaFri/oFritoFrutaFuegoFuenteFuerzaFugaFumarFuncio/nFundaFurgo/nFuriaFusilFu/tbolFuturoGacelaGafasGaitaGajoGalaGaleri/aGalloGambaGanarGanchoGangaGansoGarajeGarzaGasolinaGastarGatoGavila/nGemeloGemirGenGe/neroGenioGenteGeranioGerenteGermenGestoGiganteGimnasioGirarGiroGlaciarGloboGloriaGolGolfoGolosoGolpeGomaGordoGorilaGorraGotaGoteoGozarGradaGra/ficoGranoGrasaGratisGraveGrietaGrilloGripeGrisGritoGrosorGru/aGruesoGrumoGrupoGuanteGuapoGuardiaGuerraGui/aGui~oGuionGuisoGuitarraGusanoGustarHaberHa/bilHablarHacerHachaHadaHallarHamacaHarinaHazHaza~aHebillaHebraHechoHeladoHelioHembraHerirHermanoHe/roeHervirHieloHierroHi/gadoHigieneHijoHimnoHistoriaHocicoHogarHogueraHojaHombreHongoHonorHonraHoraHormigaHornoHostilHoyoHuecoHuelgaHuertaHuesoHuevoHuidaHuirHumanoHu/medoHumildeHumoHundirHuraca/nHurtoIconoIdealIdiomaI/doloIglesiaIglu/IgualIlegalIlusio/nImagenIma/nImitarImparImperioImponerImpulsoIncapazI/ndiceInerteInfielInformeIngenioInicioInmensoInmuneInnatoInsectoInstanteIntere/sI/ntimoIntuirInu/tilInviernoIraIrisIroni/aIslaIsloteJabali/Jabo/nJamo/nJarabeJardi/nJarraJaulaJazmi/nJefeJeringaJineteJornadaJorobaJovenJoyaJuergaJuevesJuezJugadorJugoJugueteJuicioJuncoJunglaJunioJuntarJu/piterJurarJustoJuvenilJuzgarKiloKoalaLabioLacioLacraLadoLadro/nLagartoLa/grimaLagunaLaicoLamerLa/minaLa/mparaLanaLanchaLangostaLanzaLa/pizLargoLarvaLa/stimaLataLa/texLatirLaurelLavarLazoLealLeccio/nLecheLectorLeerLegio/nLegumbreLejanoLenguaLentoLe~aLeo/nLeopardoLesio/nLetalLetraLeveLeyendaLibertadLibroLicorLi/derLidiarLienzoLigaLigeroLimaLi/miteLimo/nLimpioLinceLindoLi/neaLingoteLinoLinternaLi/quidoLisoListaLiteraLitioLitroLlagaLlamaLlantoLlaveLlegarLlenarLlevarLlorarLloverLluviaLoboLocio/nLocoLocuraLo/gicaLogroLombrizLomoLonjaLoteLuchaLucirLugarLujoLunaLunesLupaLustroLutoLuzMacetaMachoMaderaMadreMaduroMaestroMafiaMagiaMagoMai/zMaldadMaletaMallaMaloMama/MamboMamutMancoMandoManejarMangaManiqui/ManjarManoMansoMantaMa~anaMapaMa/quinaMarMarcoMareaMarfilMargenMaridoMa/rmolMarro/nMartesMarzoMasaMa/scaraMasivoMatarMateriaMatizMatrizMa/ximoMayorMazorcaMechaMedallaMedioMe/dulaMejillaMejorMelenaMelo/nMemoriaMenorMensajeMenteMenu/MercadoMerengueMe/ritoMesMeso/nMetaMeterMe/todoMetroMezclaMiedoMielMiembroMigaMilMilagroMilitarMillo/nMimoMinaMineroMi/nimoMinutoMiopeMirarMisaMiseriaMisilMismoMitadMitoMochilaMocio/nModaModeloMohoMojarMoldeMolerMolinoMomentoMomiaMonarcaMonedaMonjaMontoMo~oMoradaMorderMorenoMorirMorroMorsaMortalMoscaMostrarMotivoMoverMo/vilMozoMuchoMudarMuebleMuelaMuerteMuestraMugreMujerMulaMuletaMultaMundoMu~ecaMuralMuroMu/sculoMuseoMusgoMu/sicaMusloNa/carNacio/nNadarNaipeNaranjaNarizNarrarNasalNatalNativoNaturalNa/useaNavalNaveNavidadNecioNe/ctarNegarNegocioNegroNeo/nNervioNetoNeutroNevarNeveraNichoNidoNieblaNietoNi~ezNi~oNi/tidoNivelNoblezaNocheNo/minaNoriaNormaNorteNotaNoticiaNovatoNovelaNovioNubeNucaNu/cleoNudilloNudoNueraNueveNuezNuloNu/meroNutriaOasisObesoObispoObjetoObraObreroObservarObtenerObvioOcaOcasoOce/anoOchentaOchoOcioOcreOctavoOctubreOcultoOcuparOcurrirOdiarOdioOdiseaOesteOfensaOfertaOficioOfrecerOgroOi/doOi/rOjoOlaOleadaOlfatoOlivoOllaOlmoOlorOlvidoOmbligoOndaOnzaOpacoOpcio/nO/peraOpinarOponerOptarO/pticaOpuestoOracio/nOradorOralO/rbitaOrcaOrdenOrejaO/rganoOrgi/aOrgulloOrienteOrigenOrillaOroOrquestaOrugaOsadi/aOscuroOseznoOsoOstraOto~oOtroOvejaO/vuloO/xidoOxi/genoOyenteOzonoPactoPadrePaellaPa/ginaPagoPai/sPa/jaroPalabraPalcoPaletaPa/lidoPalmaPalomaPalparPanPanalPa/nicoPanteraPa~ueloPapa/PapelPapillaPaquetePararParcelaParedParirParoPa/rpadoParquePa/rrafoPartePasarPaseoPasio/nPasoPastaPataPatioPatriaPausaPautaPavoPayasoPeato/nPecadoPeceraPechoPedalPedirPegarPeinePelarPelda~oPeleaPeligroPellejoPeloPelucaPenaPensarPe~o/nPeo/nPeorPepinoPeque~oPeraPerchaPerderPerezaPerfilPericoPerlaPermisoPerroPersonaPesaPescaPe/simoPesta~aPe/taloPetro/leoPezPezu~aPicarPicho/nPiePiedraPiernaPiezaPijamaPilarPilotoPimientaPinoPintorPinzaPi~aPiojoPipaPirataPisarPiscinaPisoPistaPito/nPizcaPlacaPlanPlataPlayaPlazaPleitoPlenoPlomoPlumaPluralPobrePocoPoderPodioPoemaPoesi/aPoetaPolenPolici/aPolloPolvoPomadaPomeloPomoPompaPonerPorcio/nPortalPosadaPoseerPosiblePostePotenciaPotroPozoPradoPrecozPreguntaPremioPrensaPresoPrevioPrimoPri/ncipePrisio/nPrivarProaProbarProcesoProductoProezaProfesorProgramaProlePromesaProntoPropioPro/ximoPruebaPu/blicoPucheroPudorPuebloPuertaPuestoPulgaPulirPulmo/nPulpoPulsoPumaPuntoPu~alPu~oPupaPupilaPure/QuedarQuejaQuemarQuererQuesoQuietoQui/micaQuinceQuitarRa/banoRabiaRaboRacio/nRadicalRai/zRamaRampaRanchoRangoRapazRa/pidoRaptoRasgoRaspaRatoRayoRazaRazo/nReaccio/nRealidadReba~oReboteRecaerRecetaRechazoRecogerRecreoRectoRecursoRedRedondoReducirReflejoReformaRefra/nRefugioRegaloRegirReglaRegresoRehe/nReinoRei/rRejaRelatoRelevoRelieveRellenoRelojRemarRemedioRemoRencorRendirRentaRepartoRepetirReposoReptilResRescateResinaRespetoRestoResumenRetiroRetornoRetratoReunirReve/sRevistaReyRezarRicoRiegoRiendaRiesgoRifaRi/gidoRigorRinco/nRi~o/nRi/oRiquezaRisaRitmoRitoRizoRobleRoceRociarRodarRodeoRodillaRoerRojizoRojoRomeroRomperRonRoncoRondaRopaRoperoRosaRoscaRostroRotarRubi/RuborRudoRuedaRugirRuidoRuinaRuletaRuloRumboRumorRupturaRutaRutinaSa/badoSaberSabioSableSacarSagazSagradoSalaSaldoSaleroSalirSalmo/nSalo/nSalsaSaltoSaludSalvarSambaSancio/nSandi/aSanearSangreSanidadSanoSantoSapoSaqueSardinaSarte/nSastreSata/nSaunaSaxofo/nSeccio/nSecoSecretoSectaSedSeguirSeisSelloSelvaSemanaSemillaSendaSensorSe~alSe~orSepararSepiaSequi/aSerSerieSermo/nServirSesentaSesio/nSetaSetentaSeveroSexoSextoSidraSiestaSieteSigloSignoSi/labaSilbarSilencioSillaSi/mboloSimioSirenaSistemaSitioSituarSobreSocioSodioSolSolapaSoldadoSoledadSo/lidoSoltarSolucio/nSombraSondeoSonidoSonoroSonrisaSopaSoplarSoporteSordoSorpresaSorteoSoste/nSo/tanoSuaveSubirSucesoSudorSuegraSueloSue~oSuerteSufrirSujetoSulta/nSumarSuperarSuplirSuponerSupremoSurSurcoSure~oSurgirSustoSutilTabacoTabiqueTablaTabu/TacoTactoTajoTalarTalcoTalentoTallaTalo/nTama~oTamborTangoTanqueTapaTapeteTapiaTapo/nTaquillaTardeTareaTarifaTarjetaTarotTarroTartaTatuajeTauroTazaTazo/nTeatroTechoTeclaTe/cnicaTejadoTejerTejidoTelaTele/fonoTemaTemorTemploTenazTenderTenerTenisTensoTeori/aTerapiaTercoTe/rminoTernuraTerrorTesisTesoroTestigoTeteraTextoTezTibioTiburo/nTiempoTiendaTierraTiesoTigreTijeraTildeTimbreTi/midoTimoTintaTi/oTi/picoTipoTiraTiro/nTita/nTi/tereTi/tuloTizaToallaTobilloTocarTocinoTodoTogaToldoTomarTonoTontoToparTopeToqueTo/raxToreroTormentaTorneoToroTorpedoTorreTorsoTortugaTosToscoToserTo/xicoTrabajoTractorTraerTra/ficoTragoTrajeTramoTranceTratoTraumaTrazarTre/bolTreguaTreintaTrenTreparTresTribuTrigoTripaTristeTriunfoTrofeoTrompaTroncoTropaTroteTrozoTrucoTruenoTrufaTuberi/aTuboTuertoTumbaTumorTu/nelTu/nicaTurbinaTurismoTurnoTutorUbicarU/lceraUmbralUnidadUnirUniversoUnoUntarU~aUrbanoUrbeUrgenteUrnaUsarUsuarioU/tilUtopi/aUvaVacaVaci/oVacunaVagarVagoVainaVajillaValeVa/lidoValleValorVa/lvulaVampiroVaraVariarVaro/nVasoVecinoVectorVehi/culoVeinteVejezVelaVeleroVelozVenaVencerVendaVenenoVengarVenirVentaVenusVerVeranoVerboVerdeVeredaVerjaVersoVerterVi/aViajeVibrarVicioVi/ctimaVidaVi/deoVidrioViejoViernesVigorVilVillaVinagreVinoVi~edoVioli/nViralVirgoVirtudVisorVi/speraVistaVitaminaViudoVivazViveroVivirVivoVolca/nVolumenVolverVorazVotarVotoVozVueloVulgarYacerYateYeguaYemaYernoYesoYodoYogaYogurZafiroZanjaZapatoZarzaZonaZorroZumoZurdo"; +var lookup = {}; +var wordlist = null; +function dropDiacritic(word) { + wordlist_1.logger.checkNormalize(); + return strings_1.toUtf8String(Array.prototype.filter.call(strings_1.toUtf8Bytes(word.normalize("NFD").toLowerCase()), function (c) { + return ((c >= 65 && c <= 90) || (c >= 97 && c <= 123)); + })); +} +function expand(word) { + var output = []; + Array.prototype.forEach.call(strings_1.toUtf8Bytes(word), function (c) { + // Acute accent + if (c === 47) { + output.push(204); + output.push(129); + // n-tilde + } + else if (c === 126) { + output.push(110); + output.push(204); + output.push(131); + } + else { + output.push(c); + } + }); + return strings_1.toUtf8String(output); +} +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" ").map(function (w) { return expand(w); }); + wordlist.forEach(function (word, index) { + lookup[dropDiacritic(word)] = index; + }); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (wordlist_1.Wordlist.check(lang) !== "0xf74fb7092aeacdfbf8959557de22098da512207fb9f109cb526994938cf40300") { + wordlist = null; + throw new Error("BIP39 Wordlist for es (Spanish) FAILED"); + } +} +var LangEs = /** @class */ (function (_super) { + __extends(LangEs, _super); + function LangEs() { + return _super.call(this, "es") || this; + } + LangEs.prototype.getWord = function (index) { + loadWords(this); + return wordlist[index]; + }; + LangEs.prototype.getWordIndex = function (word) { + loadWords(this); + return lookup[dropDiacritic(word)]; + }; + return LangEs; +}(wordlist_1.Wordlist)); +var langEs = new LangEs(); +exports.langEs = langEs; +wordlist_1.Wordlist.register(langEs); + +},{"./wordlist":120,"@ethersproject/strings":99}],115:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.langFr = void 0; +var strings_1 = require("@ethersproject/strings"); +var wordlist_1 = require("./wordlist"); +var words = "AbaisserAbandonAbdiquerAbeilleAbolirAborderAboutirAboyerAbrasifAbreuverAbriterAbrogerAbruptAbsenceAbsoluAbsurdeAbusifAbyssalAcade/mieAcajouAcarienAccablerAccepterAcclamerAccoladeAccrocheAccuserAcerbeAchatAcheterAcidulerAcierAcompteAcque/rirAcronymeActeurActifActuelAdepteAde/quatAdhe/sifAdjectifAdjugerAdmettreAdmirerAdopterAdorerAdoucirAdresseAdroitAdulteAdverbeAe/rerAe/ronefAffaireAffecterAfficheAffreuxAffublerAgacerAgencerAgileAgiterAgraferAgre/ableAgrumeAiderAiguilleAilierAimableAisanceAjouterAjusterAlarmerAlchimieAlerteAlge-breAlgueAlie/nerAlimentAlle/gerAlliageAllouerAllumerAlourdirAlpagaAltesseAlve/oleAmateurAmbiguAmbreAme/nagerAmertumeAmidonAmiralAmorcerAmourAmovibleAmphibieAmpleurAmusantAnalyseAnaphoreAnarchieAnatomieAncienAne/antirAngleAngoisseAnguleuxAnimalAnnexerAnnonceAnnuelAnodinAnomalieAnonymeAnormalAntenneAntidoteAnxieuxApaiserApe/ritifAplanirApologieAppareilAppelerApporterAppuyerAquariumAqueducArbitreArbusteArdeurArdoiseArgentArlequinArmatureArmementArmoireArmureArpenterArracherArriverArroserArsenicArte/rielArticleAspectAsphalteAspirerAssautAsservirAssietteAssocierAssurerAsticotAstreAstuceAtelierAtomeAtriumAtroceAttaqueAttentifAttirerAttraperAubaineAubergeAudaceAudibleAugurerAuroreAutomneAutrucheAvalerAvancerAvariceAvenirAverseAveugleAviateurAvideAvionAviserAvoineAvouerAvrilAxialAxiomeBadgeBafouerBagageBaguetteBaignadeBalancerBalconBaleineBalisageBambinBancaireBandageBanlieueBannie-reBanquierBarbierBarilBaronBarqueBarrageBassinBastionBatailleBateauBatterieBaudrierBavarderBeletteBe/lierBeloteBe/ne/ficeBerceauBergerBerlineBermudaBesaceBesogneBe/tailBeurreBiberonBicycleBiduleBijouBilanBilingueBillardBinaireBiologieBiopsieBiotypeBiscuitBisonBistouriBitumeBizarreBlafardBlagueBlanchirBlessantBlinderBlondBloquerBlousonBobardBobineBoireBoiserBolideBonbonBondirBonheurBonifierBonusBordureBorneBotteBoucleBoueuxBougieBoulonBouquinBourseBoussoleBoutiqueBoxeurBrancheBrasierBraveBrebisBre-cheBreuvageBricolerBrigadeBrillantBriocheBriqueBrochureBroderBronzerBrousseBroyeurBrumeBrusqueBrutalBruyantBuffleBuissonBulletinBureauBurinBustierButinerButoirBuvableBuvetteCabanonCabineCachetteCadeauCadreCafe/ineCaillouCaissonCalculerCalepinCalibreCalmerCalomnieCalvaireCamaradeCame/raCamionCampagneCanalCanetonCanonCantineCanularCapableCaporalCapriceCapsuleCapterCapucheCarabineCarboneCaresserCaribouCarnageCarotteCarreauCartonCascadeCasierCasqueCassureCauserCautionCavalierCaverneCaviarCe/dilleCeintureCe/lesteCelluleCendrierCensurerCentralCercleCe/re/bralCeriseCernerCerveauCesserChagrinChaiseChaleurChambreChanceChapitreCharbonChasseurChatonChaussonChavirerChemiseChenilleChe/quierChercherChevalChienChiffreChignonChime-reChiotChlorureChocolatChoisirChoseChouetteChromeChuteCigareCigogneCimenterCine/maCintrerCirculerCirerCirqueCiterneCitoyenCitronCivilClaironClameurClaquerClasseClavierClientClignerClimatClivageClocheClonageCloporteCobaltCobraCocasseCocotierCoderCodifierCoffreCognerCohe/sionCoifferCoincerCole-reColibriCollineColmaterColonelCombatCome/dieCommandeCompactConcertConduireConfierCongelerConnoterConsonneContactConvexeCopainCopieCorailCorbeauCordageCornicheCorpusCorrectCorte-geCosmiqueCostumeCotonCoudeCoupureCourageCouteauCouvrirCoyoteCrabeCrainteCravateCrayonCre/atureCre/diterCre/meuxCreuserCrevetteCriblerCrierCristalCrite-reCroireCroquerCrotaleCrucialCruelCrypterCubiqueCueillirCuille-reCuisineCuivreCulminerCultiverCumulerCupideCuratifCurseurCyanureCycleCylindreCyniqueDaignerDamierDangerDanseurDauphinDe/battreDe/biterDe/borderDe/briderDe/butantDe/calerDe/cembreDe/chirerDe/ciderDe/clarerDe/corerDe/crireDe/cuplerDe/daleDe/ductifDe/esseDe/fensifDe/filerDe/frayerDe/gagerDe/givrerDe/glutirDe/graferDe/jeunerDe/liceDe/logerDemanderDemeurerDe/molirDe/nicherDe/nouerDentelleDe/nuderDe/partDe/penserDe/phaserDe/placerDe/poserDe/rangerDe/roberDe/sastreDescenteDe/sertDe/signerDe/sobe/irDessinerDestrierDe/tacherDe/testerDe/tourerDe/tresseDevancerDevenirDevinerDevoirDiableDialogueDiamantDicterDiffe/rerDige/rerDigitalDigneDiluerDimancheDiminuerDioxydeDirectifDirigerDiscuterDisposerDissiperDistanceDivertirDiviserDocileDocteurDogmeDoigtDomaineDomicileDompterDonateurDonjonDonnerDopamineDortoirDorureDosageDoseurDossierDotationDouanierDoubleDouceurDouterDoyenDragonDraperDresserDribblerDroitureDuperieDuplexeDurableDurcirDynastieE/blouirE/carterE/charpeE/chelleE/clairerE/clipseE/cloreE/cluseE/coleE/conomieE/corceE/couterE/craserE/cre/merE/crivainE/crouE/cumeE/cureuilE/difierE/duquerEffacerEffectifEffigieEffortEffrayerEffusionE/galiserE/garerE/jecterE/laborerE/largirE/lectronE/le/gantE/le/phantE/le-veE/ligibleE/litismeE/logeE/luciderE/luderEmballerEmbellirEmbryonE/meraudeE/missionEmmenerE/motionE/mouvoirEmpereurEmployerEmporterEmpriseE/mulsionEncadrerEnche-reEnclaveEncocheEndiguerEndosserEndroitEnduireE/nergieEnfanceEnfermerEnfouirEngagerEnginEngloberE/nigmeEnjamberEnjeuEnleverEnnemiEnnuyeuxEnrichirEnrobageEnseigneEntasserEntendreEntierEntourerEntraverE/nume/rerEnvahirEnviableEnvoyerEnzymeE/olienE/paissirE/pargneE/patantE/pauleE/picerieE/pide/mieE/pierE/pilogueE/pineE/pisodeE/pitapheE/poqueE/preuveE/prouverE/puisantE/querreE/quipeE/rigerE/rosionErreurE/ruptionEscalierEspadonEspe-ceEspie-gleEspoirEspritEsquiverEssayerEssenceEssieuEssorerEstimeEstomacEstradeE/tage-reE/talerE/tancheE/tatiqueE/teindreE/tendoirE/ternelE/thanolE/thiqueEthnieE/tirerE/tofferE/toileE/tonnantE/tourdirE/trangeE/troitE/tudeEuphorieE/valuerE/vasionE/ventailE/videnceE/viterE/volutifE/voquerExactExage/rerExaucerExcellerExcitantExclusifExcuseExe/cuterExempleExercerExhalerExhorterExigenceExilerExisterExotiqueExpe/dierExplorerExposerExprimerExquisExtensifExtraireExulterFableFabuleuxFacetteFacileFactureFaiblirFalaiseFameuxFamilleFarceurFarfeluFarineFaroucheFascinerFatalFatigueFauconFautifFaveurFavoriFe/brileFe/conderFe/de/rerFe/linFemmeFe/murFendoirFe/odalFermerFe/roceFerveurFestivalFeuilleFeutreFe/vrierFiascoFicelerFictifFide-leFigureFilatureFiletageFilie-reFilleulFilmerFilouFiltrerFinancerFinirFioleFirmeFissureFixerFlairerFlammeFlasqueFlatteurFle/auFle-cheFleurFlexionFloconFloreFluctuerFluideFluvialFolieFonderieFongibleFontaineForcerForgeronFormulerFortuneFossileFoudreFouge-reFouillerFoulureFourmiFragileFraiseFranchirFrapperFrayeurFre/gateFreinerFrelonFre/mirFre/ne/sieFre-reFriableFrictionFrissonFrivoleFroidFromageFrontalFrotterFruitFugitifFuiteFureurFurieuxFurtifFusionFuturGagnerGalaxieGalerieGambaderGarantirGardienGarnirGarrigueGazelleGazonGe/antGe/latineGe/luleGendarmeGe/ne/ralGe/nieGenouGentilGe/ologieGe/ome-treGe/raniumGermeGestuelGeyserGibierGiclerGirafeGivreGlaceGlaiveGlisserGlobeGloireGlorieuxGolfeurGommeGonflerGorgeGorilleGoudronGouffreGoulotGoupilleGourmandGoutteGraduelGraffitiGraineGrandGrappinGratuitGravirGrenatGriffureGrillerGrimperGrognerGronderGrotteGroupeGrugerGrutierGruye-reGue/pardGuerrierGuideGuimauveGuitareGustatifGymnasteGyrostatHabitudeHachoirHalteHameauHangarHannetonHaricotHarmonieHarponHasardHe/liumHe/matomeHerbeHe/rissonHermineHe/ronHe/siterHeureuxHibernerHibouHilarantHistoireHiverHomardHommageHomoge-neHonneurHonorerHonteuxHordeHorizonHorlogeHormoneHorribleHouleuxHousseHublotHuileuxHumainHumbleHumideHumourHurlerHydromelHygie-neHymneHypnoseIdylleIgnorerIguaneIlliciteIllusionImageImbiberImiterImmenseImmobileImmuableImpactImpe/rialImplorerImposerImprimerImputerIncarnerIncendieIncidentInclinerIncoloreIndexerIndiceInductifIne/ditIneptieInexactInfiniInfligerInformerInfusionInge/rerInhalerInhiberInjecterInjureInnocentInoculerInonderInscrireInsecteInsigneInsoliteInspirerInstinctInsulterIntactIntenseIntimeIntrigueIntuitifInutileInvasionInventerInviterInvoquerIroniqueIrradierIrre/elIrriterIsolerIvoireIvresseJaguarJaillirJambeJanvierJardinJaugerJauneJavelotJetableJetonJeudiJeunesseJoindreJoncherJonglerJoueurJouissifJournalJovialJoyauJoyeuxJubilerJugementJuniorJuponJuristeJusticeJuteuxJuve/nileKayakKimonoKiosqueLabelLabialLabourerLace/rerLactoseLaguneLaineLaisserLaitierLambeauLamelleLampeLanceurLangageLanterneLapinLargeurLarmeLaurierLavaboLavoirLectureLe/galLe/gerLe/gumeLessiveLettreLevierLexiqueLe/zardLiasseLibe/rerLibreLicenceLicorneLie-geLie-vreLigatureLigoterLigueLimerLimiteLimonadeLimpideLine/aireLingotLionceauLiquideLisie-reListerLithiumLitigeLittoralLivreurLogiqueLointainLoisirLombricLoterieLouerLourdLoutreLouveLoyalLubieLucideLucratifLueurLugubreLuisantLumie-reLunaireLundiLuronLutterLuxueuxMachineMagasinMagentaMagiqueMaigreMaillonMaintienMairieMaisonMajorerMalaxerMale/ficeMalheurMaliceMalletteMammouthMandaterManiableManquantManteauManuelMarathonMarbreMarchandMardiMaritimeMarqueurMarronMartelerMascotteMassifMate/rielMatie-reMatraqueMaudireMaussadeMauveMaximalMe/chantMe/connuMe/dailleMe/decinMe/diterMe/duseMeilleurMe/langeMe/lodieMembreMe/moireMenacerMenerMenhirMensongeMentorMercrediMe/riteMerleMessagerMesureMe/talMe/te/oreMe/thodeMe/tierMeubleMiaulerMicrobeMietteMignonMigrerMilieuMillionMimiqueMinceMine/ralMinimalMinorerMinuteMiracleMiroiterMissileMixteMobileModerneMoelleuxMondialMoniteurMonnaieMonotoneMonstreMontagneMonumentMoqueurMorceauMorsureMortierMoteurMotifMoucheMoufleMoulinMoussonMoutonMouvantMultipleMunitionMurailleMure-neMurmureMuscleMuse/umMusicienMutationMuterMutuelMyriadeMyrtilleMyste-reMythiqueNageurNappeNarquoisNarrerNatationNationNatureNaufrageNautiqueNavireNe/buleuxNectarNe/fasteNe/gationNe/gligerNe/gocierNeigeNerveuxNettoyerNeuroneNeutronNeveuNicheNickelNitrateNiveauNobleNocifNocturneNoirceurNoisetteNomadeNombreuxNommerNormatifNotableNotifierNotoireNourrirNouveauNovateurNovembreNoviceNuageNuancerNuireNuisibleNume/roNuptialNuqueNutritifObe/irObjectifObligerObscurObserverObstacleObtenirObturerOccasionOccuperOce/anOctobreOctroyerOctuplerOculaireOdeurOdorantOffenserOfficierOffrirOgiveOiseauOisillonOlfactifOlivierOmbrageOmettreOnctueuxOndulerOne/reuxOniriqueOpaleOpaqueOpe/rerOpinionOpportunOpprimerOpterOptiqueOrageuxOrangeOrbiteOrdonnerOreilleOrganeOrgueilOrificeOrnementOrqueOrtieOscillerOsmoseOssatureOtarieOuraganOursonOutilOutragerOuvrageOvationOxydeOxyge-neOzonePaisiblePalacePalmare-sPalourdePalperPanachePandaPangolinPaniquerPanneauPanoramaPantalonPapayePapierPapoterPapyrusParadoxeParcelleParesseParfumerParlerParoleParrainParsemerPartagerParureParvenirPassionPaste-quePaternelPatiencePatronPavillonPavoiserPayerPaysagePeignePeintrePelagePe/licanPellePelousePeluchePendulePe/ne/trerPe/niblePensifPe/nuriePe/pitePe/plumPerdrixPerforerPe/riodePermuterPerplexePersilPertePeserPe/talePetitPe/trirPeuplePharaonPhobiePhoquePhotonPhrasePhysiquePianoPicturalPie-cePierrePieuvrePilotePinceauPipettePiquerPiroguePiscinePistonPivoterPixelPizzaPlacardPlafondPlaisirPlanerPlaquePlastronPlateauPleurerPlexusPliagePlombPlongerPluiePlumagePochettePoe/siePoe-tePointePoirierPoissonPoivrePolairePolicierPollenPolygonePommadePompierPonctuelPonde/rerPoneyPortiquePositionPosse/derPosturePotagerPoteauPotionPoucePoulainPoumonPourprePoussinPouvoirPrairiePratiquePre/cieuxPre/direPre/fixePre/ludePre/nomPre/sencePre/textePre/voirPrimitifPrincePrisonPriverProble-meProce/derProdigeProfondProgre-sProieProjeterProloguePromenerPropreProspe-reProte/gerProuesseProverbePrudencePruneauPsychosePublicPuceronPuiserPulpePulsarPunaisePunitifPupitrePurifierPuzzlePyramideQuasarQuerelleQuestionQuie/tudeQuitterQuotientRacineRaconterRadieuxRagondinRaideurRaisinRalentirRallongeRamasserRapideRasageRatisserRavagerRavinRayonnerRe/actifRe/agirRe/aliserRe/animerRecevoirRe/citerRe/clamerRe/colterRecruterReculerRecyclerRe/digerRedouterRefaireRe/flexeRe/formerRefrainRefugeRe/galienRe/gionRe/glageRe/gulierRe/ite/rerRejeterRejouerRelatifReleverReliefRemarqueReme-deRemiseRemonterRemplirRemuerRenardRenfortReniflerRenoncerRentrerRenvoiReplierReporterRepriseReptileRequinRe/serveRe/sineuxRe/soudreRespectResterRe/sultatRe/tablirRetenirRe/ticuleRetomberRetracerRe/unionRe/ussirRevancheRevivreRe/volteRe/vulsifRichesseRideauRieurRigideRigolerRincerRiposterRisibleRisqueRituelRivalRivie-reRocheuxRomanceRompreRonceRondinRoseauRosierRotatifRotorRotuleRougeRouilleRouleauRoutineRoyaumeRubanRubisRucheRuelleRugueuxRuinerRuisseauRuserRustiqueRythmeSablerSaboterSabreSacocheSafariSagesseSaisirSaladeSaliveSalonSaluerSamediSanctionSanglierSarcasmeSardineSaturerSaugrenuSaumonSauterSauvageSavantSavonnerScalpelScandaleSce/le/ratSce/narioSceptreSche/maScienceScinderScoreScrutinSculpterSe/anceSe/cableSe/cherSecouerSe/cre/terSe/datifSe/duireSeigneurSe/jourSe/lectifSemaineSemblerSemenceSe/minalSe/nateurSensibleSentenceSe/parerSe/quenceSereinSergentSe/rieuxSerrureSe/rumServiceSe/sameSe/virSevrageSextupleSide/ralSie-cleSie/gerSifflerSigleSignalSilenceSiliciumSimpleSince-reSinistreSiphonSiropSismiqueSituerSkierSocialSocleSodiumSoigneuxSoldatSoleilSolitudeSolubleSombreSommeilSomnolerSondeSongeurSonnetteSonoreSorcierSortirSosieSottiseSoucieuxSoudureSouffleSouleverSoupapeSourceSoutirerSouvenirSpacieuxSpatialSpe/cialSphe-reSpiralStableStationSternumStimulusStipulerStrictStudieuxStupeurStylisteSublimeSubstratSubtilSubvenirSucce-sSucreSuffixeSugge/rerSuiveurSulfateSuperbeSupplierSurfaceSuricateSurmenerSurpriseSursautSurvieSuspectSyllabeSymboleSyme/trieSynapseSyntaxeSyste-meTabacTablierTactileTaillerTalentTalismanTalonnerTambourTamiserTangibleTapisTaquinerTarderTarifTartineTasseTatamiTatouageTaupeTaureauTaxerTe/moinTemporelTenailleTendreTeneurTenirTensionTerminerTerneTerribleTe/tineTexteThe-meThe/orieThe/rapieThoraxTibiaTie-deTimideTirelireTiroirTissuTitaneTitreTituberTobogganTole/rantTomateToniqueTonneauToponymeTorcheTordreTornadeTorpilleTorrentTorseTortueTotemToucherTournageTousserToxineTractionTraficTragiqueTrahirTrainTrancherTravailTre-fleTremperTre/sorTreuilTriageTribunalTricoterTrilogieTriompheTriplerTriturerTrivialTromboneTroncTropicalTroupeauTuileTulipeTumulteTunnelTurbineTuteurTutoyerTuyauTympanTyphonTypiqueTyranUbuesqueUltimeUltrasonUnanimeUnifierUnionUniqueUnitaireUniversUraniumUrbainUrticantUsageUsineUsuelUsureUtileUtopieVacarmeVaccinVagabondVagueVaillantVaincreVaisseauValableValiseVallonValveVampireVanilleVapeurVarierVaseuxVassalVasteVecteurVedetteVe/ge/talVe/hiculeVeinardVe/loceVendrediVe/ne/rerVengerVenimeuxVentouseVerdureVe/rinVernirVerrouVerserVertuVestonVe/te/ranVe/tusteVexantVexerViaducViandeVictoireVidangeVide/oVignetteVigueurVilainVillageVinaigreViolonVipe-reVirementVirtuoseVirusVisageViseurVisionVisqueuxVisuelVitalVitesseViticoleVitrineVivaceVivipareVocationVoguerVoileVoisinVoitureVolailleVolcanVoltigerVolumeVoraceVortexVoterVouloirVoyageVoyelleWagonXe/nonYachtZe-breZe/nithZesteZoologie"; +var wordlist = null; +var lookup = {}; +function dropDiacritic(word) { + wordlist_1.logger.checkNormalize(); + return strings_1.toUtf8String(Array.prototype.filter.call(strings_1.toUtf8Bytes(word.normalize("NFD").toLowerCase()), function (c) { + return ((c >= 65 && c <= 90) || (c >= 97 && c <= 123)); + })); +} +function expand(word) { + var output = []; + Array.prototype.forEach.call(strings_1.toUtf8Bytes(word), function (c) { + // Acute accent + if (c === 47) { + output.push(204); + output.push(129); + // Grave accent + } + else if (c === 45) { + output.push(204); + output.push(128); + } + else { + output.push(c); + } + }); + return strings_1.toUtf8String(output); +} +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" ").map(function (w) { return expand(w); }); + wordlist.forEach(function (word, index) { + lookup[dropDiacritic(word)] = index; + }); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (wordlist_1.Wordlist.check(lang) !== "0x51deb7ae009149dc61a6bd18a918eb7ac78d2775726c68e598b92d002519b045") { + wordlist = null; + throw new Error("BIP39 Wordlist for fr (French) FAILED"); + } +} +var LangFr = /** @class */ (function (_super) { + __extends(LangFr, _super); + function LangFr() { + return _super.call(this, "fr") || this; + } + LangFr.prototype.getWord = function (index) { + loadWords(this); + return wordlist[index]; + }; + LangFr.prototype.getWordIndex = function (word) { + loadWords(this); + return lookup[dropDiacritic(word)]; + }; + return LangFr; +}(wordlist_1.Wordlist)); +var langFr = new LangFr(); +exports.langFr = langFr; +wordlist_1.Wordlist.register(langFr); + +},{"./wordlist":120,"@ethersproject/strings":99}],116:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.langIt = void 0; +var wordlist_1 = require("./wordlist"); +var words = "AbacoAbbaglioAbbinatoAbeteAbissoAbolireAbrasivoAbrogatoAccadereAccennoAccusatoAcetoneAchilleAcidoAcquaAcreAcrilicoAcrobataAcutoAdagioAddebitoAddomeAdeguatoAderireAdipeAdottareAdulareAffabileAffettoAffissoAffrantoAforismaAfosoAfricanoAgaveAgenteAgevoleAggancioAgireAgitareAgonismoAgricoloAgrumetoAguzzoAlabardaAlatoAlbatroAlberatoAlboAlbumeAlceAlcolicoAlettoneAlfaAlgebraAlianteAlibiAlimentoAllagatoAllegroAllievoAllodolaAllusivoAlmenoAlogenoAlpacaAlpestreAltalenaAlternoAlticcioAltroveAlunnoAlveoloAlzareAmalgamaAmanitaAmarenaAmbitoAmbratoAmebaAmericaAmetistaAmicoAmmassoAmmendaAmmirareAmmonitoAmoreAmpioAmpliareAmuletoAnacardoAnagrafeAnalistaAnarchiaAnatraAncaAncellaAncoraAndareAndreaAnelloAngeloAngolareAngustoAnimaAnnegareAnnidatoAnnoAnnuncioAnonimoAnticipoAnziApaticoAperturaApodeApparireAppetitoAppoggioApprodoAppuntoAprileArabicaArachideAragostaAraldicaArancioAraturaArazzoArbitroArchivioArditoArenileArgentoArgineArgutoAriaArmoniaArneseArredatoArringaArrostoArsenicoArsoArteficeArzilloAsciuttoAscoltoAsepsiAsetticoAsfaltoAsinoAsolaAspiratoAsproAssaggioAsseAssolutoAssurdoAstaAstenutoAsticeAstrattoAtavicoAteismoAtomicoAtonoAttesaAttivareAttornoAttritoAttualeAusilioAustriaAutistaAutonomoAutunnoAvanzatoAvereAvvenireAvvisoAvvolgereAzioneAzotoAzzimoAzzurroBabeleBaccanoBacinoBacoBadessaBadilataBagnatoBaitaBalconeBaldoBalenaBallataBalzanoBambinoBandireBaraondaBarbaroBarcaBaritonoBarlumeBaroccoBasilicoBassoBatostaBattutoBauleBavaBavosaBeccoBeffaBelgioBelvaBendaBenevoleBenignoBenzinaBereBerlinaBetaBibitaBiciBidoneBifidoBigaBilanciaBimboBinocoloBiologoBipedeBipolareBirbanteBirraBiscottoBisestoBisnonnoBisonteBisturiBizzarroBlandoBlattaBollitoBonificoBordoBoscoBotanicoBottinoBozzoloBraccioBradipoBramaBrancaBravuraBretellaBrevettoBrezzaBrigliaBrillanteBrindareBroccoloBrodoBronzinaBrulloBrunoBubboneBucaBudinoBuffoneBuioBulboBuonoBurloneBurrascaBussolaBustaCadettoCaducoCalamaroCalcoloCalesseCalibroCalmoCaloriaCambusaCamerataCamiciaCamminoCamolaCampaleCanapaCandelaCaneCaninoCanottoCantinaCapaceCapelloCapitoloCapogiroCapperoCapraCapsulaCarapaceCarcassaCardoCarismaCarovanaCarrettoCartolinaCasaccioCascataCasermaCasoCassoneCastelloCasualeCatastaCatenaCatrameCautoCavilloCedibileCedrataCefaloCelebreCellulareCenaCenoneCentesimoCeramicaCercareCertoCerumeCervelloCesoiaCespoCetoChelaChiaroChiccaChiedereChimeraChinaChirurgoChitarraCiaoCiclismoCifrareCignoCilindroCiottoloCircaCirrosiCitricoCittadinoCiuffoCivettaCivileClassicoClinicaCloroCoccoCodardoCodiceCoerenteCognomeCollareColmatoColoreColposoColtivatoColzaComaCometaCommandoComodoComputerComuneConcisoCondurreConfermaCongelareConiugeConnessoConoscereConsumoContinuoConvegnoCopertoCopioneCoppiaCopricapoCorazzaCordataCoricatoCorniceCorollaCorpoCorredoCorsiaCorteseCosmicoCostanteCotturaCovatoCratereCravattaCreatoCredereCremosoCrescitaCretaCricetoCrinaleCrisiCriticoCroceCronacaCrostataCrucialeCruscaCucireCuculoCuginoCullatoCupolaCuratoreCursoreCurvoCuscinoCustodeDadoDainoDalmataDamerinoDanielaDannosoDanzareDatatoDavantiDavveroDebuttoDecennioDecisoDeclinoDecolloDecretoDedicatoDefinitoDeformeDegnoDelegareDelfinoDelirioDeltaDemenzaDenotatoDentroDepositoDerapataDerivareDerogaDescrittoDesertoDesiderioDesumereDetersivoDevotoDiametroDicembreDiedroDifesoDiffusoDigerireDigitaleDiluvioDinamicoDinnanziDipintoDiplomaDipoloDiradareDireDirottoDirupoDisagioDiscretoDisfareDisgeloDispostoDistanzaDisumanoDitoDivanoDiveltoDividereDivoratoDobloneDocenteDoganaleDogmaDolceDomatoDomenicaDominareDondoloDonoDormireDoteDottoreDovutoDozzinaDragoDruidoDubbioDubitareDucaleDunaDuomoDupliceDuraturoEbanoEccessoEccoEclissiEconomiaEderaEdicolaEdileEditoriaEducareEgemoniaEgliEgoismoEgregioElaboratoElargireEleganteElencatoElettoElevareElficoElicaElmoElsaElusoEmanatoEmblemaEmessoEmiroEmotivoEmozioneEmpiricoEmuloEndemicoEnduroEnergiaEnfasiEnotecaEntrareEnzimaEpatiteEpilogoEpisodioEpocaleEppureEquatoreErarioErbaErbosoEredeEremitaErigereErmeticoEroeErosivoErranteEsagonoEsameEsanimeEsaudireEscaEsempioEsercitoEsibitoEsigenteEsistereEsitoEsofagoEsortatoEsosoEspansoEspressoEssenzaEssoEstesoEstimareEstoniaEstrosoEsultareEtilicoEtnicoEtruscoEttoEuclideoEuropaEvasoEvidenzaEvitatoEvolutoEvvivaFabbricaFaccendaFachiroFalcoFamigliaFanaleFanfaraFangoFantasmaFareFarfallaFarinosoFarmacoFasciaFastosoFasulloFaticareFatoFavolosoFebbreFecolaFedeFegatoFelpaFeltroFemminaFendereFenomenoFermentoFerroFertileFessuraFestivoFettaFeudoFiabaFiduciaFifaFiguratoFiloFinanzaFinestraFinireFioreFiscaleFisicoFiumeFlaconeFlamencoFleboFlemmaFloridoFluenteFluoroFobicoFocacciaFocosoFoderatoFoglioFolataFolcloreFolgoreFondenteFoneticoFoniaFontanaForbitoForchettaForestaFormicaFornaioForoFortezzaForzareFosfatoFossoFracassoFranaFrassinoFratelloFreccettaFrenataFrescoFrigoFrollinoFrondeFrugaleFruttaFucilataFucsiaFuggenteFulmineFulvoFumanteFumettoFumosoFuneFunzioneFuocoFurboFurgoneFuroreFusoFutileGabbianoGaffeGalateoGallinaGaloppoGamberoGammaGaranziaGarboGarofanoGarzoneGasdottoGasolioGastricoGattoGaudioGazeboGazzellaGecoGelatinaGelsoGemelloGemmatoGeneGenitoreGennaioGenotipoGergoGhepardoGhiaccioGhisaGialloGildaGineproGiocareGioielloGiornoGioveGiratoGironeGittataGiudizioGiuratoGiustoGlobuloGlutineGnomoGobbaGolfGomitoGommoneGonfioGonnaGovernoGracileGradoGraficoGrammoGrandeGrattareGravosoGraziaGrecaGreggeGrifoneGrigioGrinzaGrottaGruppoGuadagnoGuaioGuantoGuardareGufoGuidareIbernatoIconaIdenticoIdillioIdoloIdraIdricoIdrogenoIgieneIgnaroIgnoratoIlareIllesoIllogicoIlludereImballoImbevutoImboccoImbutoImmaneImmersoImmolatoImpaccoImpetoImpiegoImportoImprontaInalareInarcareInattivoIncantoIncendioInchinoIncisivoInclusoIncontroIncrocioIncuboIndagineIndiaIndoleIneditoInfattiInfilareInflittoIngaggioIngegnoIngleseIngordoIngrossoInnescoInodoreInoltrareInondatoInsanoInsettoInsiemeInsonniaInsulinaIntasatoInteroIntonacoIntuitoInumidireInvalidoInveceInvitoIperboleIpnoticoIpotesiIppicaIrideIrlandaIronicoIrrigatoIrrorareIsolatoIsotopoIstericoIstitutoIstriceItaliaIterareLabbroLabirintoLaccaLaceratoLacrimaLacunaLaddoveLagoLampoLancettaLanternaLardosoLargaLaringeLastraLatenzaLatinoLattugaLavagnaLavoroLegaleLeggeroLemboLentezzaLenzaLeoneLepreLesivoLessatoLestoLetteraleLevaLevigatoLiberoLidoLievitoLillaLimaturaLimitareLimpidoLineareLinguaLiquidoLiraLiricaLiscaLiteLitigioLivreaLocandaLodeLogicaLombareLondraLongevoLoquaceLorenzoLotoLotteriaLuceLucidatoLumacaLuminosoLungoLupoLuppoloLusingaLussoLuttoMacabroMacchinaMaceroMacinatoMadamaMagicoMagliaMagneteMagroMaiolicaMalafedeMalgradoMalintesoMalsanoMaltoMalumoreManaManciaMandorlaMangiareManifestoMannaroManovraMansardaMantideManubrioMappaMaratonaMarcireMarettaMarmoMarsupioMascheraMassaiaMastinoMaterassoMatricolaMattoneMaturoMazurcaMeandroMeccanicoMecenateMedesimoMeditareMegaMelassaMelisMelodiaMeningeMenoMensolaMercurioMerendaMerloMeschinoMeseMessereMestoloMetalloMetodoMettereMiagolareMicaMicelioMicheleMicroboMidolloMieleMiglioreMilanoMiliteMimosaMineraleMiniMinoreMirinoMirtilloMiscelaMissivaMistoMisurareMitezzaMitigareMitraMittenteMnemonicoModelloModificaModuloMoganoMogioMoleMolossoMonasteroMoncoMondinaMonetarioMonileMonotonoMonsoneMontatoMonvisoMoraMordereMorsicatoMostroMotivatoMotosegaMottoMovenzaMovimentoMozzoMuccaMucosaMuffaMughettoMugnaioMulattoMulinelloMultiploMummiaMuntoMuovereMuraleMusaMuscoloMusicaMutevoleMutoNababboNaftaNanometroNarcisoNariceNarratoNascereNastrareNaturaleNauticaNaviglioNebulosaNecrosiNegativoNegozioNemmenoNeofitaNerettoNervoNessunoNettunoNeutraleNeveNevroticoNicchiaNinfaNitidoNobileNocivoNodoNomeNominaNordicoNormaleNorvegeseNostranoNotareNotiziaNotturnoNovellaNucleoNullaNumeroNuovoNutrireNuvolaNuzialeOasiObbedireObbligoObeliscoOblioOboloObsoletoOccasioneOcchioOccidenteOccorrereOccultareOcraOculatoOdiernoOdorareOffertaOffrireOffuscatoOggettoOggiOgnunoOlandeseOlfattoOliatoOlivaOlogrammaOltreOmaggioOmbelicoOmbraOmegaOmissioneOndosoOnereOniceOnnivoroOnorevoleOntaOperatoOpinioneOppostoOracoloOrafoOrdineOrecchinoOreficeOrfanoOrganicoOrigineOrizzonteOrmaOrmeggioOrnativoOrologioOrrendoOrribileOrtensiaOrticaOrzataOrzoOsareOscurareOsmosiOspedaleOspiteOssaOssidareOstacoloOsteOtiteOtreOttagonoOttimoOttobreOvaleOvestOvinoOviparoOvocitoOvunqueOvviareOzioPacchettoPacePacificoPadellaPadronePaesePagaPaginaPalazzinaPalesarePallidoPaloPaludePandoroPannelloPaoloPaonazzoPapricaParabolaParcellaParerePargoloPariParlatoParolaPartireParvenzaParzialePassivoPasticcaPataccaPatologiaPattumePavonePeccatoPedalarePedonalePeggioPelosoPenarePendicePenisolaPennutoPenombraPensarePentolaPepePepitaPerbenePercorsoPerdonatoPerforarePergamenaPeriodoPermessoPernoPerplessoPersuasoPertugioPervasoPesatorePesistaPesoPestiferoPetaloPettinePetulantePezzoPiacerePiantaPiattinoPiccinoPicozzaPiegaPietraPifferoPigiamaPigolioPigroPilaPiliferoPillolaPilotaPimpantePinetaPinnaPinoloPioggiaPiomboPiramidePireticoPiritePirolisiPitonePizzicoPlaceboPlanarePlasmaPlatanoPlenarioPochezzaPoderosoPodismoPoesiaPoggiarePolentaPoligonoPollicePolmonitePolpettaPolsoPoltronaPolverePomicePomodoroPontePopolosoPorfidoPorosoPorporaPorrePortataPosaPositivoPossessoPostulatoPotassioPoterePranzoPrassiPraticaPreclusoPredicaPrefissoPregiatoPrelievoPremerePrenotarePreparatoPresenzaPretestoPrevalsoPrimaPrincipePrivatoProblemaProcuraProdurreProfumoProgettoProlungaPromessaPronomePropostaProrogaProtesoProvaPrudentePrugnaPruritoPsichePubblicoPudicaPugilatoPugnoPulcePulitoPulsantePuntarePupazzoPupillaPuroQuadroQualcosaQuasiQuerelaQuotaRaccoltoRaddoppioRadicaleRadunatoRafficaRagazzoRagioneRagnoRamarroRamingoRamoRandagioRantolareRapatoRapinaRappresoRasaturaRaschiatoRasenteRassegnaRastrelloRataRavvedutoRealeRecepireRecintoReclutaReconditoRecuperoRedditoRedimereRegalatoRegistroRegolaRegressoRelazioneRemareRemotoRennaReplicaReprimereReputareResaResidenteResponsoRestauroReteRetinaRetoricaRettificaRevocatoRiassuntoRibadireRibelleRibrezzoRicaricaRiccoRicevereRiciclatoRicordoRicredutoRidicoloRidurreRifasareRiflessoRiformaRifugioRigareRigettatoRighelloRilassatoRilevatoRimanereRimbalzoRimedioRimorchioRinascitaRincaroRinforzoRinnovoRinomatoRinsavitoRintoccoRinunciaRinvenireRiparatoRipetutoRipienoRiportareRipresaRipulireRisataRischioRiservaRisibileRisoRispettoRistoroRisultatoRisvoltoRitardoRitegnoRitmicoRitrovoRiunioneRivaRiversoRivincitaRivoltoRizomaRobaRoboticoRobustoRocciaRocoRodaggioRodereRoditoreRogitoRollioRomanticoRompereRonzioRosolareRospoRotanteRotondoRotulaRovescioRubizzoRubricaRugaRullinoRumineRumorosoRuoloRupeRussareRusticoSabatoSabbiareSabotatoSagomaSalassoSaldaturaSalgemmaSalivareSalmoneSaloneSaltareSalutoSalvoSapereSapidoSaporitoSaracenoSarcasmoSartoSassosoSatelliteSatiraSatolloSaturnoSavanaSavioSaziatoSbadiglioSbalzoSbancatoSbarraSbattereSbavareSbendareSbirciareSbloccatoSbocciatoSbrinareSbruffoneSbuffareScabrosoScadenzaScalaScambiareScandaloScapolaScarsoScatenareScavatoSceltoScenicoScettroSchedaSchienaSciarpaScienzaScindereScippoSciroppoScivoloSclerareScodellaScolpitoScompartoSconfortoScoprireScortaScossoneScozzeseScribaScrollareScrutinioScuderiaScultoreScuolaScuroScusareSdebitareSdoganareSeccaturaSecondoSedanoSeggiolaSegnalatoSegregatoSeguitoSelciatoSelettivoSellaSelvaggioSemaforoSembrareSemeSeminatoSempreSensoSentireSepoltoSequenzaSerataSerbatoSerenoSerioSerpenteSerraglioServireSestinaSetolaSettimanaSfaceloSfaldareSfamatoSfarzosoSfaticatoSferaSfidaSfilatoSfingeSfocatoSfoderareSfogoSfoltireSforzatoSfrattoSfruttatoSfuggitoSfumareSfusoSgabelloSgarbatoSgonfiareSgorbioSgrassatoSguardoSibiloSiccomeSierraSiglaSignoreSilenzioSillabaSimboloSimpaticoSimulatoSinfoniaSingoloSinistroSinoSintesiSinusoideSiparioSismaSistoleSituatoSlittaSlogaturaSlovenoSmarritoSmemoratoSmentitoSmeraldoSmilzoSmontareSmottatoSmussatoSnellireSnervatoSnodoSobbalzoSobrioSoccorsoSocialeSodaleSoffittoSognoSoldatoSolenneSolidoSollazzoSoloSolubileSolventeSomaticoSommaSondaSonettoSonniferoSopireSoppesoSopraSorgereSorpassoSorrisoSorsoSorteggioSorvolatoSospiroSostaSottileSpadaSpallaSpargereSpatolaSpaventoSpazzolaSpecieSpedireSpegnereSpelaturaSperanzaSpessoreSpettraleSpezzatoSpiaSpigolosoSpillatoSpinosoSpiraleSplendidoSportivoSposoSprangaSprecareSpronatoSpruzzoSpuntinoSquilloSradicareSrotolatoStabileStaccoStaffaStagnareStampatoStantioStarnutoStaseraStatutoSteloSteppaSterzoStilettoStimaStirpeStivaleStizzosoStonatoStoricoStrappoStregatoStriduloStrozzareStruttoStuccareStufoStupendoSubentroSuccosoSudoreSuggeritoSugoSultanoSuonareSuperboSupportoSurgelatoSurrogatoSussurroSuturaSvagareSvedeseSveglioSvelareSvenutoSveziaSviluppoSvistaSvizzeraSvoltaSvuotareTabaccoTabulatoTacciareTaciturnoTaleTalismanoTamponeTanninoTaraTardivoTargatoTariffaTarpareTartarugaTastoTatticoTavernaTavolataTazzaTecaTecnicoTelefonoTemerarioTempoTemutoTendoneTeneroTensioneTentacoloTeoremaTermeTerrazzoTerzettoTesiTesseratoTestatoTetroTettoiaTifareTigellaTimbroTintoTipicoTipografoTiraggioTiroTitanioTitoloTitubanteTizioTizzoneToccareTollerareToltoTombolaTomoTonfoTonsillaTopazioTopologiaToppaTorbaTornareTorroneTortoraToscanoTossireTostaturaTotanoTraboccoTracheaTrafilaTragediaTralcioTramontoTransitoTrapanoTrarreTraslocoTrattatoTraveTrecciaTremolioTrespoloTributoTrichecoTrifoglioTrilloTrinceaTrioTristezzaTrituratoTrivellaTrombaTronoTroppoTrottolaTrovareTruccatoTubaturaTuffatoTulipanoTumultoTunisiaTurbareTurchinoTutaTutelaUbicatoUccelloUccisoreUdireUditivoUffaUfficioUgualeUlisseUltimatoUmanoUmileUmorismoUncinettoUngereUnghereseUnicornoUnificatoUnisonoUnitarioUnteUovoUpupaUraganoUrgenzaUrloUsanzaUsatoUscitoUsignoloUsuraioUtensileUtilizzoUtopiaVacanteVaccinatoVagabondoVagliatoValangaValgoValicoVallettaValorosoValutareValvolaVampataVangareVanitosoVanoVantaggioVanveraVaporeVaranoVarcatoVarianteVascaVedettaVedovaVedutoVegetaleVeicoloVelcroVelinaVellutoVeloceVenatoVendemmiaVentoVeraceVerbaleVergognaVerificaVeroVerrucaVerticaleVescicaVessilloVestaleVeteranoVetrinaVetustoViandanteVibranteVicendaVichingoVicinanzaVidimareVigiliaVignetoVigoreVileVillanoViminiVincitoreViolaViperaVirgolaVirologoVirulentoViscosoVisioneVispoVissutoVisuraVitaVitelloVittimaVivandaVividoViziareVoceVogaVolatileVolereVolpeVoragineVulcanoZampognaZannaZappatoZatteraZavorraZefiroZelanteZeloZenzeroZerbinoZibettoZincoZirconeZittoZollaZoticoZuccheroZufoloZuluZuppa"; +var wordlist = null; +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" "); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (wordlist_1.Wordlist.check(lang) !== "0x5c1362d88fd4cf614a96f3234941d29f7d37c08c5292fde03bf62c2db6ff7620") { + wordlist = null; + throw new Error("BIP39 Wordlist for it (Italian) FAILED"); + } +} +var LangIt = /** @class */ (function (_super) { + __extends(LangIt, _super); + function LangIt() { + return _super.call(this, "it") || this; + } + LangIt.prototype.getWord = function (index) { + loadWords(this); + return wordlist[index]; + }; + LangIt.prototype.getWordIndex = function (word) { + loadWords(this); + return wordlist.indexOf(word); + }; + return LangIt; +}(wordlist_1.Wordlist)); +var langIt = new LangIt(); +exports.langIt = langIt; +wordlist_1.Wordlist.register(langIt); + +},{"./wordlist":120}],117:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.langJa = void 0; +var bytes_1 = require("@ethersproject/bytes"); +var strings_1 = require("@ethersproject/strings"); +var wordlist_1 = require("./wordlist"); +var data = [ + // 4-kana words + "AQRASRAGBAGUAIRAHBAghAURAdBAdcAnoAMEAFBAFCBKFBQRBSFBCXBCDBCHBGFBEQBpBBpQBIkBHNBeOBgFBVCBhBBhNBmOBmRBiHBiFBUFBZDBvFBsXBkFBlcBjYBwDBMBBTBBTRBWBBWXXaQXaRXQWXSRXCFXYBXpHXOQXHRXhRXuRXmXXbRXlXXwDXTRXrCXWQXWGaBWaKcaYgasFadQalmaMBacAKaRKKBKKXKKjKQRKDRKCYKCRKIDKeVKHcKlXKjHKrYNAHNBWNaRNKcNIBNIONmXNsXNdXNnBNMBNRBNrXNWDNWMNFOQABQAHQBrQXBQXFQaRQKXQKDQKOQKFQNBQNDQQgQCXQCDQGBQGDQGdQYXQpBQpQQpHQLXQHuQgBQhBQhCQuFQmXQiDQUFQZDQsFQdRQkHQbRQlOQlmQPDQjDQwXQMBQMDQcFQTBQTHQrDDXQDNFDGBDGQDGRDpFDhFDmXDZXDbRDMYDRdDTRDrXSAhSBCSBrSGQSEQSHBSVRShYShkSyQSuFSiBSdcSoESocSlmSMBSFBSFKSFNSFdSFcCByCaRCKcCSBCSRCCrCGbCEHCYXCpBCpQCIBCIHCeNCgBCgFCVECVcCmkCmwCZXCZFCdRClOClmClFCjDCjdCnXCwBCwXCcRCFQCFjGXhGNhGDEGDMGCDGCHGIFGgBGVXGVEGVRGmXGsXGdYGoSGbRGnXGwXGwDGWRGFNGFLGFOGFdGFkEABEBDEBFEXOEaBEKSENBENDEYXEIgEIkEgBEgQEgHEhFEudEuFEiBEiHEiFEZDEvBEsXEsFEdXEdREkFEbBEbRElFEPCEfkEFNYAEYAhYBNYQdYDXYSRYCEYYoYgQYgRYuRYmCYZTYdBYbEYlXYjQYRbYWRpKXpQopQnpSFpCXpIBpISphNpdBpdRpbRpcZpFBpFNpFDpFopFrLADLBuLXQLXcLaFLCXLEhLpBLpFLHXLeVLhILdHLdRLoDLbRLrXIABIBQIBCIBsIBoIBMIBRIXaIaRIKYIKRINBINuICDIGBIIDIIkIgRIxFIyQIiHIdRIbYIbRIlHIwRIMYIcRIRVITRIFBIFNIFQOABOAFOBQOaFONBONMOQFOSFOCDOGBOEQOpBOLXOIBOIFOgQOgFOyQOycOmXOsXOdIOkHOMEOMkOWWHBNHXNHXWHNXHDuHDRHSuHSRHHoHhkHmRHdRHkQHlcHlRHwBHWcgAEgAggAkgBNgBQgBEgXOgYcgLXgHjgyQgiBgsFgdagMYgWSgFQgFEVBTVXEVKBVKNVKDVKYVKRVNBVNYVDBVDxVSBVSRVCjVGNVLXVIFVhBVhcVsXVdRVbRVlRhBYhKYhDYhGShxWhmNhdahdkhbRhjohMXhTRxAXxXSxKBxNBxEQxeNxeQxhXxsFxdbxlHxjcxFBxFNxFQxFOxFoyNYyYoybcyMYuBQuBRuBruDMuCouHBudQukkuoBulVuMXuFEmCYmCRmpRmeDmiMmjdmTFmFQiADiBOiaRiKRiNBiNRiSFiGkiGFiERipRiLFiIFihYibHijBijEiMXiWBiFBiFCUBQUXFUaRUNDUNcUNRUNFUDBUSHUCDUGBUGFUEqULNULoUIRUeEUeYUgBUhFUuRUiFUsXUdFUkHUbBUjSUjYUwXUMDUcHURdUTBUrBUrXUrQZAFZXZZaRZKFZNBZQFZCXZGBZYdZpBZLDZIFZHXZHNZeQZVRZVFZmXZiBZvFZdFZkFZbHZbFZwXZcCZcRZRBvBQvBGvBLvBWvCovMYsAFsBDsaRsKFsNFsDrsSHsSFsCXsCRsEBsEHsEfspBsLBsLDsIgsIRseGsbRsFBsFQsFSdNBdSRdCVdGHdYDdHcdVbdySduDdsXdlRdwXdWYdWcdWRkBMkXOkaRkNIkNFkSFkCFkYBkpRkeNkgBkhVkmXksFklVkMBkWDkFNoBNoaQoaFoNBoNXoNaoNEoSRoEroYXoYCoYbopRopFomXojkowXorFbBEbEIbdBbjYlaRlDElMXlFDjKjjSRjGBjYBjYkjpRjLXjIBjOFjeVjbRjwBnXQnSHnpFnLXnINnMBnTRwXBwXNwXYwNFwQFwSBwGFwLXwLDweNwgBwuHwjDwnXMBXMpFMIBMeNMTHcaQcNBcDHcSFcCXcpBcLXcLDcgFcuFcnXcwXccDcTQcrFTQErXNrCHrpFrgFrbFrTHrFcWNYWNbWEHWMXWTR", + // 5-kana words + "ABGHABIJAEAVAYJQALZJAIaRAHNXAHdcAHbRAZJMAZJRAZTRAdVJAklmAbcNAjdRAMnRAMWYAWpRAWgRAFgBAFhBAFdcBNJBBNJDBQKBBQhcBQlmBDEJBYJkBYJTBpNBBpJFBIJBBIJDBIcABOKXBOEJBOVJBOiJBOZJBepBBeLXBeIFBegBBgGJBVJXBuocBiJRBUJQBlXVBlITBwNFBMYVBcqXBTlmBWNFBWiJBWnRBFGHBFwXXKGJXNJBXNZJXDTTXSHSXSVRXSlHXCJDXGQJXEhXXYQJXYbRXOfXXeNcXVJFXhQJXhEJXdTRXjdXXMhBXcQTXRGBXTEBXTnQXFCXXFOFXFgFaBaFaBNJaBCJaBpBaBwXaNJKaNJDaQIBaDpRaEPDaHMFamDJalEJaMZJaFaFaFNBaFQJaFLDaFVHKBCYKBEBKBHDKXaFKXGdKXEJKXpHKXIBKXZDKXwXKKwLKNacKNYJKNJoKNWcKDGdKDTRKChXKGaRKGhBKGbRKEBTKEaRKEPTKLMDKLWRKOHDKVJcKdBcKlIBKlOPKFSBKFEPKFpFNBNJNJBQNBGHNBEPNBHXNBgFNBVXNBZDNBsXNBwXNNaRNNJDNNJENNJkNDCJNDVDNGJRNJiDNZJNNsCJNJFNNFSBNFCXNFEPNFLXNFIFQJBFQCaRQJEQQLJDQLJFQIaRQOqXQHaFQHHQQVJXQVJDQhNJQmEIQZJFQsJXQJrFQWbRDJABDBYJDXNFDXCXDXLXDXZDDXsJDQqXDSJFDJCXDEPkDEqXDYmQDpSJDOCkDOGQDHEIDVJDDuDuDWEBDJFgSBNDSBSFSBGHSBIBSBTQSKVYSJQNSJQiSJCXSEqXSJYVSIiJSOMYSHAHSHaQSeCFSepQSegBSHdHSHrFShSJSJuHSJUFSkNRSrSrSWEBSFaHSJFQSFCXSFGDSFYXSFODSFgBSFVXSFhBSFxFSFkFSFbBSFMFCADdCJXBCXaFCXKFCXNFCXCXCXGBCXEJCXYBCXLDCXIBCXOPCXHXCXgBCXhBCXiBCXlDCXcHCJNBCJNFCDCJCDGBCDVXCDhBCDiDCDJdCCmNCpJFCIaRCOqXCHCHCHZJCViJCuCuCmddCJiFCdNBCdHhClEJCnUJCreSCWlgCWTRCFBFCFNBCFYBCFVFCFhFCFdSCFTBCFWDGBNBGBQFGJBCGBEqGBpBGBgQGNBEGNJYGNkOGNJRGDUFGJpQGHaBGJeNGJeEGVBlGVKjGiJDGvJHGsVJGkEBGMIJGWjNGFBFGFCXGFGBGFYXGFpBGFMFEASJEAWpEJNFECJVEIXSEIQJEOqXEOcFEeNcEHEJEHlFEJgFEhlmEmDJEmZJEiMBEUqXEoSREPBFEPXFEPKFEPSFEPEFEPpFEPLXEPIBEJPdEPcFEPTBEJnXEqlHEMpREFCXEFODEFcFYASJYJAFYBaBYBVXYXpFYDhBYCJBYJGFYYbRYeNcYJeVYiIJYZJcYvJgYvJRYJsXYsJFYMYMYreVpBNHpBEJpBwXpQxFpYEJpeNDpJeDpeSFpeCHpHUJpHbBpHcHpmUJpiiJpUJrpsJuplITpFaBpFQqpFGBpFEfpFYBpFpBpFLJpFIDpFgBpFVXpFyQpFuFpFlFpFjDpFnXpFwXpJFMpFTBLXCJLXEFLXhFLXUJLXbFLalmLNJBLSJQLCLCLGJBLLDJLHaFLeNFLeSHLeCXLepFLhaRLZsJLsJDLsJrLocaLlLlLMdbLFNBLFSBLFEHLFkFIBBFIBXFIBaQIBKXIBSFIBpHIBLXIBgBIBhBIBuHIBmXIBiFIBZXIBvFIBbFIBjQIBwXIBWFIKTRIQUJIDGFICjQIYSRIINXIJeCIVaRImEkIZJFIvJRIsJXIdCJIJoRIbBQIjYBIcqXITFVIreVIFKFIFSFIFCJIFGFIFLDIFIBIJFOIFgBIFVXIJFhIFxFIFmXIFdHIFbBIJFrIJFWOBGBOQfXOOKjOUqXOfXBOqXEOcqXORVJOFIBOFlDHBIOHXiFHNTRHCJXHIaRHHJDHHEJHVbRHZJYHbIBHRsJHRkDHWlmgBKFgBSBgBCDgBGHgBpBgBIBgBVJgBuBgBvFgKDTgQVXgDUJgGSJgOqXgmUMgZIJgTUJgWIEgFBFgFNBgFDJgFSFgFGBgFYXgJFOgFgQgFVXgFhBgFbHgJFWVJABVQKcVDgFVOfXVeDFVhaRVmGdViJYVMaRVFNHhBNDhBCXhBEqhBpFhBLXhNJBhSJRheVXhhKEhxlmhZIJhdBQhkIJhbMNhMUJhMZJxNJgxQUJxDEkxDdFxSJRxplmxeSBxeCXxeGFxeYXxepQxegBxWVcxFEQxFLXxFIBxFgBxFxDxFZtxFdcxFbBxFwXyDJXyDlcuASJuDJpuDIBuCpJuGSJuIJFueEFuZIJusJXudWEuoIBuWGJuFBcuFKEuFNFuFQFuFDJuFGJuFVJuFUtuFdHuFTBmBYJmNJYmQhkmLJDmLJomIdXmiJYmvJRmsJRmklmmMBymMuCmclmmcnQiJABiJBNiJBDiBSFiBCJiBEFiBYBiBpFiBLXiBTHiJNciDEfiCZJiECJiJEqiOkHiHKFieNDiHJQieQcieDHieSFieCXieGFieEFieIHiegFihUJixNoioNXiFaBiFKFiFNDiFEPiFYXitFOitFHiFgBiFVEiFmXiFitiFbBiFMFiFrFUCXQUIoQUIJcUHQJUeCEUHwXUUJDUUqXUdWcUcqXUrnQUFNDUFSHUFCFUFEfUFLXUtFOZBXOZXSBZXpFZXVXZEQJZEJkZpDJZOqXZeNHZeCDZUqXZFBQZFEHZFLXvBAFvBKFvBCXvBEPvBpHvBIDvBgFvBuHvQNJvFNFvFGBvFIBvJFcsXCDsXLXsXsXsXlFsXcHsQqXsJQFsEqXseIFsFEHsFjDdBxOdNpRdNJRdEJbdpJRdhZJdnSJdrjNdFNJdFQHdFhNkNJDkYaRkHNRkHSRkVbRkuMRkjSJkcqDoSJFoEiJoYZJoOfXohEBoMGQocqXbBAFbBXFbBaFbBNDbBGBbBLXbBTBbBWDbGJYbIJHbFQqbFpQlDgQlOrFlVJRjGEBjZJRnXvJnXbBnEfHnOPDngJRnxfXnUJWwXEJwNpJwDpBwEfXwrEBMDCJMDGHMDIJMLJDcQGDcQpHcqXccqNFcqCXcFCJRBSBRBGBRBEJRBpQTBNFTBQJTBpBTBVXTFABTFSBTFCFTFGBTFMDrXCJrXLDrDNJrEfHrFQJrFitWNjdWNTR", + // 6-kana words + "AKLJMANOPFASNJIAEJWXAYJNRAIIbRAIcdaAeEfDAgidRAdjNYAMYEJAMIbRAFNJBAFpJFBBIJYBDZJFBSiJhBGdEBBEJfXBEJqXBEJWRBpaUJBLXrXBIYJMBOcfXBeEfFBestXBjNJRBcDJOBFEqXXNvJRXDMBhXCJNYXOAWpXONJWXHDEBXeIaRXhYJDXZJSJXMDJOXcASJXFVJXaBQqXaBZJFasXdQaFSJQaFEfXaFpJHaFOqXKBNSRKXvJBKQJhXKEJQJKEJGFKINJBKIJjNKgJNSKVElmKVhEBKiJGFKlBgJKjnUJKwsJYKMFIJKFNJDKFIJFKFOfXNJBSFNJBCXNBpJFNJBvQNJBMBNJLJXNJOqXNJeCXNJeGFNdsJCNbTKFNwXUJQNFEPQDiJcQDMSJQSFpBQGMQJQJeOcQyCJEQUJEBQJFBrQFEJqDXDJFDJXpBDJXIMDGiJhDIJGRDJeYcDHrDJDVXgFDkAWpDkIgRDjDEqDMvJRDJFNFDJFIBSKclmSJQOFSJQVHSJQjDSJGJBSJGJFSECJoSHEJqSJHTBSJVJDSViJYSZJNBSJsJDSFSJFSFEfXSJFLXCBUJVCJXSBCJXpBCXVJXCJXsXCJXdFCJNJHCLIJgCHiJFCVNJMChCJhCUHEJCsJTRCJdYcCoQJCCFEfXCFIJgCFUJxCFstFGJBaQGJBIDGQJqXGYJNRGJHKFGeQqDGHEJFGJeLXGHIiJGHdBlGUJEBGkIJTGFQPDGJFEqEAGegEJIJBEJVJXEhQJTEiJNcEJZJFEJoEqEjDEqEPDsXEPGJBEPOqXEPeQFEfDiDEJfEFEfepQEfMiJEqXNBEqDIDEqeSFEqVJXEMvJRYXNJDYXEJHYKVJcYYJEBYJeEcYJUqXYFpJFYFstXpAZJMpBSJFpNBNFpeQPDpHLJDpHIJFpHgJFpeitFpHZJFpJFADpFSJFpJFCJpFOqXpFitBpJFZJLXIJFLIJgRLVNJWLVHJMLwNpJLFGJBLFLJDLFOqXLJFUJIBDJXIBGJBIJBYQIJBIBIBOqXIBcqDIEGJFILNJTIIJEBIOiJhIJeNBIJeIBIhiJIIWoTRIJFAHIJFpBIJFuHIFUtFIJFTHOSBYJOEcqXOHEJqOvBpFOkVJrObBVJOncqDOcNJkHhNJRHuHJuHdMhBgBUqXgBsJXgONJBgHNJDgHHJQgJeitgHsJXgJyNagyDJBgZJDrgsVJQgkEJNgkjSJgJFAHgFCJDgFZtMVJXNFVXQfXVJXDJVXoQJVQVJQVDEfXVDvJHVEqNFVeQfXVHpJFVHxfXVVJSRVVmaRVlIJOhCXVJhHjYkhxCJVhWVUJhWiJcxBNJIxeEqDxfXBFxcFEPxFSJFxFYJXyBDQJydaUJyFOPDuYCJYuLvJRuHLJXuZJLDuFOPDuFZJHuFcqXmKHJdmCQJcmOsVJiJAGFitLCFieOfXiestXiZJMEikNJQirXzFiFQqXiFIJFiFZJFiFvtFUHpJFUteIcUteOcUVCJkUhdHcUbEJEUJqXQUMNJhURjYkUFitFZDGJHZJIxDZJVJXZJFDJZJFpQvBNJBvBSJFvJxBrseQqDsVFVJdFLJDkEJNBkmNJYkFLJDoQJOPoGsJRoEAHBoEJfFbBQqDbBZJHbFVJXlFIJBjYIrXjeitcjjCEBjWMNBwXQfXwXOaFwDsJXwCJTRwrCZJMDNJQcDDJFcqDOPRYiJFTBsJXTQIJBTFEfXTFLJDrXEJFrEJXMrFZJFWEJdEWYTlm", + // 7-kana words + "ABCDEFACNJTRAMBDJdAcNJVXBLNJEBXSIdWRXErNJkXYDJMBXZJCJaXMNJaYKKVJKcKDEJqXKDcNJhKVJrNYKbgJVXKFVJSBNBYBwDNJeQfXNJeEqXNhGJWENJFiJRQlIJbEQJfXxDQqXcfXQFNDEJQFwXUJDYcnUJDJIBgQDIUJTRDJFEqDSJQSJFSJQIJFSOPeZtSJFZJHCJXQfXCTDEqFGJBSJFGJBOfXGJBcqXGJHNJDGJRLiJEJfXEqEJFEJPEFpBEJYJBZJFYBwXUJYiJMEBYJZJyTYTONJXpQMFXFpeGIDdpJFstXpJFcPDLBVSJRLHQJqXLJFZJFIJBNJDIJBUqXIBkFDJIJEJPTIYJGWRIJeQPDIJeEfHIJFsJXOqGDSFHXEJqXgJCsJCgGQJqXgdQYJEgFMFNBgJFcqDVJwXUJVJFZJchIgJCCxOEJqXxOwXUJyDJBVRuscisciJBiJBieUtqXiJFDJkiFsJXQUGEZJcUJFsJXZtXIrXZDZJDrZJFNJDZJFstXvJFQqXvJFCJEsJXQJqkhkNGBbDJdTRbYJMEBlDwXUJMEFiJFcfXNJDRcNJWMTBLJXC", + // 8-kana words + "BraFUtHBFSJFdbNBLJXVJQoYJNEBSJBEJfHSJHwXUJCJdAZJMGjaFVJXEJPNJBlEJfFiJFpFbFEJqIJBVJCrIBdHiJhOPFChvJVJZJNJWxGFNIFLueIBQJqUHEJfUFstOZJDrlXEASJRlXVJXSFwVJNJWD", + // 9-kana words + "QJEJNNJDQJEJIBSFQJEJxegBQJEJfHEPSJBmXEJFSJCDEJqXLXNJFQqXIcQsFNJFIFEJqXUJgFsJXIJBUJEJfHNFvJxEqXNJnXUJFQqD", + // 10-kana words + "IJBEJqXZJ" +]; +// Maps each character into its kana value (the index) +var mapping = "~~AzB~X~a~KN~Q~D~S~C~G~E~Y~p~L~I~O~eH~g~V~hxyumi~~U~~Z~~v~~s~~dkoblPjfnqwMcRTr~W~~~F~~~~~Jt"; +var wordlist = null; +function hex(word) { + return bytes_1.hexlify(strings_1.toUtf8Bytes(word)); +} +var KiYoKu = "0xe3818de38284e3818f"; +var KyoKu = "0xe3818de38283e3818f"; +function loadWords(lang) { + if (wordlist !== null) { + return; + } + wordlist = []; + // Transforms for normalizing (sort is a not quite UTF-8) + var transform = {}; + // Delete the diacritic marks + transform[strings_1.toUtf8String([227, 130, 154])] = false; + transform[strings_1.toUtf8String([227, 130, 153])] = false; + // Some simple transforms that sort out most of the order + transform[strings_1.toUtf8String([227, 130, 133])] = strings_1.toUtf8String([227, 130, 134]); + transform[strings_1.toUtf8String([227, 129, 163])] = strings_1.toUtf8String([227, 129, 164]); + transform[strings_1.toUtf8String([227, 130, 131])] = strings_1.toUtf8String([227, 130, 132]); + transform[strings_1.toUtf8String([227, 130, 135])] = strings_1.toUtf8String([227, 130, 136]); + // Normalize words using the transform + function normalize(word) { + var result = ""; + for (var i = 0; i < word.length; i++) { + var kana = word[i]; + var target = transform[kana]; + if (target === false) { + continue; + } + if (target) { + kana = target; + } + result += kana; + } + return result; + } + // Sort how the Japanese list is sorted + function sortJapanese(a, b) { + a = normalize(a); + b = normalize(b); + if (a < b) { + return -1; + } + if (a > b) { + return 1; + } + return 0; + } + // Load all the words + for (var length_1 = 3; length_1 <= 9; length_1++) { + var d = data[length_1 - 3]; + for (var offset = 0; offset < d.length; offset += length_1) { + var word = []; + for (var i = 0; i < length_1; i++) { + var k = mapping.indexOf(d[offset + i]); + word.push(227); + word.push((k & 0x40) ? 130 : 129); + word.push((k & 0x3f) + 128); + } + wordlist.push(strings_1.toUtf8String(word)); + } + } + wordlist.sort(sortJapanese); + // For some reason kyoku and kiyoku are flipped in node (!!). + // The order SHOULD be: + // - kyoku + // - kiyoku + // This should ignore "if", but that doesn't work here?? + /* istanbul ignore next */ + if (hex(wordlist[442]) === KiYoKu && hex(wordlist[443]) === KyoKu) { + var tmp = wordlist[442]; + wordlist[442] = wordlist[443]; + wordlist[443] = tmp; + } + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (wordlist_1.Wordlist.check(lang) !== "0xcb36b09e6baa935787fd762ce65e80b0c6a8dabdfbc3a7f86ac0e2c4fd111600") { + wordlist = null; + throw new Error("BIP39 Wordlist for ja (Japanese) FAILED"); + } +} +var LangJa = /** @class */ (function (_super) { + __extends(LangJa, _super); + function LangJa() { + return _super.call(this, "ja") || this; + } + LangJa.prototype.getWord = function (index) { + loadWords(this); + return wordlist[index]; + }; + LangJa.prototype.getWordIndex = function (word) { + loadWords(this); + return wordlist.indexOf(word); + }; + LangJa.prototype.split = function (mnemonic) { + wordlist_1.logger.checkNormalize(); + return mnemonic.split(/(?:\u3000| )+/g); + }; + LangJa.prototype.join = function (words) { + return words.join("\u3000"); + }; + return LangJa; +}(wordlist_1.Wordlist)); +var langJa = new LangJa(); +exports.langJa = langJa; +wordlist_1.Wordlist.register(langJa); + +},{"./wordlist":120,"@ethersproject/bytes":33,"@ethersproject/strings":99}],118:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.langKo = void 0; +var strings_1 = require("@ethersproject/strings"); +var wordlist_1 = require("./wordlist"); +var data = [ + "OYAa", + "ATAZoATBl3ATCTrATCl8ATDloATGg3ATHT8ATJT8ATJl3ATLlvATLn4ATMT8ATMX8ATMboATMgoAToLbAToMTATrHgATvHnAT3AnAT3JbAT3MTAT8DbAT8JTAT8LmAT8MYAT8MbAT#LnAUHT8AUHZvAUJXrAUJX8AULnrAXJnvAXLUoAXLgvAXMn6AXRg3AXrMbAX3JTAX3QbAYLn3AZLgvAZrSUAZvAcAZ8AaAZ8AbAZ8AnAZ8HnAZ8LgAZ8MYAZ8MgAZ8OnAaAboAaDTrAaFTrAaJTrAaJboAaLVoAaMXvAaOl8AaSeoAbAUoAbAg8AbAl4AbGnrAbMT8AbMXrAbMn4AbQb8AbSV8AbvRlAb8AUAb8AnAb8HgAb8JTAb8NTAb8RbAcGboAcLnvAcMT8AcMX8AcSToAcrAaAcrFnAc8AbAc8MgAfGgrAfHboAfJnvAfLV8AfLkoAfMT8AfMnoAfQb8AfScrAfSgrAgAZ8AgFl3AgGX8AgHZvAgHgrAgJXoAgJX8AgJboAgLZoAgLn4AgOX8AgoATAgoAnAgoCUAgoJgAgoLXAgoMYAgoSeAgrDUAgrJTAhrFnAhrLjAhrQgAjAgoAjJnrAkMX8AkOnoAlCTvAlCV8AlClvAlFg4AlFl6AlFn3AloSnAlrAXAlrAfAlrFUAlrFbAlrGgAlrOXAlvKnAlvMTAl3AbAl3MnAnATrAnAcrAnCZ3AnCl8AnDg8AnFboAnFl3AnHX4AnHbrAnHgrAnIl3AnJgvAnLXoAnLX4AnLbrAnLgrAnLhrAnMXoAnMgrAnOn3AnSbrAnSeoAnvLnAn3OnCTGgvCTSlvCTvAUCTvKnCTvNTCT3CZCT3GUCT3MTCT8HnCUCZrCULf8CULnvCU3HnCU3JUCY6NUCbDb8CbFZoCbLnrCboOTCboScCbrFnCbvLnCb8AgCb8HgCb$LnCkLfoClBn3CloDUDTHT8DTLl3DTSU8DTrAaDTrLXDTrLjDTrOYDTrOgDTvFXDTvFnDT3HUDT3LfDUCT9DUDT4DUFVoDUFV8DUFkoDUGgrDUJnrDULl8DUMT8DUMXrDUMX4DUMg8DUOUoDUOgvDUOg8DUSToDUSZ8DbDXoDbDgoDbGT8DbJn3DbLg3DbLn4DbMXrDbMg8DbOToDboJXGTClvGTDT8GTFZrGTLVoGTLlvGTLl3GTMg8GTOTvGTSlrGToCUGTrDgGTrJYGTrScGTtLnGTvAnGTvQgGUCZrGUDTvGUFZoGUHXrGULnvGUMT8GUoMgGXoLnGXrMXGXrMnGXvFnGYLnvGZOnvGZvOnGZ8LaGZ8LmGbAl3GbDYvGbDlrGbHX3GbJl4GbLV8GbLn3GbMn4GboJTGboRfGbvFUGb3GUGb4JnGgDX3GgFl$GgJlrGgLX6GgLZoGgLf8GgOXoGgrAgGgrJXGgrMYGgrScGgvATGgvOYGnAgoGnJgvGnLZoGnLg3GnLnrGnQn8GnSbrGnrMgHTClvHTDToHTFT3HTQT8HToJTHToJgHTrDUHTrMnHTvFYHTvRfHT8MnHT8SUHUAZ8HUBb4HUDTvHUoMYHXFl6HXJX6HXQlrHXrAUHXrMnHXrSbHXvFYHXvKXHX3LjHX3MeHYvQlHZrScHZvDbHbAcrHbFT3HbFl3HbJT8HbLTrHbMT8HbMXrHbMbrHbQb8HbSX3HboDbHboJTHbrFUHbrHgHbrJTHb8JTHb8MnHb8QgHgAlrHgDT3HgGgrHgHgrHgJTrHgJT8HgLX@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!Ln$CTGXMnCToLZ4CTrHT8CT3JTrCT3RZrCT#GTvCU6GgvCU8Db8CU8GZrCU8HT8CboLl3CbrGgrCbrMU8Cb8DT3Cb8GnrCb8LX4Cb8MT8Cb8ObrCgrGgvCgrKX4Cl8FZoDTrAbvDTrDboDTrGT6DTrJgrDTrMX3DTrRZrDTrRg8DTvAVvDTvFZoDT3DT8DT3Ln3DT4HZrDT4MT8DT8AlrDT8MT8DUAkGbDUDbJnDYLnQlDbDUOYDbMTAnDbMXSnDboAT3DboFn4DboLnvDj6JTrGTCgFTGTGgFnGTJTMnGTLnPlGToJT8GTrCT3GTrLVoGTrLnvGTrMX3GTrMboGTvKl3GZClFnGZrDT3GZ8DTrGZ8FZ8GZ8MXvGZ8On8GZ8ST3GbCnQXGbMbFnGboFboGboJg3GboMXoGb3JTvGb3JboGb3Mn6Gb3Qb8GgDXLjGgMnAUGgrDloGgrHX4GgrSToGgvAXrGgvAZvGgvFbrGgvLl3GgvMnvGnDnLXGnrATrGnrMboGnuLl3HTATMnHTAgCnHTCTCTHTrGTvHTrHTvHTrJX8HTrLl8HTrMT8HTrMgoHTrOTrHTuOn3HTvAZrHTvDTvHTvGboHTvJU8HTvLl3HTvMXrHTvQb4HT4GT6HT4JT8HT4Jb#HT8Al3HT8GZrHT8GgrHT8HX4HT8Jb8HT8JnoHT8LTrHT8LgvHT8SToHT8SV8HUoJUoHUoJX8HUoLnrHXrLZoHXvAl3HX3LnrHX4FkvHX4LhrHX4MXoHX4OnoHZrAZ8HZrDb8HZrGZ8HZrJnrHZvGZ8HZvLnvHZ8JnvHZ8LhrHbCXJlHbMTAnHboJl4HbpLl3HbrJX8HbrLnrHbrMnvHbvRYrHgoSTrHgrFV8HgrGZ8HgrJXoHgrRnvHgvBb!HgvGTrHgvHX4HgvHn!HgvLTrHgvSU8HnDnLbHnFbJbHnvDn8Hn6GgvHn!BTvJTCTLnJTQgFnJTrAnvJTrLX4JTrOUoJTvFn3JTvLnrJTvNToJT3AgoJT3Jn4JT3LhvJT3ObrJT8AcrJT8Al3JT8JT8JT8JnoJT8LX4JT8LnrJT8MX3JT8Rg3JT8Sc8JUoBTvJU8AToJU8GZ8JU8GgvJU8JTrJU8JXrJU8JnrJU8LnvJU8ScvJXHnJlJXrGgvJXrJU8JXrLhrJXrMT8JXrMXrJXrQUoJXvCTvJXvGZ8JXvGgrJXvQT8JX8Ab8JX8DT8JX8GZ8JX8HZvJX8LnrJX8MT8JX8MXoJX8MnvJX8ST3JYGnCTJbAkGbJbCTAnJbLTAcJboDT3JboLb6JbrAnvJbrCn3JbrDl8JbrGboJbrIZoJbrJnvJbrMnvJbrQb4Jb8RZrJeAbAnJgJnFbJgScAnJgrATrJgvHZ8JgvMn4JlJlFbJlLiQXJlLjOnJlRbOlJlvNXoJlvRl3Jl4AcrJl8AUoJl8MnrJnFnMlJnHgGbJnoDT8JnoFV8JnoGgvJnoIT8JnoQToJnoRg3JnrCZ3JnrGgrJnrHTvJnrLf8JnrOX8JnvAT3JnvFZoJnvGT8JnvJl4JnvMT8JnvMX8JnvOXrJnvPX6JnvSX3JnvSZrJn3MT8Jn3MX8Jn3RTrLTATKnLTJnLTLTMXKnLTRTQlLToGb8LTrAZ8LTrCZ8LTrDb8LTrHT8LT3PX6LT4FZoLT$CTvLT$GgrLUvHX3LVoATrLVoAgoLVoJboLVoMX3LVoRg3LV8CZ3LV8FZoLV8GTvLXrDXoLXrFbrLXvAgvLXvFlrLXvLl3LXvRn6LX4Mb8LX8GT8LYCXMnLYrMnrLZoSTvLZrAZvLZrAloLZrFToLZrJXvLZrJboLZrJl4LZrLnrLZrMT8LZrOgvLZrRnvLZrST4LZvMX8LZvSlvLZ8AgoLZ8CT3LZ8JT8LZ8LV8LZ8LZoLZ8Lg8LZ8SV8LZ8SbrLZ$HT8LZ$Mn4La6CTvLbFbMnLbRYFTLbSnFZLboJT8LbrAT9LbrGb3LbrQb8LcrJX8LcrMXrLerHTvLerJbrLerNboLgrDb8LgrGZ8LgrHTrLgrMXrLgrSU8LgvJTrLgvLl3Lg6Ll3LhrLnrLhrMT8LhvAl4LiLnQXLkoAgrLkoJT8LkoJn4LlrSU8Ll3FZoLl3HTrLl3JX8Ll3JnoLl3LToLmLeFbLnDUFbLnLVAnLnrATrLnrAZoLnrAb8LnrAlrLnrGgvLnrJU8LnrLZrLnrLhrLnrMb8LnrOXrLnrSZ8LnvAb4LnvDTrLnvDl8LnvHTrLnvHbrLnvJT8LnvJU8LnvJbrLnvLhvLnvMX8LnvMb8LnvNnoLnvSU8Ln3Al3Ln4FZoLn4GT6Ln4JgvLn4LhrLn4MT8Ln4SToMToCZrMToJX8MToLX4MToLf8MToRg3MTrEloMTvGb6MT3BTrMT3Lb6MT8AcrMT8AgrMT8GZrMT8JnoMT8LnrMT8MX3MUOUAnMXAbFnMXoAloMXoJX8MXoLf8MXoLl8MXrAb8MXrDTvMXrGT8MXrGgrMXrHTrMXrLf8MXrMU8MXrOXvMXrQb8MXvGT8MXvHTrMXvLVoMX3AX3MX3Jn3MX3LhrMX3MX3MX4AlrMX4OboMX8GTvMX8GZrMX8GgrMX8JT8MX8JX8MX8LhrMX8MT8MYDUFbMYMgDbMbGnFfMbvLX4MbvLl3Mb8Mb8Mb8ST4MgGXCnMg8ATrMg8AgoMg8CZrMg8DTrMg8DboMg8HTrMg8JgrMg8LT8MloJXoMl8AhrMl8JT8MnLgAUMnoJXrMnoLX4MnoLhrMnoMT8MnrAl4MnrDb8MnrOTvMnrOgvMnrQb8MnrSU8MnvGgrMnvHZ8Mn3MToMn4DTrMn4LTrMn4Mg8NnBXAnOTFTFnOToAToOTrGgvOTrJX8OT3JXoOT6MTrOT8GgrOT8HTpOT8MToOUoHT8OUoJT8OUoLn3OXrAgoOXrDg8OXrMT8OXvSToOX6CTvOX8CZrOX8OgrOb6HgvOb8AToOb8MT8OcvLZ8OgvAlrOgvHTvOgvJTrOgvJnrOgvLZrOgvLn4OgvMT8OgvRTrOg8AZoOg8DbvOnrOXoOnvJn4OnvLhvOnvRTrOn3GgoOn3JnvOn6JbvOn8OTrPTGYFTPbBnFnPbGnDnPgDYQTPlrAnvPlrETvPlrLnvPlrMXvPlvFX4QTMTAnQTrJU8QYCnJlQYJlQlQbGTQbQb8JnrQb8LZoQb8LnvQb8MT8Qb8Ml8Qb8ST4QloAl4QloHZvQloJX8QloMn8QnJZOlRTrAZvRTrDTrRTvJn4RTvLhvRT4Jb8RZrAZrRZ8AkrRZ8JU8RZ8LV8RZ8LnvRbJlQXRg3GboRg3MnvRg8AZ8Rg8JboRg8Jl4RnLTCbRnvFl3RnvQb8SToAl4SToCZrSToFZoSToHXrSToJU8SToJgvSToJl4SToLhrSToMX3STrAlvSTrCT9STrCgrSTrGgrSTrHXrSTrHboSTrJnoSTrNboSTvLnrST4AZoST8Ab8ST8JT8SUoJn3SU6HZ#SU6JTvSU8Db8SU8HboSU8LgrSV8JT8SZrAcrSZrAl3SZrJT8SZrJnvSZrMT8SZvLUoSZ4FZoSZ8JnoSZ8RZrScoLnrScoMT8ScoMX8ScrAT4ScrAZ8ScrLZ8ScrLkvScvDb8ScvLf8ScvNToSgrFZrShvKnrSloHUoSloLnrSlrMXoSl8HgrSmrJUoSn3BX6", + "ATFlOn3ATLgrDYAT4MTAnAT8LTMnAYJnRTrAbGgJnrAbLV8LnAbvNTAnAeFbLg3AgOYMXoAlQbFboAnDboAfAnJgoJTBToDgAnBUJbAl3BboDUAnCTDlvLnCTFTrSnCYoQTLnDTwAbAnDUDTrSnDUHgHgrDX8LXFnDbJXAcrETvLTLnGTFTQbrGTMnGToGT3DUFbGUJlPX3GbQg8LnGboJbFnGb3GgAYGgAg8ScGgMbAXrGgvAbAnGnJTLnvGnvATFgHTDT6ATHTrDlJnHYLnMn8HZrSbJTHZ8LTFnHbFTJUoHgSeMT8HgrLjAnHgvAbAnHlFUrDlHnDgvAnHnHTFT3HnQTGnrJTAaMXvJTGbCn3JTOgrAnJXvAXMnJbMg8SnJbMnRg3Jb8LTMnJnAl3OnJnGYrQlJnJlQY3LTDlCn3LTJjLg3LTLgvFXLTMg3GTLV8HUOgLXFZLg3LXNXrMnLX8QXFnLX9AlMYLYLXPXrLZAbJU8LZDUJU8LZMXrSnLZ$AgFnLaPXrDULbFYrMnLbMn8LXLboJgJgLeFbLg3LgLZrSnLgOYAgoLhrRnJlLkCTrSnLkOnLhrLnFX%AYLnFZoJXLnHTvJbLnLloAbMTATLf8MTHgJn3MTMXrAXMT3MTFnMUITvFnMXFX%AYMXMXvFbMXrFTDbMYAcMX3MbLf8SnMb8JbFnMgMXrMTMgvAXFnMgvGgCmMnAloSnMnFnJTrOXvMXSnOX8HTMnObJT8ScObLZFl3ObMXCZoPTLgrQXPUFnoQXPU3RXJlPX3RkQXPbrJXQlPlrJbFnQUAhrDbQXGnCXvQYLnHlvQbLfLnvRTOgvJbRXJYrQlRYLnrQlRbLnrQlRlFT8JlRlFnrQXSTClCn3STHTrAnSTLZQlrSTMnGTrSToHgGbSTrGTDnSTvGXCnST3HgFbSU3HXAXSbAnJn3SbFT8LnScLfLnv", + "AT3JgJX8AT8FZoSnAT8JgFV8AT8LhrDbAZ8JT8DbAb8GgLhrAb8SkLnvAe8MT8SnAlMYJXLVAl3GYDTvAl3LfLnvBUDTvLl3CTOn3HTrCT3DUGgrCU8MT8AbCbFTrJUoCgrDb8MTDTLV8JX8DTLnLXQlDT8LZrSnDUQb8FZ8DUST4JnvDb8ScOUoDj6GbJl4GTLfCYMlGToAXvFnGboAXvLnGgAcrJn3GgvFnSToGnLf8JnvGn#HTDToHTLnFXJlHTvATFToHTvHTDToHTvMTAgoHT3STClvHT4AlFl6HT8HTDToHUoDgJTrHUoScMX3HbRZrMXoHboJg8LTHgDb8JTrHgMToLf8HgvLnLnoHnHn3HT4Hn6MgvAnJTJU8ScvJT3AaQT8JT8HTrAnJXrRg8AnJbAloMXoJbrATFToJbvMnoSnJgDb6GgvJgDb8MXoJgSX3JU8JguATFToJlPYLnQlJlQkDnLbJlQlFYJlJl8Lf8OTJnCTFnLbJnLTHXMnJnLXGXCnJnoFfRg3JnrMYRg3Jn3HgFl3KT8Dg8LnLTRlFnPTLTvPbLbvLVoSbrCZLXMY6HT3LXNU7DlrLXNXDTATLX8DX8LnLZDb8JU8LZMnoLhrLZSToJU8LZrLaLnrLZvJn3SnLZ8LhrSnLaJnoMT8LbFlrHTvLbrFTLnrLbvATLlvLb6OTFn3LcLnJZOlLeAT6Mn4LeJT3ObrLg6LXFlrLhrJg8LnLhvDlPX4LhvLfLnvLj6JTFT3LnFbrMXoLnQluCTvLnrQXCY6LnvLfLnvLnvMgLnvLnvSeLf8MTMbrJn3MT3JgST3MT8AnATrMT8LULnrMUMToCZrMUScvLf8MXoDT8SnMX6ATFToMX8AXMT8MX8FkMT8MX8HTrDUMX8ScoSnMYJT6CTvMgAcrMXoMg8SToAfMlvAXLg3MnFl3AnvOT3AnFl3OUoATHT8OU3RnLXrOXrOXrSnObPbvFn6Og8HgrSnOg8OX8DbPTvAgoJgPU3RYLnrPXrDnJZrPb8CTGgvPlrLTDlvPlvFUJnoQUvFXrQlQeMnoAl3QlrQlrSnRTFTrJUoSTDlLiLXSTFg6HT3STJgoMn4STrFTJTrSTrLZFl3ST4FnMXoSUrDlHUoScvHTvSnSfLkvMXo", + "AUoAcrMXoAZ8HboAg8AbOg6ATFgAg8AloMXoAl3AT8JTrAl8MX8MXoCT3SToJU8Cl8Db8MXoDT8HgrATrDboOT8MXoGTOTrATMnGT8LhrAZ8GnvFnGnQXHToGgvAcrHTvAXvLl3HbrAZoMXoHgBlFXLg3HgMnFXrSnHgrSb8JUoHn6HT8LgvITvATrJUoJUoLZrRnvJU8HT8Jb8JXvFX8QT8JXvLToJTrJYrQnGnQXJgrJnoATrJnoJU8ScvJnvMnvMXoLTCTLgrJXLTJlRTvQlLbRnJlQYvLbrMb8LnvLbvFn3RnoLdCVSTGZrLeSTvGXCnLg3MnoLn3MToLlrETvMT8SToAl3MbrDU6GTvMb8LX4LhrPlrLXGXCnSToLf8Rg3STrDb8LTrSTvLTHXMnSb3RYLnMnSgOg6ATFg", + "HUDlGnrQXrJTrHgLnrAcJYMb8DULc8LTvFgGnCk3Mg8JbAnLX4QYvFYHnMXrRUoJnGnvFnRlvFTJlQnoSTrBXHXrLYSUJgLfoMT8Se8DTrHbDb", + "AbDl8SToJU8An3RbAb8ST8DUSTrGnrAgoLbFU6Db8LTrMg8AaHT8Jb8ObDl8SToJU8Pb3RlvFYoJl" +]; +var codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*"; +function getHangul(code) { + if (code >= 40) { + code = code + 168 - 40; + } + else if (code >= 19) { + code = code + 97 - 19; + } + return strings_1.toUtf8String([225, (code >> 6) + 132, (code & 0x3f) + 128]); +} +var wordlist = null; +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = []; + data.forEach(function (data, length) { + length += 4; + for (var i = 0; i < data.length; i += length) { + var word = ""; + for (var j = 0; j < length; j++) { + word += getHangul(codes.indexOf(data[i + j])); + } + wordlist.push(word); + } + }); + wordlist.sort(); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (wordlist_1.Wordlist.check(lang) !== "0xf9eddeace9c5d3da9c93cf7d3cd38f6a13ed3affb933259ae865714e8a3ae71a") { + wordlist = null; + throw new Error("BIP39 Wordlist for ko (Korean) FAILED"); + } +} +var LangKo = /** @class */ (function (_super) { + __extends(LangKo, _super); + function LangKo() { + return _super.call(this, "ko") || this; + } + LangKo.prototype.getWord = function (index) { + loadWords(this); + return wordlist[index]; + }; + LangKo.prototype.getWordIndex = function (word) { + loadWords(this); + return wordlist.indexOf(word); + }; + return LangKo; +}(wordlist_1.Wordlist)); +var langKo = new LangKo(); +exports.langKo = langKo; +wordlist_1.Wordlist.register(langKo); + +},{"./wordlist":120,"@ethersproject/strings":99}],119:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.langZhTw = exports.langZhCn = void 0; +var strings_1 = require("@ethersproject/strings"); +var wordlist_1 = require("./wordlist"); +var data = "}aE#4A=Yv&co#4N#6G=cJ&SM#66|/Z#4t&kn~46#4K~4q%b9=IR#7l,mB#7W_X2*dl}Uo~7s}Uf&Iw#9c&cw~6O&H6&wx&IG%v5=IQ~8a&Pv#47$PR&50%Ko&QM&3l#5f,D9#4L|/H&tQ;v0~6n]nN> 2), + 128 + codes.indexOf(data[i * 3 + 1]), + 128 + codes.indexOf(data[i * 3 + 2]), + ]; + if (lang.locale === "zh_tw") { + var common = s % 4; + for (var i_1 = common; i_1 < 3; i_1++) { + bytes[i_1] = codes.indexOf(deltaData[deltaOffset++]) + ((i_1 == 0) ? 228 : 128); + } + } + wordlist[lang.locale].push(strings_1.toUtf8String(bytes)); + } + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (wordlist_1.Wordlist.check(lang) !== Checks[lang.locale]) { + wordlist[lang.locale] = null; + throw new Error("BIP39 Wordlist for " + lang.locale + " (Chinese) FAILED"); + } +} +var LangZh = /** @class */ (function (_super) { + __extends(LangZh, _super); + function LangZh(country) { + return _super.call(this, "zh_" + country) || this; + } + LangZh.prototype.getWord = function (index) { + loadWords(this); + return wordlist[this.locale][index]; + }; + LangZh.prototype.getWordIndex = function (word) { + loadWords(this); + return wordlist[this.locale].indexOf(word); + }; + LangZh.prototype.split = function (mnemonic) { + mnemonic = mnemonic.replace(/(?:\u3000| )+/g, ""); + return mnemonic.split(""); + }; + return LangZh; +}(wordlist_1.Wordlist)); +var langZhCn = new LangZh("cn"); +exports.langZhCn = langZhCn; +wordlist_1.Wordlist.register(langZhCn); +wordlist_1.Wordlist.register(langZhCn, "zh"); +var langZhTw = new LangZh("tw"); +exports.langZhTw = langZhTw; +wordlist_1.Wordlist.register(langZhTw); + +},{"./wordlist":120,"@ethersproject/strings":99}],120:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Wordlist = exports.logger = void 0; +// This gets overridden by rollup +var exportWordlist = false; +var hash_1 = require("@ethersproject/hash"); +var properties_1 = require("@ethersproject/properties"); +var logger_1 = require("@ethersproject/logger"); +var _version_1 = require("./_version"); +exports.logger = new logger_1.Logger(_version_1.version); +var Wordlist = /** @class */ (function () { + function Wordlist(locale) { + var _newTarget = this.constructor; + exports.logger.checkAbstract(_newTarget, Wordlist); + properties_1.defineReadOnly(this, "locale", locale); + } + // Subclasses may override this + Wordlist.prototype.split = function (mnemonic) { + return mnemonic.toLowerCase().split(/ +/g); + }; + // Subclasses may override this + Wordlist.prototype.join = function (words) { + return words.join(" "); + }; + Wordlist.check = function (wordlist) { + var words = []; + for (var i = 0; i < 2048; i++) { + var word = wordlist.getWord(i); + /* istanbul ignore if */ + if (i !== wordlist.getWordIndex(word)) { + return "0x"; + } + words.push(word); + } + return hash_1.id(words.join("\n") + "\n"); + }; + Wordlist.register = function (lang, name) { + if (!name) { + name = lang.locale; + } + /* istanbul ignore if */ + if (exportWordlist) { + try { + var anyGlobal = window; + if (anyGlobal._ethers && anyGlobal._ethers.wordlists) { + if (!anyGlobal._ethers.wordlists[name]) { + properties_1.defineReadOnly(anyGlobal._ethers.wordlists, name, lang); + } + } + } + catch (error) { } + } + }; + return Wordlist; +}()); +exports.Wordlist = Wordlist; + +},{"./_version":110,"@ethersproject/hash":43,"@ethersproject/logger":57,"@ethersproject/properties":63}],121:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.wordlists = void 0; +var lang_cz_1 = require("./lang-cz"); +var lang_en_1 = require("./lang-en"); +var lang_es_1 = require("./lang-es"); +var lang_fr_1 = require("./lang-fr"); +var lang_ja_1 = require("./lang-ja"); +var lang_ko_1 = require("./lang-ko"); +var lang_it_1 = require("./lang-it"); +var lang_zh_1 = require("./lang-zh"); +exports.wordlists = { + cz: lang_cz_1.langCz, + en: lang_en_1.langEn, + es: lang_es_1.langEs, + fr: lang_fr_1.langFr, + it: lang_it_1.langIt, + ja: lang_ja_1.langJa, + ko: lang_ko_1.langKo, + zh: lang_zh_1.langZhCn, + zh_cn: lang_zh_1.langZhCn, + zh_tw: lang_zh_1.langZhTw +}; + +},{"./lang-cz":112,"./lang-en":113,"./lang-es":114,"./lang-fr":115,"./lang-it":116,"./lang-ja":117,"./lang-ko":118,"./lang-zh":119}],122:[function(require,module,exports){ +module.exports = "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"; +},{}],123:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +/* eslint-disable no-continue */ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-param-reassign */ +/* eslint-disable no-prototype-builtins */ +var errorClasses = {}; +var deserializers = {}; +var addCustomErrorDeserializer = function (name, deserializer) { + deserializers[name] = deserializer; +}; +var createCustomErrorClass = function (name) { + var C = function CustomError(message, fields) { + Object.assign(this, fields); + this.name = name; + this.message = message || name; + this.stack = new Error().stack; + }; + C.prototype = new Error(); + errorClasses[name] = C; + return C; +}; +// inspired from https://github.com/programble/errio/blob/master/index.js +var deserializeError = function (object) { + if (typeof object === "object" && object) { + try { + // $FlowFixMe FIXME HACK + var msg = JSON.parse(object.message); + if (msg.message && msg.name) { + object = msg; + } + } + catch (e) { + // nothing + } + var error = void 0; + if (typeof object.name === "string") { + var name_1 = object.name; + var des = deserializers[name_1]; + if (des) { + error = des(object); + } + else { + var constructor = name_1 === "Error" ? Error : errorClasses[name_1]; + if (!constructor) { + console.warn("deserializing an unknown class '" + name_1 + "'"); + constructor = createCustomErrorClass(name_1); + } + error = Object.create(constructor.prototype); + try { + for (var prop in object) { + if (object.hasOwnProperty(prop)) { + error[prop] = object[prop]; + } + } + } + catch (e) { + // sometimes setting a property can fail (e.g. .name) + } + } + } + else { + error = new Error(object.message); + } + if (!error.stack && Error.captureStackTrace) { + Error.captureStackTrace(error, deserializeError); + } + return error; + } + return new Error(String(object)); +}; +// inspired from https://github.com/sindresorhus/serialize-error/blob/master/index.js +var serializeError = function (value) { + if (!value) + return value; + if (typeof value === "object") { + return destroyCircular(value, []); + } + if (typeof value === "function") { + return "[Function: " + (value.name || "anonymous") + "]"; + } + return value; +}; +// https://www.npmjs.com/package/destroy-circular +function destroyCircular(from, seen) { + var to = {}; + seen.push(from); + for (var _i = 0, _a = Object.keys(from); _i < _a.length; _i++) { + var key = _a[_i]; + var value = from[key]; + if (typeof value === "function") { + continue; + } + if (!value || typeof value !== "object") { + to[key] = value; + continue; + } + if (seen.indexOf(from[key]) === -1) { + to[key] = destroyCircular(from[key], seen.slice(0)); + continue; + } + to[key] = "[Circular]"; + } + if (typeof from.name === "string") { + to.name = from.name; + } + if (typeof from.message === "string") { + to.message = from.message; + } + if (typeof from.stack === "string") { + to.stack = from.stack; + } + return to; +} + +var AccountNameRequiredError = createCustomErrorClass("AccountNameRequired"); +var AccountNotSupported = createCustomErrorClass("AccountNotSupported"); +var AmountRequired = createCustomErrorClass("AmountRequired"); +var BluetoothRequired = createCustomErrorClass("BluetoothRequired"); +var BtcUnmatchedApp = createCustomErrorClass("BtcUnmatchedApp"); +var CantOpenDevice = createCustomErrorClass("CantOpenDevice"); +var CashAddrNotSupported = createCustomErrorClass("CashAddrNotSupported"); +var CurrencyNotSupported = createCustomErrorClass("CurrencyNotSupported"); +var DeviceAppVerifyNotSupported = createCustomErrorClass("DeviceAppVerifyNotSupported"); +var DeviceGenuineSocketEarlyClose = createCustomErrorClass("DeviceGenuineSocketEarlyClose"); +var DeviceNotGenuineError = createCustomErrorClass("DeviceNotGenuine"); +var DeviceOnDashboardExpected = createCustomErrorClass("DeviceOnDashboardExpected"); +var DeviceOnDashboardUnexpected = createCustomErrorClass("DeviceOnDashboardUnexpected"); +var DeviceInOSUExpected = createCustomErrorClass("DeviceInOSUExpected"); +var DeviceHalted = createCustomErrorClass("DeviceHalted"); +var DeviceNameInvalid = createCustomErrorClass("DeviceNameInvalid"); +var DeviceSocketFail = createCustomErrorClass("DeviceSocketFail"); +var DeviceSocketNoBulkStatus = createCustomErrorClass("DeviceSocketNoBulkStatus"); +var DisconnectedDevice = createCustomErrorClass("DisconnectedDevice"); +var DisconnectedDeviceDuringOperation = createCustomErrorClass("DisconnectedDeviceDuringOperation"); +var EnpointConfigError = createCustomErrorClass("EnpointConfig"); +var EthAppPleaseEnableContractData = createCustomErrorClass("EthAppPleaseEnableContractData"); +var FeeEstimationFailed = createCustomErrorClass("FeeEstimationFailed"); +var FirmwareNotRecognized = createCustomErrorClass("FirmwareNotRecognized"); +var HardResetFail = createCustomErrorClass("HardResetFail"); +var InvalidXRPTag = createCustomErrorClass("InvalidXRPTag"); +var InvalidAddress = createCustomErrorClass("InvalidAddress"); +var InvalidAddressBecauseDestinationIsAlsoSource = createCustomErrorClass("InvalidAddressBecauseDestinationIsAlsoSource"); +var LatestMCUInstalledError = createCustomErrorClass("LatestMCUInstalledError"); +var UnknownMCU = createCustomErrorClass("UnknownMCU"); +var LedgerAPIError = createCustomErrorClass("LedgerAPIError"); +var LedgerAPIErrorWithMessage = createCustomErrorClass("LedgerAPIErrorWithMessage"); +var LedgerAPINotAvailable = createCustomErrorClass("LedgerAPINotAvailable"); +var ManagerAppAlreadyInstalledError = createCustomErrorClass("ManagerAppAlreadyInstalled"); +var ManagerAppRelyOnBTCError = createCustomErrorClass("ManagerAppRelyOnBTC"); +var ManagerAppDepInstallRequired = createCustomErrorClass("ManagerAppDepInstallRequired"); +var ManagerAppDepUninstallRequired = createCustomErrorClass("ManagerAppDepUninstallRequired"); +var ManagerDeviceLockedError = createCustomErrorClass("ManagerDeviceLocked"); +var ManagerFirmwareNotEnoughSpaceError = createCustomErrorClass("ManagerFirmwareNotEnoughSpace"); +var ManagerNotEnoughSpaceError = createCustomErrorClass("ManagerNotEnoughSpace"); +var ManagerUninstallBTCDep = createCustomErrorClass("ManagerUninstallBTCDep"); +var NetworkDown = createCustomErrorClass("NetworkDown"); +var NoAddressesFound = createCustomErrorClass("NoAddressesFound"); +var NotEnoughBalance = createCustomErrorClass("NotEnoughBalance"); +var NotEnoughBalanceToDelegate = createCustomErrorClass("NotEnoughBalanceToDelegate"); +var NotEnoughBalanceInParentAccount = createCustomErrorClass("NotEnoughBalanceInParentAccount"); +var NotEnoughSpendableBalance = createCustomErrorClass("NotEnoughSpendableBalance"); +var NotEnoughBalanceBecauseDestinationNotCreated = createCustomErrorClass("NotEnoughBalanceBecauseDestinationNotCreated"); +var NoAccessToCamera = createCustomErrorClass("NoAccessToCamera"); +var NotEnoughGas = createCustomErrorClass("NotEnoughGas"); +var NotSupportedLegacyAddress = createCustomErrorClass("NotSupportedLegacyAddress"); +var GasLessThanEstimate = createCustomErrorClass("GasLessThanEstimate"); +var PasswordsDontMatchError = createCustomErrorClass("PasswordsDontMatch"); +var PasswordIncorrectError = createCustomErrorClass("PasswordIncorrect"); +var RecommendSubAccountsToEmpty = createCustomErrorClass("RecommendSubAccountsToEmpty"); +var RecommendUndelegation = createCustomErrorClass("RecommendUndelegation"); +var TimeoutTagged = createCustomErrorClass("TimeoutTagged"); +var UnexpectedBootloader = createCustomErrorClass("UnexpectedBootloader"); +var MCUNotGenuineToDashboard = createCustomErrorClass("MCUNotGenuineToDashboard"); +var RecipientRequired = createCustomErrorClass("RecipientRequired"); +var UnavailableTezosOriginatedAccountReceive = createCustomErrorClass("UnavailableTezosOriginatedAccountReceive"); +var UnavailableTezosOriginatedAccountSend = createCustomErrorClass("UnavailableTezosOriginatedAccountSend"); +var UpdateFetchFileFail = createCustomErrorClass("UpdateFetchFileFail"); +var UpdateIncorrectHash = createCustomErrorClass("UpdateIncorrectHash"); +var UpdateIncorrectSig = createCustomErrorClass("UpdateIncorrectSig"); +var UpdateYourApp = createCustomErrorClass("UpdateYourApp"); +var UserRefusedDeviceNameChange = createCustomErrorClass("UserRefusedDeviceNameChange"); +var UserRefusedAddress = createCustomErrorClass("UserRefusedAddress"); +var UserRefusedFirmwareUpdate = createCustomErrorClass("UserRefusedFirmwareUpdate"); +var UserRefusedAllowManager = createCustomErrorClass("UserRefusedAllowManager"); +var UserRefusedOnDevice = createCustomErrorClass("UserRefusedOnDevice"); // TODO rename because it's just for transaction refusal +var TransportOpenUserCancelled = createCustomErrorClass("TransportOpenUserCancelled"); +var TransportInterfaceNotAvailable = createCustomErrorClass("TransportInterfaceNotAvailable"); +var TransportRaceCondition = createCustomErrorClass("TransportRaceCondition"); +var TransportWebUSBGestureRequired = createCustomErrorClass("TransportWebUSBGestureRequired"); +var DeviceShouldStayInApp = createCustomErrorClass("DeviceShouldStayInApp"); +var WebsocketConnectionError = createCustomErrorClass("WebsocketConnectionError"); +var WebsocketConnectionFailed = createCustomErrorClass("WebsocketConnectionFailed"); +var WrongDeviceForAccount = createCustomErrorClass("WrongDeviceForAccount"); +var WrongAppForCurrency = createCustomErrorClass("WrongAppForCurrency"); +var ETHAddressNonEIP = createCustomErrorClass("ETHAddressNonEIP"); +var CantScanQRCode = createCustomErrorClass("CantScanQRCode"); +var FeeNotLoaded = createCustomErrorClass("FeeNotLoaded"); +var FeeRequired = createCustomErrorClass("FeeRequired"); +var FeeTooHigh = createCustomErrorClass("FeeTooHigh"); +var SyncError = createCustomErrorClass("SyncError"); +var PairingFailed = createCustomErrorClass("PairingFailed"); +var GenuineCheckFailed = createCustomErrorClass("GenuineCheckFailed"); +var LedgerAPI4xx = createCustomErrorClass("LedgerAPI4xx"); +var LedgerAPI5xx = createCustomErrorClass("LedgerAPI5xx"); +var FirmwareOrAppUpdateRequired = createCustomErrorClass("FirmwareOrAppUpdateRequired"); +// db stuff, no need to translate +var NoDBPathGiven = createCustomErrorClass("NoDBPathGiven"); +var DBWrongPassword = createCustomErrorClass("DBWrongPassword"); +var DBNotReset = createCustomErrorClass("DBNotReset"); +/** + * TransportError is used for any generic transport errors. + * e.g. Error thrown when data received by exchanges are incorrect or if exchanged failed to communicate with the device for various reason. + */ +function TransportError(message, id) { + this.name = "TransportError"; + this.message = message; + this.stack = new Error().stack; + this.id = id; +} +TransportError.prototype = new Error(); +addCustomErrorDeserializer("TransportError", function (e) { return new TransportError(e.message, e.id); }); +var StatusCodes = { + PIN_REMAINING_ATTEMPTS: 0x63c0, + INCORRECT_LENGTH: 0x6700, + MISSING_CRITICAL_PARAMETER: 0x6800, + COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 0x6981, + SECURITY_STATUS_NOT_SATISFIED: 0x6982, + CONDITIONS_OF_USE_NOT_SATISFIED: 0x6985, + INCORRECT_DATA: 0x6a80, + NOT_ENOUGH_MEMORY_SPACE: 0x6a84, + REFERENCED_DATA_NOT_FOUND: 0x6a88, + FILE_ALREADY_EXISTS: 0x6a89, + INCORRECT_P1_P2: 0x6b00, + INS_NOT_SUPPORTED: 0x6d00, + CLA_NOT_SUPPORTED: 0x6e00, + TECHNICAL_PROBLEM: 0x6f00, + OK: 0x9000, + MEMORY_PROBLEM: 0x9240, + NO_EF_SELECTED: 0x9400, + INVALID_OFFSET: 0x9402, + FILE_NOT_FOUND: 0x9404, + INCONSISTENT_FILE: 0x9408, + ALGORITHM_NOT_SUPPORTED: 0x9484, + INVALID_KCV: 0x9485, + CODE_NOT_INITIALIZED: 0x9802, + ACCESS_CONDITION_NOT_FULFILLED: 0x9804, + CONTRADICTION_SECRET_CODE_STATUS: 0x9808, + CONTRADICTION_INVALIDATION: 0x9810, + CODE_BLOCKED: 0x9840, + MAX_VALUE_REACHED: 0x9850, + GP_AUTH_FAILED: 0x6300, + LICENSING: 0x6f42, + HALTED: 0x6faa, +}; +function getAltStatusMessage(code) { + switch (code) { + // improve text of most common errors + case 0x6700: + return "Incorrect length"; + case 0x6800: + return "Missing critical parameter"; + case 0x6982: + return "Security not satisfied (dongle locked or have invalid access rights)"; + case 0x6985: + return "Condition of use not satisfied (denied by the user?)"; + case 0x6a80: + return "Invalid data received"; + case 0x6b00: + return "Invalid parameter received"; + } + if (0x6f00 <= code && code <= 0x6fff) { + return "Internal error, please report"; + } +} +/** + * Error thrown when a device returned a non success status. + * the error.statusCode is one of the `StatusCodes` exported by this library. + */ +function TransportStatusError(statusCode) { + this.name = "TransportStatusError"; + var statusText = Object.keys(StatusCodes).find(function (k) { return StatusCodes[k] === statusCode; }) || + "UNKNOWN_ERROR"; + var smsg = getAltStatusMessage(statusCode) || statusText; + var statusCodeStr = statusCode.toString(16); + this.message = "Ledger device: " + smsg + " (0x" + statusCodeStr + ")"; + this.stack = new Error().stack; + this.statusCode = statusCode; + this.statusText = statusText; +} +TransportStatusError.prototype = new Error(); +addCustomErrorDeserializer("TransportStatusError", function (e) { return new TransportStatusError(e.statusCode); }); + +exports.AccountNameRequiredError = AccountNameRequiredError; +exports.AccountNotSupported = AccountNotSupported; +exports.AmountRequired = AmountRequired; +exports.BluetoothRequired = BluetoothRequired; +exports.BtcUnmatchedApp = BtcUnmatchedApp; +exports.CantOpenDevice = CantOpenDevice; +exports.CantScanQRCode = CantScanQRCode; +exports.CashAddrNotSupported = CashAddrNotSupported; +exports.CurrencyNotSupported = CurrencyNotSupported; +exports.DBNotReset = DBNotReset; +exports.DBWrongPassword = DBWrongPassword; +exports.DeviceAppVerifyNotSupported = DeviceAppVerifyNotSupported; +exports.DeviceGenuineSocketEarlyClose = DeviceGenuineSocketEarlyClose; +exports.DeviceHalted = DeviceHalted; +exports.DeviceInOSUExpected = DeviceInOSUExpected; +exports.DeviceNameInvalid = DeviceNameInvalid; +exports.DeviceNotGenuineError = DeviceNotGenuineError; +exports.DeviceOnDashboardExpected = DeviceOnDashboardExpected; +exports.DeviceOnDashboardUnexpected = DeviceOnDashboardUnexpected; +exports.DeviceShouldStayInApp = DeviceShouldStayInApp; +exports.DeviceSocketFail = DeviceSocketFail; +exports.DeviceSocketNoBulkStatus = DeviceSocketNoBulkStatus; +exports.DisconnectedDevice = DisconnectedDevice; +exports.DisconnectedDeviceDuringOperation = DisconnectedDeviceDuringOperation; +exports.ETHAddressNonEIP = ETHAddressNonEIP; +exports.EnpointConfigError = EnpointConfigError; +exports.EthAppPleaseEnableContractData = EthAppPleaseEnableContractData; +exports.FeeEstimationFailed = FeeEstimationFailed; +exports.FeeNotLoaded = FeeNotLoaded; +exports.FeeRequired = FeeRequired; +exports.FeeTooHigh = FeeTooHigh; +exports.FirmwareNotRecognized = FirmwareNotRecognized; +exports.FirmwareOrAppUpdateRequired = FirmwareOrAppUpdateRequired; +exports.GasLessThanEstimate = GasLessThanEstimate; +exports.GenuineCheckFailed = GenuineCheckFailed; +exports.HardResetFail = HardResetFail; +exports.InvalidAddress = InvalidAddress; +exports.InvalidAddressBecauseDestinationIsAlsoSource = InvalidAddressBecauseDestinationIsAlsoSource; +exports.InvalidXRPTag = InvalidXRPTag; +exports.LatestMCUInstalledError = LatestMCUInstalledError; +exports.LedgerAPI4xx = LedgerAPI4xx; +exports.LedgerAPI5xx = LedgerAPI5xx; +exports.LedgerAPIError = LedgerAPIError; +exports.LedgerAPIErrorWithMessage = LedgerAPIErrorWithMessage; +exports.LedgerAPINotAvailable = LedgerAPINotAvailable; +exports.MCUNotGenuineToDashboard = MCUNotGenuineToDashboard; +exports.ManagerAppAlreadyInstalledError = ManagerAppAlreadyInstalledError; +exports.ManagerAppDepInstallRequired = ManagerAppDepInstallRequired; +exports.ManagerAppDepUninstallRequired = ManagerAppDepUninstallRequired; +exports.ManagerAppRelyOnBTCError = ManagerAppRelyOnBTCError; +exports.ManagerDeviceLockedError = ManagerDeviceLockedError; +exports.ManagerFirmwareNotEnoughSpaceError = ManagerFirmwareNotEnoughSpaceError; +exports.ManagerNotEnoughSpaceError = ManagerNotEnoughSpaceError; +exports.ManagerUninstallBTCDep = ManagerUninstallBTCDep; +exports.NetworkDown = NetworkDown; +exports.NoAccessToCamera = NoAccessToCamera; +exports.NoAddressesFound = NoAddressesFound; +exports.NoDBPathGiven = NoDBPathGiven; +exports.NotEnoughBalance = NotEnoughBalance; +exports.NotEnoughBalanceBecauseDestinationNotCreated = NotEnoughBalanceBecauseDestinationNotCreated; +exports.NotEnoughBalanceInParentAccount = NotEnoughBalanceInParentAccount; +exports.NotEnoughBalanceToDelegate = NotEnoughBalanceToDelegate; +exports.NotEnoughGas = NotEnoughGas; +exports.NotEnoughSpendableBalance = NotEnoughSpendableBalance; +exports.NotSupportedLegacyAddress = NotSupportedLegacyAddress; +exports.PairingFailed = PairingFailed; +exports.PasswordIncorrectError = PasswordIncorrectError; +exports.PasswordsDontMatchError = PasswordsDontMatchError; +exports.RecipientRequired = RecipientRequired; +exports.RecommendSubAccountsToEmpty = RecommendSubAccountsToEmpty; +exports.RecommendUndelegation = RecommendUndelegation; +exports.StatusCodes = StatusCodes; +exports.SyncError = SyncError; +exports.TimeoutTagged = TimeoutTagged; +exports.TransportError = TransportError; +exports.TransportInterfaceNotAvailable = TransportInterfaceNotAvailable; +exports.TransportOpenUserCancelled = TransportOpenUserCancelled; +exports.TransportRaceCondition = TransportRaceCondition; +exports.TransportStatusError = TransportStatusError; +exports.TransportWebUSBGestureRequired = TransportWebUSBGestureRequired; +exports.UnavailableTezosOriginatedAccountReceive = UnavailableTezosOriginatedAccountReceive; +exports.UnavailableTezosOriginatedAccountSend = UnavailableTezosOriginatedAccountSend; +exports.UnexpectedBootloader = UnexpectedBootloader; +exports.UnknownMCU = UnknownMCU; +exports.UpdateFetchFileFail = UpdateFetchFileFail; +exports.UpdateIncorrectHash = UpdateIncorrectHash; +exports.UpdateIncorrectSig = UpdateIncorrectSig; +exports.UpdateYourApp = UpdateYourApp; +exports.UserRefusedAddress = UserRefusedAddress; +exports.UserRefusedAllowManager = UserRefusedAllowManager; +exports.UserRefusedDeviceNameChange = UserRefusedDeviceNameChange; +exports.UserRefusedFirmwareUpdate = UserRefusedFirmwareUpdate; +exports.UserRefusedOnDevice = UserRefusedOnDevice; +exports.WebsocketConnectionError = WebsocketConnectionError; +exports.WebsocketConnectionFailed = WebsocketConnectionFailed; +exports.WrongAppForCurrency = WrongAppForCurrency; +exports.WrongDeviceForAccount = WrongDeviceForAccount; +exports.addCustomErrorDeserializer = addCustomErrorDeserializer; +exports.createCustomErrorClass = createCustomErrorClass; +exports.deserializeError = deserializeError; +exports.getAltStatusMessage = getAltStatusMessage; +exports.serializeError = serializeError; + +},{}],124:[function(require,module,exports){ +(function (Buffer){ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +exports.__esModule = true; +/******************************************************************************** + * Ledger Node JS API + * (c) 2016-2017 Ledger + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ +// FIXME drop: +var utils_1 = require("./utils"); +var logs_1 = require("@ledgerhq/logs"); +var errors_1 = require("@ledgerhq/errors"); +var bignumber_js_1 = require("bignumber.js"); +var ethers_1 = require("ethers"); +var erc20_1 = require("./erc20"); +var contracts_1 = require("./contracts"); +var starkQuantizationTypeMap = { + eth: 1, + erc20: 2, + erc721: 3, + erc20mintable: 4, + erc721mintable: 5 +}; +function hexBuffer(str) { + return Buffer.from(str.startsWith("0x") ? str.slice(2) : str, "hex"); +} +function maybeHexBuffer(str) { + if (!str) + return null; + return hexBuffer(str); +} +var remapTransactionRelatedErrors = function (e) { + if (e && e.statusCode === 0x6a80) { + return new errors_1.EthAppPleaseEnableContractData("Please enable Contract data on the Ethereum app Settings"); + } + return e; +}; +/** + * Ethereum API + * + * @example + * import Eth from "@ledgerhq/hw-app-eth"; + * const eth = new Eth(transport) + */ +var Eth = /** @class */ (function () { + function Eth(transport, scrambleKey) { + if (scrambleKey === void 0) { scrambleKey = "w0w"; } + this.transport = transport; + transport.decorateAppAPIMethods(this, [ + "getAddress", + "provideERC20TokenInformation", + "signTransaction", + "signPersonalMessage", + "getAppConfiguration", + "signEIP712HashedMessage", + "starkGetPublicKey", + "starkSignOrder", + "starkSignOrder_v2", + "starkSignTransfer", + "starkSignTransfer_v2", + "starkProvideQuantum", + "starkProvideQuantum_v2", + "starkUnsafeSign", + "eth2GetPublicKey", + "eth2SetWithdrawalIndex", + "setExternalPlugin", + ], scrambleKey); + } + /** + * get Ethereum address for a given BIP 32 path. + * @param path a path in BIP 32 format + * @option boolDisplay optionally enable or not the display + * @option boolChaincode optionally enable or not the chaincode request + * @return an object with a publicKey, address and (optionally) chainCode + * @example + * eth.getAddress("44'/60'/0'/0/0").then(o => o.address) + */ + Eth.prototype.getAddress = function (path, boolDisplay, boolChaincode) { + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + paths.length * 4); + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + return this.transport + .send(0xe0, 0x02, boolDisplay ? 0x01 : 0x00, boolChaincode ? 0x01 : 0x00, buffer) + .then(function (response) { + var publicKeyLength = response[0]; + var addressLength = response[1 + publicKeyLength]; + return { + publicKey: response.slice(1, 1 + publicKeyLength).toString("hex"), + address: "0x" + + response + .slice(1 + publicKeyLength + 1, 1 + publicKeyLength + 1 + addressLength) + .toString("ascii"), + chainCode: boolChaincode + ? response + .slice(1 + publicKeyLength + 1 + addressLength, 1 + publicKeyLength + 1 + addressLength + 32) + .toString("hex") + : undefined + }; + }); + }; + /** + * This commands provides a trusted description of an ERC 20 token + * to associate a contract address with a ticker and number of decimals. + * + * It shall be run immediately before performing a transaction involving a contract + * calling this contract address to display the proper token information to the user if necessary. + * + * @param {*} info: a blob from "erc20.js" utilities that contains all token information. + * + * @example + * import { byContractAddressAndChainId } from "@ledgerhq/hw-app-eth/erc20" + * const zrxInfo = byContractAddressAndChainId("0xe41d2489571d322189246dafa5ebde1f4699f498", chainId) + * if (zrxInfo) await appEth.provideERC20TokenInformation(zrxInfo) + * const signed = await appEth.signTransaction(path, rawTxHex) + */ + Eth.prototype.provideERC20TokenInformation = function (_a) { + var data = _a.data; + return provideERC20TokenInformation(this.transport, data); + }; + /** + * You can sign a transaction and retrieve v, r, s given the raw transaction and the BIP 32 path of the account to sign + * @example + eth.signTransaction("44'/60'/0'/0/0", "e8018504e3b292008252089428ee52a8f3d6e5d15f8b131996950d7f296c7952872bd72a2487400080").then(result => ...) + */ + Eth.prototype.signTransaction = function (path, rawTxHex) { + return __awaiter(this, void 0, void 0, function () { + var paths, offset, rawTx, VALID_TYPES, txType, rlpData, toSend, response, rlpTx, vrsOffset, chainId, chainIdTruncated, rlpVrs, sizeOfListLen, chainIdSrc, chainIdTruncatedBuf, _loop_1, decodedTx, provideForContract, selector, infos, plugin, payload, signature, erc20OfInterest, abi, contract, args, erc20OfInterest_1, erc20OfInterest_1_1, address, e_1_1; + var e_1, _a; + var _this = this; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + paths = utils_1.splitPath(path); + offset = 0; + rawTx = Buffer.from(rawTxHex, "hex"); + VALID_TYPES = [1, 2]; + txType = VALID_TYPES.includes(rawTx[0]) ? rawTx[0] : null; + rlpData = txType === null ? rawTx : rawTx.slice(1, rawTxHex.length); + toSend = []; + rlpTx = ethers_1.ethers.utils.RLP.decode(rlpData).map(function (hex) { + return Buffer.from(hex.slice(2), "hex"); + }); + vrsOffset = 0; + chainId = new bignumber_js_1.BigNumber(0); + chainIdTruncated = 0; + if (txType === null && rlpTx.length > 6) { + rlpVrs = Buffer.from(ethers_1.ethers.utils.RLP.encode(rlpTx.slice(-3)).slice(2), "hex"); + vrsOffset = rawTx.length - (rlpVrs.length - 1); + // First byte > 0xf7 means the length of the list length doesn't fit in a single byte. + if (rlpVrs[0] > 0xf7) { + // Increment vrsOffset to account for that extra byte. + vrsOffset++; + sizeOfListLen = rlpVrs[0] - 0xf7; + // Increase rlpOffset by the size of the list length. + vrsOffset += sizeOfListLen - 1; + } + // Using BigNumber because chainID could be any uint256. + chainId = new bignumber_js_1.BigNumber(rlpTx[6].toString("hex"), 16); + chainIdSrc = rlpTx[6]; + chainIdTruncatedBuf = Buffer.alloc(4); + if (chainIdSrc.length > 4) { + chainIdSrc.copy(chainIdTruncatedBuf); + } + else { + chainIdSrc.copy(chainIdTruncatedBuf, 4 - chainIdSrc.length); + } + chainIdTruncated = chainIdTruncatedBuf.readUInt32BE(0); + } + _loop_1 = function () { + var maxChunkSize = offset === 0 ? 150 - 1 - paths.length * 4 : 150; + var chunkSize = offset + maxChunkSize > rawTx.length + ? rawTx.length - offset + : maxChunkSize; + if (vrsOffset != 0 && offset + chunkSize >= vrsOffset) { + // Make sure that the chunk doesn't end right on the EIP 155 marker if set + chunkSize = rawTx.length - offset; + } + var buffer = Buffer.alloc(offset === 0 ? 1 + paths.length * 4 + chunkSize : chunkSize); + if (offset === 0) { + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + rawTx.copy(buffer, 1 + 4 * paths.length, offset, offset + chunkSize); + } + else { + rawTx.copy(buffer, 0, offset, offset + chunkSize); + } + toSend.push(buffer); + offset += chunkSize; + }; + while (offset !== rawTx.length) { + _loop_1(); + } + rlpTx = ethers_1.ethers.utils.RLP.decode(rlpData); + if (txType === 2) { + // EIP1559 + decodedTx = { + data: rlpTx[7], + to: rlpTx[5] + }; + } + else if (txType === 1) { + // EIP2930 + decodedTx = { + data: rlpTx[6], + to: rlpTx[4] + }; + } + else { + // Legacy tx + decodedTx = { + data: rlpTx[5], + to: rlpTx[3] + }; + } + provideForContract = function (address) { return __awaiter(_this, void 0, void 0, function () { + var erc20Info; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + erc20Info = erc20_1.byContractAddressAndChainId(address, chainIdTruncated); + if (!erc20Info) return [3 /*break*/, 2]; + logs_1.log("ethereum", "loading erc20token info for " + + erc20Info.contractAddress + + " (" + + erc20Info.ticker + + ")"); + return [4 /*yield*/, provideERC20TokenInformation(this.transport, erc20Info.data)]; + case 1: + _a.sent(); + _a.label = 2; + case 2: return [2 /*return*/]; + } + }); + }); }; + if (!(decodedTx.data.length >= 10)) return [3 /*break*/, 15]; + selector = decodedTx.data.substring(0, 10); + return [4 /*yield*/, contracts_1.loadInfosForContractMethod(decodedTx.to, selector)]; + case 1: + infos = _b.sent(); + if (!infos) return [3 /*break*/, 12]; + plugin = infos.plugin, payload = infos.payload, signature = infos.signature, erc20OfInterest = infos.erc20OfInterest, abi = infos.abi; + if (!plugin) return [3 /*break*/, 3]; + logs_1.log("ethereum", "loading plugin for " + selector); + return [4 /*yield*/, setExternalPlugin(this.transport, payload, signature)]; + case 2: + _b.sent(); + _b.label = 3; + case 3: + if (!(erc20OfInterest && erc20OfInterest.length && abi)) return [3 /*break*/, 11]; + contract = new ethers_1.ethers.utils.Interface(abi); + args = contract.parseTransaction(decodedTx).args; + _b.label = 4; + case 4: + _b.trys.push([4, 9, 10, 11]); + erc20OfInterest_1 = __values(erc20OfInterest), erc20OfInterest_1_1 = erc20OfInterest_1.next(); + _b.label = 5; + case 5: + if (!!erc20OfInterest_1_1.done) return [3 /*break*/, 8]; + path = erc20OfInterest_1_1.value; + address = path.split(".").reduce(function (value, seg) { + if (seg === "-1" && Array.isArray(value)) { + return value[value.length - 1]; + } + return value[seg]; + }, args); + return [4 /*yield*/, provideForContract(address)]; + case 6: + _b.sent(); + _b.label = 7; + case 7: + erc20OfInterest_1_1 = erc20OfInterest_1.next(); + return [3 /*break*/, 5]; + case 8: return [3 /*break*/, 11]; + case 9: + e_1_1 = _b.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 11]; + case 10: + try { + if (erc20OfInterest_1_1 && !erc20OfInterest_1_1.done && (_a = erc20OfInterest_1["return"])) _a.call(erc20OfInterest_1); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 11: return [3 /*break*/, 13]; + case 12: + logs_1.log("ethereum", "no infos for selector " + selector); + _b.label = 13; + case 13: return [4 /*yield*/, provideForContract(decodedTx.to)]; + case 14: + _b.sent(); + _b.label = 15; + case 15: return [2 /*return*/, utils_1.foreach(toSend, function (data, i) { + return _this.transport + .send(0xe0, 0x04, i === 0 ? 0x00 : 0x80, 0x00, data) + .then(function (apduResponse) { + response = apduResponse; + }); + }).then(function () { + var response_byte = response.slice(0, 1)[0]; + var v = ""; + if (chainId.times(2).plus(35).plus(1).isGreaterThan(255)) { + var oneByteChainId = (chainIdTruncated * 2 + 35) % 256; + var ecc_parity = response_byte - oneByteChainId; + if (txType != null) { + // For EIP2930 and EIP1559 tx, v is simply the parity. + v = ecc_parity % 2 == 1 ? "00" : "01"; + } + else { + // Legacy type transaction with a big chain ID + v = chainId.times(2).plus(35).plus(ecc_parity).toString(16); + } + } + else { + v = response_byte.toString(16); + } + // Make sure v has is prefixed with a 0 if its length is odd ("1" -> "01"). + if (v.length % 2 == 1) { + v = "0" + v; + } + var r = response.slice(1, 1 + 32).toString("hex"); + var s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); + return { + v: v, + r: r, + s: s + }; + }, function (e) { + throw remapTransactionRelatedErrors(e); + })]; + } + }); + }); + }; + /** + */ + Eth.prototype.getAppConfiguration = function () { + return this.transport.send(0xe0, 0x06, 0x00, 0x00).then(function (response) { + return { + arbitraryDataEnabled: response[0] & 0x01, + erc20ProvisioningNecessary: response[0] & 0x02, + starkEnabled: response[0] & 0x04, + starkv2Supported: response[0] & 0x08, + version: "" + response[1] + "." + response[2] + "." + response[3] + }; + }); + }; + /** + * You can sign a message according to eth_sign RPC call and retrieve v, r, s given the message and the BIP 32 path of the account to sign. + * @example + eth.signPersonalMessage("44'/60'/0'/0/0", Buffer.from("test").toString("hex")).then(result => { + var v = result['v'] - 27; + v = v.toString(16); + if (v.length < 2) { + v = "0" + v; + } + console.log("Signature 0x" + result['r'] + result['s'] + v); + }) + */ + Eth.prototype.signPersonalMessage = function (path, messageHex) { + var _this = this; + var paths = utils_1.splitPath(path); + var offset = 0; + var message = Buffer.from(messageHex, "hex"); + var toSend = []; + var response; + var _loop_2 = function () { + var maxChunkSize = offset === 0 ? 150 - 1 - paths.length * 4 - 4 : 150; + var chunkSize = offset + maxChunkSize > message.length + ? message.length - offset + : maxChunkSize; + var buffer = Buffer.alloc(offset === 0 ? 1 + paths.length * 4 + 4 + chunkSize : chunkSize); + if (offset === 0) { + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + buffer.writeUInt32BE(message.length, 1 + 4 * paths.length); + message.copy(buffer, 1 + 4 * paths.length + 4, offset, offset + chunkSize); + } + else { + message.copy(buffer, 0, offset, offset + chunkSize); + } + toSend.push(buffer); + offset += chunkSize; + }; + while (offset !== message.length) { + _loop_2(); + } + return utils_1.foreach(toSend, function (data, i) { + return _this.transport + .send(0xe0, 0x08, i === 0 ? 0x00 : 0x80, 0x00, data) + .then(function (apduResponse) { + response = apduResponse; + }); + }).then(function () { + var v = response[0]; + var r = response.slice(1, 1 + 32).toString("hex"); + var s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); + return { + v: v, + r: r, + s: s + }; + }); + }; + /** + * Sign a prepared message following web3.eth.signTypedData specification. The host computes the domain separator and hashStruct(message) + * @example + eth.signEIP712HashedMessage("44'/60'/0'/0/0", Buffer.from("0101010101010101010101010101010101010101010101010101010101010101").toString("hex"), Buffer.from("0202020202020202020202020202020202020202020202020202020202020202").toString("hex")).then(result => { + var v = result['v'] - 27; + v = v.toString(16); + if (v.length < 2) { + v = "0" + v; + } + console.log("Signature 0x" + result['r'] + result['s'] + v); + }) + */ + Eth.prototype.signEIP712HashedMessage = function (path, domainSeparatorHex, hashStructMessageHex) { + var domainSeparator = hexBuffer(domainSeparatorHex); + var hashStruct = hexBuffer(hashStructMessageHex); + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + paths.length * 4 + 32 + 32, 0); + var offset = 0; + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + offset = 1 + 4 * paths.length; + domainSeparator.copy(buffer, offset); + offset += 32; + hashStruct.copy(buffer, offset); + return this.transport + .send(0xe0, 0x0c, 0x00, 0x00, buffer) + .then(function (response) { + var v = response[0]; + var r = response.slice(1, 1 + 32).toString("hex"); + var s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); + return { + v: v, + r: r, + s: s + }; + }); + }; + /** + * get Stark public key for a given BIP 32 path. + * @param path a path in BIP 32 format + * @option boolDisplay optionally enable or not the display + * @return the Stark public key + */ + Eth.prototype.starkGetPublicKey = function (path, boolDisplay) { + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + paths.length * 4); + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + return this.transport + .send(0xf0, 0x02, boolDisplay ? 0x01 : 0x00, 0x00, buffer) + .then(function (response) { + return response.slice(0, response.length - 2); + }); + }; + /** + * sign a Stark order + * @param path a path in BIP 32 format + * @option sourceTokenAddress contract address of the source token (not present for ETH) + * @param sourceQuantization quantization used for the source token + * @option destinationTokenAddress contract address of the destination token (not present for ETH) + * @param destinationQuantization quantization used for the destination token + * @param sourceVault ID of the source vault + * @param destinationVault ID of the destination vault + * @param amountSell amount to sell + * @param amountBuy amount to buy + * @param nonce transaction nonce + * @param timestamp transaction validity timestamp + * @return the signature + */ + Eth.prototype.starkSignOrder = function (path, sourceTokenAddress, sourceQuantization, destinationTokenAddress, destinationQuantization, sourceVault, destinationVault, amountSell, amountBuy, nonce, timestamp) { + var sourceTokenAddressHex = maybeHexBuffer(sourceTokenAddress); + var destinationTokenAddressHex = maybeHexBuffer(destinationTokenAddress); + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + paths.length * 4 + 20 + 32 + 20 + 32 + 4 + 4 + 8 + 8 + 4 + 4, 0); + var offset = 0; + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + offset = 1 + 4 * paths.length; + if (sourceTokenAddressHex) { + sourceTokenAddressHex.copy(buffer, offset); + } + offset += 20; + Buffer.from(sourceQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + offset += 32; + if (destinationTokenAddressHex) { + destinationTokenAddressHex.copy(buffer, offset); + } + offset += 20; + Buffer.from(destinationQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + offset += 32; + buffer.writeUInt32BE(sourceVault, offset); + offset += 4; + buffer.writeUInt32BE(destinationVault, offset); + offset += 4; + Buffer.from(amountSell.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); + offset += 8; + Buffer.from(amountBuy.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); + offset += 8; + buffer.writeUInt32BE(nonce, offset); + offset += 4; + buffer.writeUInt32BE(timestamp, offset); + return this.transport + .send(0xf0, 0x04, 0x01, 0x00, buffer) + .then(function (response) { + var r = response.slice(1, 1 + 32).toString("hex"); + var s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); + return { + r: r, + s: s + }; + }); + }; + /** + * sign a Stark order using the Starkex V2 protocol + * @param path a path in BIP 32 format + * @option sourceTokenAddress contract address of the source token (not present for ETH) + * @param sourceQuantizationType quantization type used for the source token + * @option sourceQuantization quantization used for the source token (not present for erc 721 or mintable erc 721) + * @option sourceMintableBlobOrTokenId mintable blob (mintable erc 20 / mintable erc 721) or token id (erc 721) associated to the source token + * @option destinationTokenAddress contract address of the destination token (not present for ETH) + * @param destinationQuantizationType quantization type used for the destination token + * @option destinationQuantization quantization used for the destination token (not present for erc 721 or mintable erc 721) + * @option destinationMintableBlobOrTokenId mintable blob (mintable erc 20 / mintable erc 721) or token id (erc 721) associated to the destination token + * @param sourceVault ID of the source vault + * @param destinationVault ID of the destination vault + * @param amountSell amount to sell + * @param amountBuy amount to buy + * @param nonce transaction nonce + * @param timestamp transaction validity timestamp + * @return the signature + */ + Eth.prototype.starkSignOrder_v2 = function (path, sourceTokenAddress, sourceQuantizationType, sourceQuantization, sourceMintableBlobOrTokenId, destinationTokenAddress, destinationQuantizationType, destinationQuantization, destinationMintableBlobOrTokenId, sourceVault, destinationVault, amountSell, amountBuy, nonce, timestamp) { + var sourceTokenAddressHex = maybeHexBuffer(sourceTokenAddress); + var destinationTokenAddressHex = maybeHexBuffer(destinationTokenAddress); + if (!(sourceQuantizationType in starkQuantizationTypeMap)) { + throw new Error("eth.starkSignOrderv2 invalid source quantization type=" + + sourceQuantizationType); + } + if (!(destinationQuantizationType in starkQuantizationTypeMap)) { + throw new Error("eth.starkSignOrderv2 invalid destination quantization type=" + + destinationQuantizationType); + } + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + + paths.length * 4 + + 1 + + 20 + + 32 + + 32 + + 1 + + 20 + + 32 + + 32 + + 4 + + 4 + + 8 + + 8 + + 4 + + 4, 0); + var offset = 0; + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + offset = 1 + 4 * paths.length; + buffer[offset] = starkQuantizationTypeMap[sourceQuantizationType]; + offset++; + if (sourceTokenAddressHex) { + sourceTokenAddressHex.copy(buffer, offset); + } + offset += 20; + if (sourceQuantization) { + Buffer.from(sourceQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + } + offset += 32; + if (sourceMintableBlobOrTokenId) { + Buffer.from(sourceMintableBlobOrTokenId.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + } + offset += 32; + buffer[offset] = starkQuantizationTypeMap[destinationQuantizationType]; + offset++; + if (destinationTokenAddressHex) { + destinationTokenAddressHex.copy(buffer, offset); + } + offset += 20; + if (destinationQuantization) { + Buffer.from(destinationQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + } + offset += 32; + if (destinationMintableBlobOrTokenId) { + Buffer.from(destinationMintableBlobOrTokenId.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + } + offset += 32; + buffer.writeUInt32BE(sourceVault, offset); + offset += 4; + buffer.writeUInt32BE(destinationVault, offset); + offset += 4; + Buffer.from(amountSell.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); + offset += 8; + Buffer.from(amountBuy.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); + offset += 8; + buffer.writeUInt32BE(nonce, offset); + offset += 4; + buffer.writeUInt32BE(timestamp, offset); + return this.transport + .send(0xf0, 0x04, 0x03, 0x00, buffer) + .then(function (response) { + var r = response.slice(1, 1 + 32).toString("hex"); + var s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); + return { + r: r, + s: s + }; + }); + }; + /** + * sign a Stark transfer + * @param path a path in BIP 32 format + * @option transferTokenAddress contract address of the token to be transferred (not present for ETH) + * @param transferQuantization quantization used for the token to be transferred + * @param targetPublicKey target Stark public key + * @param sourceVault ID of the source vault + * @param destinationVault ID of the destination vault + * @param amountTransfer amount to transfer + * @param nonce transaction nonce + * @param timestamp transaction validity timestamp + * @return the signature + */ + Eth.prototype.starkSignTransfer = function (path, transferTokenAddress, transferQuantization, targetPublicKey, sourceVault, destinationVault, amountTransfer, nonce, timestamp) { + var transferTokenAddressHex = maybeHexBuffer(transferTokenAddress); + var targetPublicKeyHex = hexBuffer(targetPublicKey); + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + paths.length * 4 + 20 + 32 + 32 + 4 + 4 + 8 + 4 + 4, 0); + var offset = 0; + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + offset = 1 + 4 * paths.length; + if (transferTokenAddressHex) { + transferTokenAddressHex.copy(buffer, offset); + } + offset += 20; + Buffer.from(transferQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + offset += 32; + targetPublicKeyHex.copy(buffer, offset); + offset += 32; + buffer.writeUInt32BE(sourceVault, offset); + offset += 4; + buffer.writeUInt32BE(destinationVault, offset); + offset += 4; + Buffer.from(amountTransfer.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); + offset += 8; + buffer.writeUInt32BE(nonce, offset); + offset += 4; + buffer.writeUInt32BE(timestamp, offset); + return this.transport + .send(0xf0, 0x04, 0x02, 0x00, buffer) + .then(function (response) { + var r = response.slice(1, 1 + 32).toString("hex"); + var s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); + return { + r: r, + s: s + }; + }); + }; + /** + * sign a Stark transfer or conditional transfer using the Starkex V2 protocol + * @param path a path in BIP 32 format + * @option transferTokenAddress contract address of the token to be transferred (not present for ETH) + * @param transferQuantizationType quantization type used for the token to be transferred + * @option transferQuantization quantization used for the token to be transferred (not present for erc 721 or mintable erc 721) + * @option transferMintableBlobOrTokenId mintable blob (mintable erc 20 / mintable erc 721) or token id (erc 721) associated to the token to be transferred + * @param targetPublicKey target Stark public key + * @param sourceVault ID of the source vault + * @param destinationVault ID of the destination vault + * @param amountTransfer amount to transfer + * @param nonce transaction nonce + * @param timestamp transaction validity timestamp + * @option conditionalTransferAddress onchain address of the condition for a conditional transfer + * @option conditionalTransferFact fact associated to the condition for a conditional transfer + * @return the signature + */ + Eth.prototype.starkSignTransfer_v2 = function (path, transferTokenAddress, transferQuantizationType, transferQuantization, transferMintableBlobOrTokenId, targetPublicKey, sourceVault, destinationVault, amountTransfer, nonce, timestamp, conditionalTransferAddress, conditionalTransferFact) { + var transferTokenAddressHex = maybeHexBuffer(transferTokenAddress); + var targetPublicKeyHex = hexBuffer(targetPublicKey); + var conditionalTransferAddressHex = maybeHexBuffer(conditionalTransferAddress); + if (!(transferQuantizationType in starkQuantizationTypeMap)) { + throw new Error("eth.starkSignTransferv2 invalid quantization type=" + + transferQuantizationType); + } + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + + paths.length * 4 + + 1 + + 20 + + 32 + + 32 + + 32 + + 4 + + 4 + + 8 + + 4 + + 4 + + (conditionalTransferAddressHex ? 32 + 20 : 0), 0); + var offset = 0; + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + offset = 1 + 4 * paths.length; + buffer[offset] = starkQuantizationTypeMap[transferQuantizationType]; + offset++; + if (transferTokenAddressHex) { + transferTokenAddressHex.copy(buffer, offset); + } + offset += 20; + if (transferQuantization) { + Buffer.from(transferQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + } + offset += 32; + if (transferMintableBlobOrTokenId) { + Buffer.from(transferMintableBlobOrTokenId.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + } + offset += 32; + targetPublicKeyHex.copy(buffer, offset); + offset += 32; + buffer.writeUInt32BE(sourceVault, offset); + offset += 4; + buffer.writeUInt32BE(destinationVault, offset); + offset += 4; + Buffer.from(amountTransfer.toString(16).padStart(16, "0"), "hex").copy(buffer, offset); + offset += 8; + buffer.writeUInt32BE(nonce, offset); + offset += 4; + buffer.writeUInt32BE(timestamp, offset); + if (conditionalTransferAddressHex && conditionalTransferFact) { + offset += 4; + Buffer.from(conditionalTransferFact.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + offset += 32; + conditionalTransferAddressHex.copy(buffer, offset); + } + return this.transport + .send(0xf0, 0x04, conditionalTransferAddressHex ? 0x05 : 0x04, 0x00, buffer) + .then(function (response) { + var r = response.slice(1, 1 + 32).toString("hex"); + var s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); + return { + r: r, + s: s + }; + }); + }; + /** + * provide quantization information before singing a deposit or withdrawal Stark powered contract call + * + * It shall be run following a provideERC20TokenInformation call for the given contract + * + * @param operationContract contract address of the token to be transferred (not present for ETH) + * @param operationQuantization quantization used for the token to be transferred + */ + Eth.prototype.starkProvideQuantum = function (operationContract, operationQuantization) { + var operationContractHex = maybeHexBuffer(operationContract); + var buffer = Buffer.alloc(20 + 32, 0); + if (operationContractHex) { + operationContractHex.copy(buffer, 0); + } + Buffer.from(operationQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, 20); + return this.transport.send(0xf0, 0x08, 0x00, 0x00, buffer).then(function () { return true; }, function (e) { + if (e && e.statusCode === 0x6d00) { + // this case happen for ETH application versions not supporting Stark extensions + return false; + } + throw e; + }); + }; + /** + * provide quantization information before singing a deposit or withdrawal Stark powered contract call using the Starkex V2 protocol + * + * It shall be run following a provideERC20TokenInformation call for the given contract + * + * @param operationContract contract address of the token to be transferred (not present for ETH) + * @param operationQuantizationType quantization type of the token to be transferred + * @option operationQuantization quantization used for the token to be transferred (not present for erc 721 or mintable erc 721) + * @option operationMintableBlobOrTokenId mintable blob (mintable erc 20 / mintable erc 721) or token id (erc 721) of the token to be transferred + */ + Eth.prototype.starkProvideQuantum_v2 = function (operationContract, operationQuantizationType, operationQuantization, operationMintableBlobOrTokenId) { + var operationContractHex = maybeHexBuffer(operationContract); + if (!(operationQuantizationType in starkQuantizationTypeMap)) { + throw new Error("eth.starkProvideQuantumV2 invalid quantization type=" + + operationQuantizationType); + } + var buffer = Buffer.alloc(20 + 32 + 32, 0); + var offset = 0; + if (operationContractHex) { + operationContractHex.copy(buffer, offset); + } + offset += 20; + if (operationQuantization) { + Buffer.from(operationQuantization.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + } + offset += 32; + if (operationMintableBlobOrTokenId) { + Buffer.from(operationMintableBlobOrTokenId.toString(16).padStart(64, "0"), "hex").copy(buffer, offset); + } + return this.transport + .send(0xf0, 0x08, starkQuantizationTypeMap[operationQuantizationType], 0x00, buffer) + .then(function () { return true; }, function (e) { + if (e && e.statusCode === 0x6d00) { + // this case happen for ETH application versions not supporting Stark extensions + return false; + } + throw e; + }); + }; + /** + * sign the given hash over the Stark curve + * It is intended for speed of execution in case an unknown Stark model is pushed and should be avoided as much as possible. + * @param path a path in BIP 32 format + * @param hash hexadecimal hash to sign + * @return the signature + */ + Eth.prototype.starkUnsafeSign = function (path, hash) { + var hashHex = hexBuffer(hash); + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + paths.length * 4 + 32); + var offset = 0; + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + offset = 1 + 4 * paths.length; + hashHex.copy(buffer, offset); + return this.transport + .send(0xf0, 0x0a, 0x00, 0x00, buffer) + .then(function (response) { + var r = response.slice(1, 1 + 32).toString("hex"); + var s = response.slice(1 + 32, 1 + 32 + 32).toString("hex"); + return { + r: r, + s: s + }; + }); + }; + /** + * get an Ethereum 2 BLS-12 381 public key for a given BIP 32 path. + * @param path a path in BIP 32 format + * @option boolDisplay optionally enable or not the display + * @return an object with a publicKey + * @example + * eth.eth2GetPublicKey("12381/3600/0/0").then(o => o.publicKey) + */ + Eth.prototype.eth2GetPublicKey = function (path, boolDisplay) { + var paths = utils_1.splitPath(path); + var buffer = Buffer.alloc(1 + paths.length * 4); + buffer[0] = paths.length; + paths.forEach(function (element, index) { + buffer.writeUInt32BE(element, 1 + 4 * index); + }); + return this.transport + .send(0xe0, 0x0e, boolDisplay ? 0x01 : 0x00, 0x00, buffer) + .then(function (response) { + return { + publicKey: response.slice(0, -2).toString("hex") + }; + }); + }; + /** + * Set the index of a Withdrawal key used as withdrawal credentials in an ETH 2 deposit contract call signature + * + * It shall be run before the ETH 2 deposit transaction is signed. If not called, the index is set to 0 + * + * @param withdrawalIndex index path in the EIP 2334 path m/12381/3600/withdrawalIndex/0 + * @return True if the method was executed successfully + */ + Eth.prototype.eth2SetWithdrawalIndex = function (withdrawalIndex) { + var buffer = Buffer.alloc(4, 0); + buffer.writeUInt32BE(withdrawalIndex, 0); + return this.transport.send(0xe0, 0x10, 0x00, 0x00, buffer).then(function () { return true; }, function (e) { + if (e && e.statusCode === 0x6d00) { + // this case happen for ETH application versions not supporting ETH 2 + return false; + } + throw e; + }); + }; + /** + * Set the name of the plugin that should be used to parse the next transaction + * + * @param pluginName string containing the name of the plugin, must have length between 1 and 30 bytes + * @return True if the method was executed successfully + */ + Eth.prototype.setExternalPlugin = function (pluginName, contractAddress, selector) { + return setExternalPlugin(this.transport, pluginName, selector); + }; + return Eth; +}()); +exports["default"] = Eth; +// internal helpers +function provideERC20TokenInformation(transport, data) { + return transport.send(0xe0, 0x0a, 0x00, 0x00, data).then(function () { return true; }, function (e) { + if (e && e.statusCode === 0x6d00) { + // this case happen for older version of ETH app, since older app version had the ERC20 data hardcoded, it's fine to assume it worked. + // we return a flag to know if the call was effective or not + return false; + } + throw e; + }); +} +function setExternalPlugin(transport, payload, signature) { + var payloadBuffer = Buffer.from(payload, "hex"); + var signatureBuffer = Buffer.from(signature, "hex"); + var buffer = Buffer.concat([payloadBuffer, signatureBuffer]); + return transport.send(0xe0, 0x12, 0x00, 0x00, buffer).then(function () { return true; }, function (e) { + if (e && e.statusCode === 0x6a80) { + // this case happen when the plugin name is too short or too long + return false; + } + else if (e && e.statusCode === 0x6984) { + // this case happen when the plugin requested is not installed on the device + return false; + } + else if (e && e.statusCode === 0x6d00) { + // this case happen for older version of ETH app + return false; + } + throw e; + }); +} + +}).call(this,require("buffer").Buffer) +},{"./contracts":125,"./erc20":126,"./utils":127,"@ledgerhq/errors":129,"@ledgerhq/logs":130,"bignumber.js":168,"buffer":172,"ethers":192}],125:[function(require,module,exports){ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +exports.__esModule = true; +exports.loadInfosForContractMethod = void 0; +var axios_1 = __importDefault(require("axios")); +/** + * Retrieve the metadatas a given contract address and a method selector + */ +var loadInfosForContractMethod = function (contractAddress, selector) { return __awaiter(void 0, void 0, void 0, function () { + var data, lcSelector, lcContractAddress, contractSelectors; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, axios_1["default"] + .get("https://cdn.live.ledger.com/plugins/ethereum.json") + .then(function (r) { return r.data; })["catch"](function (e) { + if (e.response && 400 <= e.response.status && e.response.status < 500) { + return null; // not found cases can be ignored to allow future changes in endpoint without failing a signature to be done. + } + throw e; + })]; + case 1: + data = _a.sent(); + if (!data) + return [2 /*return*/]; + lcSelector = selector.toLowerCase(); + lcContractAddress = contractAddress.toLowerCase(); + if (lcContractAddress in data) { + contractSelectors = data[lcContractAddress]; + if (lcSelector in contractSelectors) { + return [2 /*return*/, { + payload: contractSelectors[lcSelector]["serialized_data"], + signature: contractSelectors[lcSelector]["signature"], + plugin: contractSelectors[lcSelector]["plugin"], + erc20OfInterest: contractSelectors[lcSelector]["erc20OfInterest"], + abi: contractSelectors["abi"] + }]; + } + } + return [2 /*return*/]; + } + }); +}); }; +exports.loadInfosForContractMethod = loadInfosForContractMethod; + +},{"axios":131}],126:[function(require,module,exports){ +(function (Buffer){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +exports.__esModule = true; +exports.list = exports.byContractAddressAndChainId = void 0; +var erc20_signatures_1 = __importDefault(require("@ledgerhq/cryptoassets/data/erc20-signatures")); +/** + * Retrieve the token information by a given contract address if any + */ +var byContractAddressAndChainId = function (contract, chainId) { + return get().byContractAndChainId(asContractAddress(contract), chainId); +}; +exports.byContractAddressAndChainId = byContractAddressAndChainId; +/** + * list all the ERC20 tokens informations + */ +var list = function () { return get().list(); }; +exports.list = list; +var asContractAddress = function (addr) { + var a = addr.toLowerCase(); + return a.startsWith("0x") ? a : "0x" + a; +}; +// this internal get() will lazy load and cache the data from the erc20 data blob +var get = (function () { + var cache; + return function () { + if (cache) + return cache; + var buf = Buffer.from(erc20_signatures_1["default"], "base64"); + var map = {}; + var entries = []; + var i = 0; + while (i < buf.length) { + var length_1 = buf.readUInt32BE(i); + i += 4; + var item = buf.slice(i, i + length_1); + var j = 0; + var tickerLength = item.readUInt8(j); + j += 1; + var ticker = item.slice(j, j + tickerLength).toString("ascii"); + j += tickerLength; + var contractAddress = asContractAddress(item.slice(j, j + 20).toString("hex")); + j += 20; + var decimals = item.readUInt32BE(j); + j += 4; + var chainId = item.readUInt32BE(j); + j += 4; + var signature = item.slice(j); + var entry = { + ticker: ticker, + contractAddress: contractAddress, + decimals: decimals, + chainId: chainId, + signature: signature, + data: item + }; + entries.push(entry); + map[String(chainId) + ":" + contractAddress] = entry; + i += length_1; + } + var api = { + list: function () { return entries; }, + byContractAndChainId: function (contractAddress, chainId) { + return map[String(chainId) + ":" + contractAddress]; + } + }; + cache = api; + return api; + }; +})(); + +}).call(this,require("buffer").Buffer) +},{"@ledgerhq/cryptoassets/data/erc20-signatures":122,"buffer":172}],127:[function(require,module,exports){ +"use strict"; +exports.__esModule = true; +exports.asyncWhile = exports.doIf = exports.foreach = exports.eachSeries = exports.splitPath = exports.defer = void 0; +function defer() { + var resolve, reject; + var promise = new Promise(function (success, failure) { + resolve = success; + reject = failure; + }); + if (!resolve || !reject) + throw "defer() error"; // this never happens and is just to make flow happy + return { + promise: promise, + resolve: resolve, + reject: reject + }; +} +exports.defer = defer; +// TODO use bip32-path library +function splitPath(path) { + var result = []; + var components = path.split("/"); + components.forEach(function (element) { + var number = parseInt(element, 10); + if (isNaN(number)) { + return; // FIXME shouldn't it throws instead? + } + if (element.length > 1 && element[element.length - 1] === "'") { + number += 0x80000000; + } + result.push(number); + }); + return result; +} +exports.splitPath = splitPath; +// TODO use async await +function eachSeries(arr, fun) { + return arr.reduce(function (p, e) { return p.then(function () { return fun(e); }); }, Promise.resolve()); +} +exports.eachSeries = eachSeries; +function foreach(arr, callback) { + function iterate(index, array, result) { + if (index >= array.length) { + return result; + } + else + return callback(array[index], index).then(function (res) { + result.push(res); + return iterate(index + 1, array, result); + }); + } + return Promise.resolve().then(function () { return iterate(0, arr, []); }); +} +exports.foreach = foreach; +function doIf(condition, callback) { + return Promise.resolve().then(function () { + if (condition) { + return callback(); + } + }); +} +exports.doIf = doIf; +function asyncWhile(predicate, callback) { + function iterate(result) { + if (!predicate()) { + return result; + } + else { + return callback().then(function (res) { + result.push(res); + return iterate(result); + }); + } + } + return Promise.resolve([]).then(iterate); +} +exports.asyncWhile = asyncWhile; + +},{}],128:[function(require,module,exports){ +"use strict"; +/* eslint-disable no-continue */ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-param-reassign */ +/* eslint-disable no-prototype-builtins */ +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +exports.__esModule = true; +exports.serializeError = exports.deserializeError = exports.createCustomErrorClass = exports.addCustomErrorDeserializer = void 0; +var errorClasses = {}; +var deserializers = {}; +var addCustomErrorDeserializer = function (name, deserializer) { + deserializers[name] = deserializer; +}; +exports.addCustomErrorDeserializer = addCustomErrorDeserializer; +var createCustomErrorClass = function (name) { + var C = function CustomError(message, fields) { + Object.assign(this, fields); + this.name = name; + this.message = message || name; + this.stack = new Error().stack; + }; + C.prototype = new Error(); + errorClasses[name] = C; + return C; +}; +exports.createCustomErrorClass = createCustomErrorClass; +// inspired from https://github.com/programble/errio/blob/master/index.js +var deserializeError = function (object) { + if (typeof object === "object" && object) { + try { + // $FlowFixMe FIXME HACK + var msg = JSON.parse(object.message); + if (msg.message && msg.name) { + object = msg; + } + } + catch (e) { + // nothing + } + var error = void 0; + if (typeof object.name === "string") { + var name_1 = object.name; + var des = deserializers[name_1]; + if (des) { + error = des(object); + } + else { + var constructor = name_1 === "Error" ? Error : errorClasses[name_1]; + if (!constructor) { + console.warn("deserializing an unknown class '" + name_1 + "'"); + constructor = exports.createCustomErrorClass(name_1); + } + error = Object.create(constructor.prototype); + try { + for (var prop in object) { + if (object.hasOwnProperty(prop)) { + error[prop] = object[prop]; + } + } + } + catch (e) { + // sometimes setting a property can fail (e.g. .name) + } + } + } + else { + error = new Error(object.message); + } + if (!error.stack && Error.captureStackTrace) { + Error.captureStackTrace(error, exports.deserializeError); + } + return error; + } + return new Error(String(object)); +}; +exports.deserializeError = deserializeError; +// inspired from https://github.com/sindresorhus/serialize-error/blob/master/index.js +var serializeError = function (value) { + if (!value) + return value; + if (typeof value === "object") { + return destroyCircular(value, []); + } + if (typeof value === "function") { + return "[Function: " + (value.name || "anonymous") + "]"; + } + return value; +}; +exports.serializeError = serializeError; +// https://www.npmjs.com/package/destroy-circular +function destroyCircular(from, seen) { + var e_1, _a; + var to = {}; + seen.push(from); + try { + for (var _b = __values(Object.keys(from)), _c = _b.next(); !_c.done; _c = _b.next()) { + var key = _c.value; + var value = from[key]; + if (typeof value === "function") { + continue; + } + if (!value || typeof value !== "object") { + to[key] = value; + continue; + } + if (seen.indexOf(from[key]) === -1) { + to[key] = destroyCircular(from[key], seen.slice(0)); + continue; + } + to[key] = "[Circular]"; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b["return"])) _a.call(_b); + } + finally { if (e_1) throw e_1.error; } + } + if (typeof from.name === "string") { + to.name = from.name; + } + if (typeof from.message === "string") { + to.message = from.message; + } + if (typeof from.stack === "string") { + to.stack = from.stack; + } + return to; +} + +},{}],129:[function(require,module,exports){ +"use strict"; +exports.__esModule = true; +exports.NotEnoughBalanceInParentAccount = exports.NotEnoughBalanceToDelegate = exports.NotEnoughBalance = exports.NoAddressesFound = exports.NetworkDown = exports.ManagerUninstallBTCDep = exports.ManagerNotEnoughSpaceError = exports.ManagerFirmwareNotEnoughSpaceError = exports.ManagerDeviceLockedError = exports.ManagerAppDepUninstallRequired = exports.ManagerAppDepInstallRequired = exports.ManagerAppRelyOnBTCError = exports.ManagerAppAlreadyInstalledError = exports.LedgerAPINotAvailable = exports.LedgerAPIErrorWithMessage = exports.LedgerAPIError = exports.UnknownMCU = exports.LatestMCUInstalledError = exports.InvalidAddressBecauseDestinationIsAlsoSource = exports.InvalidAddress = exports.InvalidXRPTag = exports.HardResetFail = exports.FirmwareNotRecognized = exports.FeeEstimationFailed = exports.EthAppPleaseEnableContractData = exports.EnpointConfigError = exports.DisconnectedDeviceDuringOperation = exports.DisconnectedDevice = exports.DeviceSocketNoBulkStatus = exports.DeviceSocketFail = exports.DeviceNameInvalid = exports.DeviceHalted = exports.DeviceInOSUExpected = exports.DeviceOnDashboardUnexpected = exports.DeviceOnDashboardExpected = exports.DeviceNotGenuineError = exports.DeviceGenuineSocketEarlyClose = exports.DeviceAppVerifyNotSupported = exports.CurrencyNotSupported = exports.CashAddrNotSupported = exports.CantOpenDevice = exports.BtcUnmatchedApp = exports.BluetoothRequired = exports.AmountRequired = exports.AccountNotSupported = exports.AccountNameRequiredError = exports.addCustomErrorDeserializer = exports.createCustomErrorClass = exports.deserializeError = exports.serializeError = void 0; +exports.StatusCodes = exports.TransportError = exports.DBNotReset = exports.DBWrongPassword = exports.NoDBPathGiven = exports.FirmwareOrAppUpdateRequired = exports.LedgerAPI5xx = exports.LedgerAPI4xx = exports.GenuineCheckFailed = exports.PairingFailed = exports.SyncError = exports.FeeTooHigh = exports.FeeRequired = exports.FeeNotLoaded = exports.CantScanQRCode = exports.ETHAddressNonEIP = exports.WrongAppForCurrency = exports.WrongDeviceForAccount = exports.WebsocketConnectionFailed = exports.WebsocketConnectionError = exports.DeviceShouldStayInApp = exports.TransportWebUSBGestureRequired = exports.TransportRaceCondition = exports.TransportInterfaceNotAvailable = exports.TransportOpenUserCancelled = exports.UserRefusedOnDevice = exports.UserRefusedAllowManager = exports.UserRefusedFirmwareUpdate = exports.UserRefusedAddress = exports.UserRefusedDeviceNameChange = exports.UpdateYourApp = exports.UpdateIncorrectSig = exports.UpdateIncorrectHash = exports.UpdateFetchFileFail = exports.UnavailableTezosOriginatedAccountSend = exports.UnavailableTezosOriginatedAccountReceive = exports.RecipientRequired = exports.MCUNotGenuineToDashboard = exports.UnexpectedBootloader = exports.TimeoutTagged = exports.RecommendUndelegation = exports.RecommendSubAccountsToEmpty = exports.PasswordIncorrectError = exports.PasswordsDontMatchError = exports.GasLessThanEstimate = exports.NotSupportedLegacyAddress = exports.NotEnoughGas = exports.NoAccessToCamera = exports.NotEnoughBalanceBecauseDestinationNotCreated = exports.NotEnoughSpendableBalance = void 0; +exports.TransportStatusError = exports.getAltStatusMessage = void 0; +var helpers_1 = require("./helpers"); +exports.serializeError = helpers_1.serializeError; +exports.deserializeError = helpers_1.deserializeError; +exports.createCustomErrorClass = helpers_1.createCustomErrorClass; +exports.addCustomErrorDeserializer = helpers_1.addCustomErrorDeserializer; +exports.AccountNameRequiredError = helpers_1.createCustomErrorClass("AccountNameRequired"); +exports.AccountNotSupported = helpers_1.createCustomErrorClass("AccountNotSupported"); +exports.AmountRequired = helpers_1.createCustomErrorClass("AmountRequired"); +exports.BluetoothRequired = helpers_1.createCustomErrorClass("BluetoothRequired"); +exports.BtcUnmatchedApp = helpers_1.createCustomErrorClass("BtcUnmatchedApp"); +exports.CantOpenDevice = helpers_1.createCustomErrorClass("CantOpenDevice"); +exports.CashAddrNotSupported = helpers_1.createCustomErrorClass("CashAddrNotSupported"); +exports.CurrencyNotSupported = helpers_1.createCustomErrorClass("CurrencyNotSupported"); +exports.DeviceAppVerifyNotSupported = helpers_1.createCustomErrorClass("DeviceAppVerifyNotSupported"); +exports.DeviceGenuineSocketEarlyClose = helpers_1.createCustomErrorClass("DeviceGenuineSocketEarlyClose"); +exports.DeviceNotGenuineError = helpers_1.createCustomErrorClass("DeviceNotGenuine"); +exports.DeviceOnDashboardExpected = helpers_1.createCustomErrorClass("DeviceOnDashboardExpected"); +exports.DeviceOnDashboardUnexpected = helpers_1.createCustomErrorClass("DeviceOnDashboardUnexpected"); +exports.DeviceInOSUExpected = helpers_1.createCustomErrorClass("DeviceInOSUExpected"); +exports.DeviceHalted = helpers_1.createCustomErrorClass("DeviceHalted"); +exports.DeviceNameInvalid = helpers_1.createCustomErrorClass("DeviceNameInvalid"); +exports.DeviceSocketFail = helpers_1.createCustomErrorClass("DeviceSocketFail"); +exports.DeviceSocketNoBulkStatus = helpers_1.createCustomErrorClass("DeviceSocketNoBulkStatus"); +exports.DisconnectedDevice = helpers_1.createCustomErrorClass("DisconnectedDevice"); +exports.DisconnectedDeviceDuringOperation = helpers_1.createCustomErrorClass("DisconnectedDeviceDuringOperation"); +exports.EnpointConfigError = helpers_1.createCustomErrorClass("EnpointConfig"); +exports.EthAppPleaseEnableContractData = helpers_1.createCustomErrorClass("EthAppPleaseEnableContractData"); +exports.FeeEstimationFailed = helpers_1.createCustomErrorClass("FeeEstimationFailed"); +exports.FirmwareNotRecognized = helpers_1.createCustomErrorClass("FirmwareNotRecognized"); +exports.HardResetFail = helpers_1.createCustomErrorClass("HardResetFail"); +exports.InvalidXRPTag = helpers_1.createCustomErrorClass("InvalidXRPTag"); +exports.InvalidAddress = helpers_1.createCustomErrorClass("InvalidAddress"); +exports.InvalidAddressBecauseDestinationIsAlsoSource = helpers_1.createCustomErrorClass("InvalidAddressBecauseDestinationIsAlsoSource"); +exports.LatestMCUInstalledError = helpers_1.createCustomErrorClass("LatestMCUInstalledError"); +exports.UnknownMCU = helpers_1.createCustomErrorClass("UnknownMCU"); +exports.LedgerAPIError = helpers_1.createCustomErrorClass("LedgerAPIError"); +exports.LedgerAPIErrorWithMessage = helpers_1.createCustomErrorClass("LedgerAPIErrorWithMessage"); +exports.LedgerAPINotAvailable = helpers_1.createCustomErrorClass("LedgerAPINotAvailable"); +exports.ManagerAppAlreadyInstalledError = helpers_1.createCustomErrorClass("ManagerAppAlreadyInstalled"); +exports.ManagerAppRelyOnBTCError = helpers_1.createCustomErrorClass("ManagerAppRelyOnBTC"); +exports.ManagerAppDepInstallRequired = helpers_1.createCustomErrorClass("ManagerAppDepInstallRequired"); +exports.ManagerAppDepUninstallRequired = helpers_1.createCustomErrorClass("ManagerAppDepUninstallRequired"); +exports.ManagerDeviceLockedError = helpers_1.createCustomErrorClass("ManagerDeviceLocked"); +exports.ManagerFirmwareNotEnoughSpaceError = helpers_1.createCustomErrorClass("ManagerFirmwareNotEnoughSpace"); +exports.ManagerNotEnoughSpaceError = helpers_1.createCustomErrorClass("ManagerNotEnoughSpace"); +exports.ManagerUninstallBTCDep = helpers_1.createCustomErrorClass("ManagerUninstallBTCDep"); +exports.NetworkDown = helpers_1.createCustomErrorClass("NetworkDown"); +exports.NoAddressesFound = helpers_1.createCustomErrorClass("NoAddressesFound"); +exports.NotEnoughBalance = helpers_1.createCustomErrorClass("NotEnoughBalance"); +exports.NotEnoughBalanceToDelegate = helpers_1.createCustomErrorClass("NotEnoughBalanceToDelegate"); +exports.NotEnoughBalanceInParentAccount = helpers_1.createCustomErrorClass("NotEnoughBalanceInParentAccount"); +exports.NotEnoughSpendableBalance = helpers_1.createCustomErrorClass("NotEnoughSpendableBalance"); +exports.NotEnoughBalanceBecauseDestinationNotCreated = helpers_1.createCustomErrorClass("NotEnoughBalanceBecauseDestinationNotCreated"); +exports.NoAccessToCamera = helpers_1.createCustomErrorClass("NoAccessToCamera"); +exports.NotEnoughGas = helpers_1.createCustomErrorClass("NotEnoughGas"); +exports.NotSupportedLegacyAddress = helpers_1.createCustomErrorClass("NotSupportedLegacyAddress"); +exports.GasLessThanEstimate = helpers_1.createCustomErrorClass("GasLessThanEstimate"); +exports.PasswordsDontMatchError = helpers_1.createCustomErrorClass("PasswordsDontMatch"); +exports.PasswordIncorrectError = helpers_1.createCustomErrorClass("PasswordIncorrect"); +exports.RecommendSubAccountsToEmpty = helpers_1.createCustomErrorClass("RecommendSubAccountsToEmpty"); +exports.RecommendUndelegation = helpers_1.createCustomErrorClass("RecommendUndelegation"); +exports.TimeoutTagged = helpers_1.createCustomErrorClass("TimeoutTagged"); +exports.UnexpectedBootloader = helpers_1.createCustomErrorClass("UnexpectedBootloader"); +exports.MCUNotGenuineToDashboard = helpers_1.createCustomErrorClass("MCUNotGenuineToDashboard"); +exports.RecipientRequired = helpers_1.createCustomErrorClass("RecipientRequired"); +exports.UnavailableTezosOriginatedAccountReceive = helpers_1.createCustomErrorClass("UnavailableTezosOriginatedAccountReceive"); +exports.UnavailableTezosOriginatedAccountSend = helpers_1.createCustomErrorClass("UnavailableTezosOriginatedAccountSend"); +exports.UpdateFetchFileFail = helpers_1.createCustomErrorClass("UpdateFetchFileFail"); +exports.UpdateIncorrectHash = helpers_1.createCustomErrorClass("UpdateIncorrectHash"); +exports.UpdateIncorrectSig = helpers_1.createCustomErrorClass("UpdateIncorrectSig"); +exports.UpdateYourApp = helpers_1.createCustomErrorClass("UpdateYourApp"); +exports.UserRefusedDeviceNameChange = helpers_1.createCustomErrorClass("UserRefusedDeviceNameChange"); +exports.UserRefusedAddress = helpers_1.createCustomErrorClass("UserRefusedAddress"); +exports.UserRefusedFirmwareUpdate = helpers_1.createCustomErrorClass("UserRefusedFirmwareUpdate"); +exports.UserRefusedAllowManager = helpers_1.createCustomErrorClass("UserRefusedAllowManager"); +exports.UserRefusedOnDevice = helpers_1.createCustomErrorClass("UserRefusedOnDevice"); // TODO rename because it's just for transaction refusal +exports.TransportOpenUserCancelled = helpers_1.createCustomErrorClass("TransportOpenUserCancelled"); +exports.TransportInterfaceNotAvailable = helpers_1.createCustomErrorClass("TransportInterfaceNotAvailable"); +exports.TransportRaceCondition = helpers_1.createCustomErrorClass("TransportRaceCondition"); +exports.TransportWebUSBGestureRequired = helpers_1.createCustomErrorClass("TransportWebUSBGestureRequired"); +exports.DeviceShouldStayInApp = helpers_1.createCustomErrorClass("DeviceShouldStayInApp"); +exports.WebsocketConnectionError = helpers_1.createCustomErrorClass("WebsocketConnectionError"); +exports.WebsocketConnectionFailed = helpers_1.createCustomErrorClass("WebsocketConnectionFailed"); +exports.WrongDeviceForAccount = helpers_1.createCustomErrorClass("WrongDeviceForAccount"); +exports.WrongAppForCurrency = helpers_1.createCustomErrorClass("WrongAppForCurrency"); +exports.ETHAddressNonEIP = helpers_1.createCustomErrorClass("ETHAddressNonEIP"); +exports.CantScanQRCode = helpers_1.createCustomErrorClass("CantScanQRCode"); +exports.FeeNotLoaded = helpers_1.createCustomErrorClass("FeeNotLoaded"); +exports.FeeRequired = helpers_1.createCustomErrorClass("FeeRequired"); +exports.FeeTooHigh = helpers_1.createCustomErrorClass("FeeTooHigh"); +exports.SyncError = helpers_1.createCustomErrorClass("SyncError"); +exports.PairingFailed = helpers_1.createCustomErrorClass("PairingFailed"); +exports.GenuineCheckFailed = helpers_1.createCustomErrorClass("GenuineCheckFailed"); +exports.LedgerAPI4xx = helpers_1.createCustomErrorClass("LedgerAPI4xx"); +exports.LedgerAPI5xx = helpers_1.createCustomErrorClass("LedgerAPI5xx"); +exports.FirmwareOrAppUpdateRequired = helpers_1.createCustomErrorClass("FirmwareOrAppUpdateRequired"); +// db stuff, no need to translate +exports.NoDBPathGiven = helpers_1.createCustomErrorClass("NoDBPathGiven"); +exports.DBWrongPassword = helpers_1.createCustomErrorClass("DBWrongPassword"); +exports.DBNotReset = helpers_1.createCustomErrorClass("DBNotReset"); +/** + * TransportError is used for any generic transport errors. + * e.g. Error thrown when data received by exchanges are incorrect or if exchanged failed to communicate with the device for various reason. + */ +function TransportError(message, id) { + this.name = "TransportError"; + this.message = message; + this.stack = new Error().stack; + this.id = id; +} +exports.TransportError = TransportError; +TransportError.prototype = new Error(); +helpers_1.addCustomErrorDeserializer("TransportError", function (e) { return new TransportError(e.message, e.id); }); +exports.StatusCodes = { + PIN_REMAINING_ATTEMPTS: 0x63c0, + INCORRECT_LENGTH: 0x6700, + MISSING_CRITICAL_PARAMETER: 0x6800, + COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 0x6981, + SECURITY_STATUS_NOT_SATISFIED: 0x6982, + CONDITIONS_OF_USE_NOT_SATISFIED: 0x6985, + INCORRECT_DATA: 0x6a80, + NOT_ENOUGH_MEMORY_SPACE: 0x6a84, + REFERENCED_DATA_NOT_FOUND: 0x6a88, + FILE_ALREADY_EXISTS: 0x6a89, + INCORRECT_P1_P2: 0x6b00, + INS_NOT_SUPPORTED: 0x6d00, + CLA_NOT_SUPPORTED: 0x6e00, + TECHNICAL_PROBLEM: 0x6f00, + OK: 0x9000, + MEMORY_PROBLEM: 0x9240, + NO_EF_SELECTED: 0x9400, + INVALID_OFFSET: 0x9402, + FILE_NOT_FOUND: 0x9404, + INCONSISTENT_FILE: 0x9408, + ALGORITHM_NOT_SUPPORTED: 0x9484, + INVALID_KCV: 0x9485, + CODE_NOT_INITIALIZED: 0x9802, + ACCESS_CONDITION_NOT_FULFILLED: 0x9804, + CONTRADICTION_SECRET_CODE_STATUS: 0x9808, + CONTRADICTION_INVALIDATION: 0x9810, + CODE_BLOCKED: 0x9840, + MAX_VALUE_REACHED: 0x9850, + GP_AUTH_FAILED: 0x6300, + LICENSING: 0x6f42, + HALTED: 0x6faa +}; +function getAltStatusMessage(code) { + switch (code) { + // improve text of most common errors + case 0x6700: + return "Incorrect length"; + case 0x6800: + return "Missing critical parameter"; + case 0x6982: + return "Security not satisfied (dongle locked or have invalid access rights)"; + case 0x6985: + return "Condition of use not satisfied (denied by the user?)"; + case 0x6a80: + return "Invalid data received"; + case 0x6b00: + return "Invalid parameter received"; + } + if (0x6f00 <= code && code <= 0x6fff) { + return "Internal error, please report"; + } +} +exports.getAltStatusMessage = getAltStatusMessage; +/** + * Error thrown when a device returned a non success status. + * the error.statusCode is one of the `StatusCodes` exported by this library. + */ +function TransportStatusError(statusCode) { + this.name = "TransportStatusError"; + var statusText = Object.keys(exports.StatusCodes).find(function (k) { return exports.StatusCodes[k] === statusCode; }) || + "UNKNOWN_ERROR"; + var smsg = getAltStatusMessage(statusCode) || statusText; + var statusCodeStr = statusCode.toString(16); + this.message = "Ledger device: " + smsg + " (0x" + statusCodeStr + ")"; + this.stack = new Error().stack; + this.statusCode = statusCode; + this.statusText = statusText; +} +exports.TransportStatusError = TransportStatusError; +TransportStatusError.prototype = new Error(); +helpers_1.addCustomErrorDeserializer("TransportStatusError", function (e) { return new TransportStatusError(e.statusCode); }); + +},{"./helpers":128}],130:[function(require,module,exports){ +"use strict"; +exports.__esModule = true; +exports.listen = exports.log = void 0; +var id = 0; +var subscribers = []; +/** + * log something + * @param type a namespaced identifier of the log (it is not a level like "debug", "error" but more like "apdu-in", "apdu-out", etc...) + * @param message a clear message of the log associated to the type + */ +var log = function (type, message, data) { + var obj = { + type: type, + id: String(++id), + date: new Date() + }; + if (message) + obj.message = message; + if (data) + obj.data = data; + dispatch(obj); +}; +exports.log = log; +/** + * listen to logs. + * @param cb that is called for each future log() with the Log object + * @return a function that can be called to unsubscribe the listener + */ +var listen = function (cb) { + subscribers.push(cb); + return function () { + var i = subscribers.indexOf(cb); + if (i !== -1) { + // equivalent of subscribers.splice(i, 1) // https://twitter.com/Rich_Harris/status/1125850391155965952 + subscribers[i] = subscribers[subscribers.length - 1]; + subscribers.pop(); + } + }; +}; +exports.listen = listen; +function dispatch(log) { + for (var i = 0; i < subscribers.length; i++) { + try { + subscribers[i](log); + } + catch (e) { + console.error(e); + } + } +} +if (typeof window !== "undefined") { + window.__ledgerLogsListen = exports.listen; +} + +},{}],131:[function(require,module,exports){ +module.exports = require('./lib/axios'); +},{"./lib/axios":133}],132:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); +var settle = require('./../core/settle'); +var cookies = require('./../helpers/cookies'); +var buildURL = require('./../helpers/buildURL'); +var buildFullPath = require('../core/buildFullPath'); +var parseHeaders = require('./../helpers/parseHeaders'); +var isURLSameOrigin = require('./../helpers/isURLSameOrigin'); +var createError = require('../core/createError'); + +module.exports = function xhrAdapter(config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = config.headers; + + if (utils.isFormData(requestData)) { + delete requestHeaders['Content-Type']; // Let the browser set it + } + + var request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); + } + + var fullPath = buildFullPath(config.baseURL, config.url); + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + // Listen for ready state + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + + // Prepare the response + var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; + var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; + + settle(resolve, reject, response); + + // Clean up request + request = null; + }; + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(createError('Request aborted', config, 'ECONNABORTED', request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(createError('Network Error', config, null, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (utils.isStandardBrowserEnv()) { + // Add xsrf header + var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? + cookies.read(config.xsrfCookieName) : + undefined; + + if (xsrfValue) { + requestHeaders[config.xsrfHeaderName] = xsrfValue; + } + } + + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders, function setRequestHeader(val, key) { + if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { + // Remove Content-Type if data is undefined + delete requestHeaders[key]; + } else { + // Otherwise add header to the request + request.setRequestHeader(key, val); + } + }); + } + + // Add withCredentials to request if needed + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (config.responseType) { + try { + request.responseType = config.responseType; + } catch (e) { + // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. + // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. + if (config.responseType !== 'json') { + throw e; + } + } + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', config.onDownloadProgress); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', config.onUploadProgress); + } + + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (!request) { + return; + } + + request.abort(); + reject(cancel); + // Clean up request + request = null; + }); + } + + if (!requestData) { + requestData = null; + } + + // Send the request + request.send(requestData); + }); +}; + +},{"../core/buildFullPath":139,"../core/createError":140,"./../core/settle":144,"./../helpers/buildURL":148,"./../helpers/cookies":150,"./../helpers/isURLSameOrigin":153,"./../helpers/parseHeaders":155,"./../utils":157}],133:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var bind = require('./helpers/bind'); +var Axios = require('./core/Axios'); +var mergeConfig = require('./core/mergeConfig'); +var defaults = require('./defaults'); + +/** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * @return {Axios} A new instance of Axios + */ +function createInstance(defaultConfig) { + var context = new Axios(defaultConfig); + var instance = bind(Axios.prototype.request, context); + + // Copy axios.prototype to instance + utils.extend(instance, Axios.prototype, context); + + // Copy context to instance + utils.extend(instance, context); + + return instance; +} + +// Create the default instance to be exported +var axios = createInstance(defaults); + +// Expose Axios class to allow class inheritance +axios.Axios = Axios; + +// Factory for creating new instances +axios.create = function create(instanceConfig) { + return createInstance(mergeConfig(axios.defaults, instanceConfig)); +}; + +// Expose Cancel & CancelToken +axios.Cancel = require('./cancel/Cancel'); +axios.CancelToken = require('./cancel/CancelToken'); +axios.isCancel = require('./cancel/isCancel'); + +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; +axios.spread = require('./helpers/spread'); + +// Expose isAxiosError +axios.isAxiosError = require('./helpers/isAxiosError'); + +module.exports = axios; + +// Allow use of default import syntax in TypeScript +module.exports.default = axios; + +},{"./cancel/Cancel":134,"./cancel/CancelToken":135,"./cancel/isCancel":136,"./core/Axios":137,"./core/mergeConfig":143,"./defaults":146,"./helpers/bind":147,"./helpers/isAxiosError":152,"./helpers/spread":156,"./utils":157}],134:[function(require,module,exports){ +'use strict'; + +/** + * A `Cancel` is an object that is thrown when an operation is canceled. + * + * @class + * @param {string=} message The message. + */ +function Cancel(message) { + this.message = message; +} + +Cancel.prototype.toString = function toString() { + return 'Cancel' + (this.message ? ': ' + this.message : ''); +}; + +Cancel.prototype.__CANCEL__ = true; + +module.exports = Cancel; + +},{}],135:[function(require,module,exports){ +'use strict'; + +var Cancel = require('./Cancel'); + +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @class + * @param {Function} executor The executor function. + */ +function CancelToken(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + var resolvePromise; + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + var token = this; + executor(function cancel(message) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new Cancel(message); + resolvePromise(token.reason); + }); +} + +/** + * Throws a `Cancel` if cancellation has been requested. + */ +CancelToken.prototype.throwIfRequested = function throwIfRequested() { + if (this.reason) { + throw this.reason; + } +}; + +/** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ +CancelToken.source = function source() { + var cancel; + var token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token: token, + cancel: cancel + }; +}; + +module.exports = CancelToken; + +},{"./Cancel":134}],136:[function(require,module,exports){ +'use strict'; + +module.exports = function isCancel(value) { + return !!(value && value.__CANCEL__); +}; + +},{}],137:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); +var buildURL = require('../helpers/buildURL'); +var InterceptorManager = require('./InterceptorManager'); +var dispatchRequest = require('./dispatchRequest'); +var mergeConfig = require('./mergeConfig'); + +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + */ +function Axios(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + }; +} + +/** + * Dispatch a request + * + * @param {Object} config The config specific for this request (merged with this.defaults) + */ +Axios.prototype.request = function request(config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof config === 'string') { + config = arguments[1] || {}; + config.url = arguments[0]; + } else { + config = config || {}; + } + + config = mergeConfig(this.defaults, config); + + // Set config.method + if (config.method) { + config.method = config.method.toLowerCase(); + } else if (this.defaults.method) { + config.method = this.defaults.method.toLowerCase(); + } else { + config.method = 'get'; + } + + // Hook up interceptors middleware + var chain = [dispatchRequest, undefined]; + var promise = Promise.resolve(config); + + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + chain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + chain.push(interceptor.fulfilled, interceptor.rejected); + }); + + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()); + } + + return promise; +}; + +Axios.prototype.getUri = function getUri(config) { + config = mergeConfig(this.defaults, config); + return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); +}; + +// Provide aliases for supported request methods +utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: (config || {}).data + })); + }; +}); + +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, data, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: data + })); + }; +}); + +module.exports = Axios; + +},{"../helpers/buildURL":148,"./../utils":157,"./InterceptorManager":138,"./dispatchRequest":141,"./mergeConfig":143}],138:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); + +function InterceptorManager() { + this.handlers = []; +} + +/** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ +InterceptorManager.prototype.use = function use(fulfilled, rejected) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected + }); + return this.handlers.length - 1; +}; + +/** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ +InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } +}; + +/** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ +InterceptorManager.prototype.forEach = function forEach(fn) { + utils.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); +}; + +module.exports = InterceptorManager; + +},{"./../utils":157}],139:[function(require,module,exports){ +'use strict'; + +var isAbsoluteURL = require('../helpers/isAbsoluteURL'); +var combineURLs = require('../helpers/combineURLs'); + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path + */ +module.exports = function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; +}; + +},{"../helpers/combineURLs":149,"../helpers/isAbsoluteURL":151}],140:[function(require,module,exports){ +'use strict'; + +var enhanceError = require('./enhanceError'); + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. + */ +module.exports = function createError(message, config, code, request, response) { + var error = new Error(message); + return enhanceError(error, config, code, request, response); +}; + +},{"./enhanceError":142}],141:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); +var transformData = require('./transformData'); +var isCancel = require('../cancel/isCancel'); +var defaults = require('../defaults'); + +/** + * Throws a `Cancel` if cancellation has been requested. + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } +} + +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * @returns {Promise} The Promise to be fulfilled + */ +module.exports = function dispatchRequest(config) { + throwIfCancellationRequested(config); + + // Ensure headers exist + config.headers = config.headers || {}; + + // Transform request data + config.data = transformData( + config.data, + config.headers, + config.transformRequest + ); + + // Flatten headers + config.headers = utils.merge( + config.headers.common || {}, + config.headers[config.method] || {}, + config.headers + ); + + utils.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + function cleanHeaderConfig(method) { + delete config.headers[method]; + } + ); + + var adapter = config.adapter || defaults.adapter; + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData( + response.data, + response.headers, + config.transformResponse + ); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData( + reason.response.data, + reason.response.headers, + config.transformResponse + ); + } + } + + return Promise.reject(reason); + }); +}; + +},{"../cancel/isCancel":136,"../defaults":146,"./../utils":157,"./transformData":145}],142:[function(require,module,exports){ +'use strict'; + +/** + * Update an Error with the specified config, error code, and response. + * + * @param {Error} error The error to update. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The error. + */ +module.exports = function enhanceError(error, config, code, request, response) { + error.config = config; + if (code) { + error.code = code; + } + + error.request = request; + error.response = response; + error.isAxiosError = true; + + error.toJSON = function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code + }; + }; + return error; +}; + +},{}],143:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); + +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * @returns {Object} New object resulting from merging config2 to config1 + */ +module.exports = function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + var config = {}; + + var valueFromConfig2Keys = ['url', 'method', 'data']; + var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params']; + var defaultToConfig2Keys = [ + 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer', + 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', + 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress', + 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent', + 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding' + ]; + var directMergeKeys = ['validateStatus']; + + function getMergedValue(target, source) { + if (utils.isPlainObject(target) && utils.isPlainObject(source)) { + return utils.merge(target, source); + } else if (utils.isPlainObject(source)) { + return utils.merge({}, source); + } else if (utils.isArray(source)) { + return source.slice(); + } + return source; + } + + function mergeDeepProperties(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(config1[prop], config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + } + + utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(undefined, config2[prop]); + } + }); + + utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties); + + utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(undefined, config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + }); + + utils.forEach(directMergeKeys, function merge(prop) { + if (prop in config2) { + config[prop] = getMergedValue(config1[prop], config2[prop]); + } else if (prop in config1) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + }); + + var axiosKeys = valueFromConfig2Keys + .concat(mergeDeepPropertiesKeys) + .concat(defaultToConfig2Keys) + .concat(directMergeKeys); + + var otherKeys = Object + .keys(config1) + .concat(Object.keys(config2)) + .filter(function filterAxiosKeys(key) { + return axiosKeys.indexOf(key) === -1; + }); + + utils.forEach(otherKeys, mergeDeepProperties); + + return config; +}; + +},{"../utils":157}],144:[function(require,module,exports){ +'use strict'; + +var createError = require('./createError'); + +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + */ +module.exports = function settle(resolve, reject, response) { + var validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(createError( + 'Request failed with status code ' + response.status, + response.config, + null, + response.request, + response + )); + } +}; + +},{"./createError":140}],145:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); + +/** + * Transform the data for a request or a response + * + * @param {Object|String} data The data to be transformed + * @param {Array} headers The headers for the request or response + * @param {Array|Function} fns A single function or Array of functions + * @returns {*} The resulting transformed data + */ +module.exports = function transformData(data, headers, fns) { + /*eslint no-param-reassign:0*/ + utils.forEach(fns, function transform(fn) { + data = fn(data, headers); + }); + + return data; +}; + +},{"./../utils":157}],146:[function(require,module,exports){ +(function (process){ +'use strict'; + +var utils = require('./utils'); +var normalizeHeaderName = require('./helpers/normalizeHeaderName'); + +var DEFAULT_CONTENT_TYPE = { + 'Content-Type': 'application/x-www-form-urlencoded' +}; + +function setContentTypeIfUnset(headers, value) { + if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { + headers['Content-Type'] = value; + } +} + +function getDefaultAdapter() { + var adapter; + if (typeof XMLHttpRequest !== 'undefined') { + // For browsers use XHR adapter + adapter = require('./adapters/xhr'); + } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { + // For node use HTTP adapter + adapter = require('./adapters/http'); + } + return adapter; +} + +var defaults = { + adapter: getDefaultAdapter(), + + transformRequest: [function transformRequest(data, headers) { + normalizeHeaderName(headers, 'Accept'); + normalizeHeaderName(headers, 'Content-Type'); + if (utils.isFormData(data) || + utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); + return data.toString(); + } + if (utils.isObject(data)) { + setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); + return JSON.stringify(data); + } + return data; + }], + + transformResponse: [function transformResponse(data) { + /*eslint no-param-reassign:0*/ + if (typeof data === 'string') { + try { + data = JSON.parse(data); + } catch (e) { /* Ignore */ } + } + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + } +}; + +defaults.headers = { + common: { + 'Accept': 'application/json, text/plain, */*' + } +}; + +utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { + defaults.headers[method] = {}; +}); + +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); +}); + +module.exports = defaults; + +}).call(this,require('_process')) +},{"./adapters/http":132,"./adapters/xhr":132,"./helpers/normalizeHeaderName":154,"./utils":157,"_process":213}],147:[function(require,module,exports){ +'use strict'; + +module.exports = function bind(fn, thisArg) { + return function wrap() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + return fn.apply(thisArg, args); + }; +}; + +},{}],148:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); + +function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ +module.exports = function buildURL(url, params, paramsSerializer) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + var serializedParams; + if (paramsSerializer) { + serializedParams = paramsSerializer(params); + } else if (utils.isURLSearchParams(params)) { + serializedParams = params.toString(); + } else { + var parts = []; + + utils.forEach(params, function serialize(val, key) { + if (val === null || typeof val === 'undefined') { + return; + } + + if (utils.isArray(val)) { + key = key + '[]'; + } else { + val = [val]; + } + + utils.forEach(val, function parseValue(v) { + if (utils.isDate(v)) { + v = v.toISOString(); + } else if (utils.isObject(v)) { + v = JSON.stringify(v); + } + parts.push(encode(key) + '=' + encode(v)); + }); + }); + + serializedParams = parts.join('&'); + } + + if (serializedParams) { + var hashmarkIndex = url.indexOf('#'); + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; +}; + +},{"./../utils":157}],149:[function(require,module,exports){ +'use strict'; + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL + */ +module.exports = function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +}; + +},{}],150:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); + +module.exports = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + var cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); + + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } + + if (utils.isString(path)) { + cookie.push('path=' + path); + } + + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } + + if (secure === true) { + cookie.push('secure'); + } + + document.cookie = cookie.join('; '); + }, + + read: function read(name) { + var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); + } + }; + })() : + + // Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })() +); + +},{"./../utils":157}],151:[function(require,module,exports){ +'use strict'; + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +module.exports = function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); +}; + +},{}],152:[function(require,module,exports){ +'use strict'; + +/** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ +module.exports = function isAxiosError(payload) { + return (typeof payload === 'object') && (payload.isAxiosError === true); +}; + +},{}],153:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); + +module.exports = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs have full support of the APIs needed to test + // whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + var msie = /(msie|trident)/i.test(navigator.userAgent); + var urlParsingNode = document.createElement('a'); + var originURL; + + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + var href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })() +); + +},{"./../utils":157}],154:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); + +module.exports = function normalizeHeaderName(headers, normalizedName) { + utils.forEach(headers, function processHeader(value, name) { + if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { + headers[normalizedName] = value; + delete headers[name]; + } + }); +}; + +},{"../utils":157}],155:[function(require,module,exports){ +'use strict'; + +var utils = require('./../utils'); + +// Headers whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +var ignoreDuplicateOf = [ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]; + +/** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} headers Headers needing to be parsed + * @returns {Object} Headers parsed into an object + */ +module.exports = function parseHeaders(headers) { + var parsed = {}; + var key; + var val; + var i; + + if (!headers) { return parsed; } + + utils.forEach(headers.split('\n'), function parser(line) { + i = line.indexOf(':'); + key = utils.trim(line.substr(0, i)).toLowerCase(); + val = utils.trim(line.substr(i + 1)); + + if (key) { + if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { + return; + } + if (key === 'set-cookie') { + parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + }); + + return parsed; +}; + +},{"./../utils":157}],156:[function(require,module,exports){ +'use strict'; + +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * @returns {Function} + */ +module.exports = function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +}; + +},{}],157:[function(require,module,exports){ +'use strict'; + +var bind = require('./helpers/bind'); + +/*global toString:true*/ + +// utils is a library of generic helper functions non-specific to axios + +var toString = Object.prototype.toString; + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ +function isArray(val) { + return toString.call(val) === '[object Array]'; +} + +/** + * Determine if a value is undefined + * + * @param {Object} val The value to test + * @returns {boolean} True if the value is undefined, otherwise false + */ +function isUndefined(val) { + return typeof val === 'undefined'; +} + +/** + * Determine if a value is a Buffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); +} + +/** + * Determine if a value is an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +function isArrayBuffer(val) { + return toString.call(val) === '[object ArrayBuffer]'; +} + +/** + * Determine if a value is a FormData + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an FormData, otherwise false + */ +function isFormData(val) { + return (typeof FormData !== 'undefined') && (val instanceof FormData); +} + +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + var result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); + } + return result; +} + +/** + * Determine if a value is a String + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a String, otherwise false + */ +function isString(val) { + return typeof val === 'string'; +} + +/** + * Determine if a value is a Number + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Number, otherwise false + */ +function isNumber(val) { + return typeof val === 'number'; +} + +/** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ +function isObject(val) { + return val !== null && typeof val === 'object'; +} + +/** + * Determine if a value is a plain Object + * + * @param {Object} val The value to test + * @return {boolean} True if value is a plain Object, otherwise false + */ +function isPlainObject(val) { + if (toString.call(val) !== '[object Object]') { + return false; + } + + var prototype = Object.getPrototypeOf(val); + return prototype === null || prototype === Object.prototype; +} + +/** + * Determine if a value is a Date + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ +function isDate(val) { + return toString.call(val) === '[object Date]'; +} + +/** + * Determine if a value is a File + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a File, otherwise false + */ +function isFile(val) { + return toString.call(val) === '[object File]'; +} + +/** + * Determine if a value is a Blob + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Blob, otherwise false + */ +function isBlob(val) { + return toString.call(val) === '[object Blob]'; +} + +/** + * Determine if a value is a Function + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +function isFunction(val) { + return toString.call(val) === '[object Function]'; +} + +/** + * Determine if a value is a Stream + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Stream, otherwise false + */ +function isStream(val) { + return isObject(val) && isFunction(val.pipe); +} + +/** + * Determine if a value is a URLSearchParams object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +function isURLSearchParams(val) { + return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; +} + +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * @returns {String} The String freed of excess whitespace + */ +function trim(str) { + return str.replace(/^\s*/, '').replace(/\s*$/, ''); +} + +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + */ +function isStandardBrowserEnv() { + if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || + navigator.product === 'NativeScript' || + navigator.product === 'NS')) { + return false; + } + return ( + typeof window !== 'undefined' && + typeof document !== 'undefined' + ); +} + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ +function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } +} + +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (isPlainObject(result[key]) && isPlainObject(val)) { + result[key] = merge(result[key], val); + } else if (isPlainObject(val)) { + result[key] = merge({}, val); + } else if (isArray(val)) { + result[key] = val.slice(); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * @return {Object} The resulting value of object a + */ +function extend(a, b, thisArg) { + forEach(b, function assignValue(val, key) { + if (thisArg && typeof val === 'function') { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }); + return a; +} + +/** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * @return {string} content value without BOM + */ +function stripBOM(content) { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +} + +module.exports = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isObject: isObject, + isPlainObject: isPlainObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isStandardBrowserEnv: isStandardBrowserEnv, + forEach: forEach, + merge: merge, + extend: extend, + trim: trim, + stripBOM: stripBOM +}; + +},{"./helpers/bind":147}],158:[function(require,module,exports){ +(function (global,Buffer){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _hwTransport = _interopRequireDefault(require("@ledgerhq/hw-transport")); + +var _errors = require("@ledgerhq/errors"); + +var _logs = require("@ledgerhq/logs"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const WebSocket = global.WebSocket || require("ws"); +/** + * WebSocket transport implementation + */ + + +class WebSocketTransport extends _hwTransport.default { + // this transport is not discoverable + static async open(url) { + const exchangeMethods = await new Promise((resolve, reject) => { + try { + const socket = new WebSocket(url); + const exchangeMethods = { + resolveExchange: _b => {}, + rejectExchange: _e => {}, + onDisconnect: () => {}, + close: () => socket.close(), + send: msg => socket.send(msg) + }; + + socket.onopen = () => { + socket.send("open"); + }; + + socket.onerror = e => { + exchangeMethods.onDisconnect(); + reject(e); + }; + + socket.onclose = () => { + exchangeMethods.onDisconnect(); + reject(new _errors.TransportError("OpenFailed", "OpenFailed")); + }; + + socket.onmessage = e => { + if (typeof e.data !== "string") return; + const data = JSON.parse(e.data); + + switch (data.type) { + case "opened": + return resolve(exchangeMethods); + + case "error": + reject(new Error(data.error)); + return exchangeMethods.rejectExchange(new _errors.TransportError(data.error, "WSError")); + + case "response": + return exchangeMethods.resolveExchange(Buffer.from(data.data, "hex")); + } + }; + } catch (e) { + reject(e); + } + }); + return new WebSocketTransport(exchangeMethods); + } + + constructor(hook) { + super(); + this.hook = void 0; + this.hook = hook; + + hook.onDisconnect = () => { + this.emit("disconnect"); + this.hook.rejectExchange(new _errors.TransportError("WebSocket disconnected", "WSDisconnect")); + }; + } + + async exchange(apdu) { + const hex = apdu.toString("hex"); + (0, _logs.log)("apdu", "=> " + hex); + const res = await new Promise((resolve, reject) => { + this.hook.rejectExchange = e => reject(e); + + this.hook.resolveExchange = b => resolve(b); + + this.hook.send(hex); + }); + (0, _logs.log)("apdu", "<= " + res.toString("hex")); + return res; + } + + setScrambleKey() {} + + async close() { + this.hook.close(); + return new Promise(success => { + setTimeout(success, 200); + }); + } + +} + +exports.default = WebSocketTransport; + +WebSocketTransport.isSupported = () => Promise.resolve(typeof WebSocket === "function"); + +WebSocketTransport.list = () => Promise.resolve([]); + +WebSocketTransport.listen = _observer => ({ + unsubscribe: () => {} +}); + +WebSocketTransport.check = async (url, timeout = 5000) => new Promise((resolve, reject) => { + const socket = new WebSocket(url); + let success = false; + setTimeout(() => { + socket.close(); + }, timeout); + + socket.onopen = () => { + success = true; + socket.close(); + }; + + socket.onclose = () => { + if (success) resolve();else { + reject(new _errors.TransportError("failed to access WebSocketTransport(" + url + ")", "WebSocketTransportNotAccessible")); + } + }; + + socket.onerror = () => { + reject(new _errors.TransportError("failed to access WebSocketTransport(" + url + "): error", "WebSocketTransportNotAccessible")); + }; +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) +},{"@ledgerhq/errors":159,"@ledgerhq/hw-transport":160,"@ledgerhq/logs":161,"buffer":172,"ws":219}],159:[function(require,module,exports){ +arguments[4][123][0].apply(exports,arguments) +},{"dup":123}],160:[function(require,module,exports){ +(function (Buffer){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "TransportError", { + enumerable: true, + get: function () { + return _errors.TransportError; + } +}); +Object.defineProperty(exports, "StatusCodes", { + enumerable: true, + get: function () { + return _errors.StatusCodes; + } +}); +Object.defineProperty(exports, "getAltStatusMessage", { + enumerable: true, + get: function () { + return _errors.getAltStatusMessage; + } +}); +Object.defineProperty(exports, "TransportStatusError", { + enumerable: true, + get: function () { + return _errors.TransportStatusError; + } +}); +exports.default = void 0; + +var _events = _interopRequireDefault(require("events")); + +var _errors = require("@ledgerhq/errors"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Transport defines the generic interface to share between node/u2f impl + * A **Descriptor** is a parametric type that is up to be determined for the implementation. + * it can be for instance an ID, an file path, a URL,... + */ +class Transport { + constructor() { + this.exchangeTimeout = 30000; + this.unresponsiveTimeout = 15000; + this.deviceModel = null; + this._events = new _events.default(); + + this.send = async (cla, ins, p1, p2, data = Buffer.alloc(0), statusList = [_errors.StatusCodes.OK]) => { + if (data.length >= 256) { + throw new _errors.TransportError("data.length exceed 256 bytes limit. Got: " + data.length, "DataLengthTooBig"); + } + + const response = await this.exchange(Buffer.concat([Buffer.from([cla, ins, p1, p2]), Buffer.from([data.length]), data])); + const sw = response.readUInt16BE(response.length - 2); + + if (!statusList.some(s => s === sw)) { + throw new _errors.TransportStatusError(sw); + } + + return response; + }; + + this.exchangeBusyPromise = void 0; + + this.exchangeAtomicImpl = async f => { + if (this.exchangeBusyPromise) { + throw new _errors.TransportRaceCondition("An action was already pending on the Ledger device. Please deny or reconnect."); + } + + let resolveBusy; + const busyPromise = new Promise(r => { + resolveBusy = r; + }); + this.exchangeBusyPromise = busyPromise; + let unresponsiveReached = false; + const timeout = setTimeout(() => { + unresponsiveReached = true; + this.emit("unresponsive"); + }, this.unresponsiveTimeout); + + try { + const res = await f(); + + if (unresponsiveReached) { + this.emit("responsive"); + } + + return res; + } finally { + clearTimeout(timeout); + if (resolveBusy) resolveBusy(); + this.exchangeBusyPromise = null; + } + }; + + this._appAPIlock = null; + } + + /** + * low level api to communicate with the device + * This method is for implementations to implement but should not be directly called. + * Instead, the recommanded way is to use send() method + * @param apdu the data to send + * @return a Promise of response data + */ + exchange(_apdu) { + throw new Error("exchange not implemented"); + } + /** + * set the "scramble key" for the next exchanges with the device. + * Each App can have a different scramble key and they internally will set it at instanciation. + * @param key the scramble key + */ + + + setScrambleKey(_key) {} + /** + * close the exchange with the device. + * @return a Promise that ends when the transport is closed. + */ + + + close() { + return Promise.resolve(); + } + + /** + * Listen to an event on an instance of transport. + * Transport implementation can have specific events. Here is the common events: + * * `"disconnect"` : triggered if Transport is disconnected + */ + on(eventName, cb) { + this._events.on(eventName, cb); + } + /** + * Stop listening to an event on an instance of transport. + */ + + + off(eventName, cb) { + this._events.removeListener(eventName, cb); + } + + emit(event, ...args) { + this._events.emit(event, ...args); + } + /** + * Enable or not logs of the binary exchange + */ + + + setDebugMode() { + console.warn("setDebugMode is deprecated. use @ledgerhq/logs instead. No logs are emitted in this anymore."); + } + /** + * Set a timeout (in milliseconds) for the exchange call. Only some transport might implement it. (e.g. U2F) + */ + + + setExchangeTimeout(exchangeTimeout) { + this.exchangeTimeout = exchangeTimeout; + } + /** + * Define the delay before emitting "unresponsive" on an exchange that does not respond + */ + + + setExchangeUnresponsiveTimeout(unresponsiveTimeout) { + this.unresponsiveTimeout = unresponsiveTimeout; + } + /** + * wrapper on top of exchange to simplify work of the implementation. + * @param cla + * @param ins + * @param p1 + * @param p2 + * @param data + * @param statusList is a list of accepted status code (shorts). [0x9000] by default + * @return a Promise of response buffer + */ + + + /** + * create() allows to open the first descriptor available or + * throw if there is none or if timeout is reached. + * This is a light helper, alternative to using listen() and open() (that you may need for any more advanced usecase) + * @example + TransportFoo.create().then(transport => ...) + */ + static create(openTimeout = 3000, listenTimeout) { + return new Promise((resolve, reject) => { + let found = false; + const sub = this.listen({ + next: e => { + found = true; + if (sub) sub.unsubscribe(); + if (listenTimeoutId) clearTimeout(listenTimeoutId); + this.open(e.descriptor, openTimeout).then(resolve, reject); + }, + error: e => { + if (listenTimeoutId) clearTimeout(listenTimeoutId); + reject(e); + }, + complete: () => { + if (listenTimeoutId) clearTimeout(listenTimeoutId); + + if (!found) { + reject(new _errors.TransportError(this.ErrorMessage_NoDeviceFound, "NoDeviceFound")); + } + } + }); + const listenTimeoutId = listenTimeout ? setTimeout(() => { + sub.unsubscribe(); + reject(new _errors.TransportError(this.ErrorMessage_ListenTimeout, "ListenTimeout")); + }, listenTimeout) : null; + }); + } + + decorateAppAPIMethods(self, methods, scrambleKey) { + for (let methodName of methods) { + self[methodName] = this.decorateAppAPIMethod(methodName, self[methodName], self, scrambleKey); + } + } + + decorateAppAPIMethod(methodName, f, ctx, scrambleKey) { + return async (...args) => { + const { + _appAPIlock + } = this; + + if (_appAPIlock) { + return Promise.reject(new _errors.TransportError("Ledger Device is busy (lock " + _appAPIlock + ")", "TransportLocked")); + } + + try { + this._appAPIlock = methodName; + this.setScrambleKey(scrambleKey); + return await f.apply(ctx, args); + } finally { + this._appAPIlock = null; + } + }; + } + +} + +exports.default = Transport; +Transport.isSupported = void 0; +Transport.list = void 0; +Transport.listen = void 0; +Transport.open = void 0; +Transport.ErrorMessage_ListenTimeout = "No Ledger device found (timeout)"; +Transport.ErrorMessage_NoDeviceFound = "No Ledger device found"; + +}).call(this,require("buffer").Buffer) +},{"@ledgerhq/errors":159,"buffer":172,"events":194}],161:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.listen = exports.log = void 0; + +/** + * A Log object + */ +let id = 0; +const subscribers = []; +/** + * log something + * @param type a namespaced identifier of the log (it is not a level like "debug", "error" but more like "apdu-in", "apdu-out", etc...) + * @param message a clear message of the log associated to the type + */ + +const log = (type, message, data) => { + const obj = { + type, + id: String(++id), + date: new Date() + }; + if (message) obj.message = message; + if (data) obj.data = data; + dispatch(obj); +}; +/** + * listen to logs. + * @param cb that is called for each future log() with the Log object + * @return a function that can be called to unsubscribe the listener + */ + + +exports.log = log; + +const listen = cb => { + subscribers.push(cb); + return () => { + const i = subscribers.indexOf(cb); + + if (i !== -1) { + // equivalent of subscribers.splice(i, 1) // https://twitter.com/Rich_Harris/status/1125850391155965952 + subscribers[i] = subscribers[subscribers.length - 1]; + subscribers.pop(); + } + }; +}; + +exports.listen = listen; + +function dispatch(log) { + for (let i = 0; i < subscribers.length; i++) { + try { + subscribers[i](log); + } catch (e) { + console.error(e); + } + } +} // for debug purpose + + +if (typeof window !== "undefined") { + window.__ledgerLogsListen = listen; +} + +},{}],162:[function(require,module,exports){ +(function (Buffer){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _u2fApi = require("u2f-api"); + +var _hwTransport = _interopRequireDefault(require("@ledgerhq/hw-transport")); + +var _logs = require("@ledgerhq/logs"); + +var _errors = require("@ledgerhq/errors"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function wrapU2FTransportError(originalError, message, id) { + const err = new _errors.TransportError(message, id); // $FlowFixMe + + err.originalError = originalError; + return err; +} + +function wrapApdu(apdu, key) { + const result = Buffer.alloc(apdu.length); + + for (let i = 0; i < apdu.length; i++) { + result[i] = apdu[i] ^ key[i % key.length]; + } + + return result; +} // Convert from normal to web-safe, strip trailing "="s + + +const webSafe64 = base64 => base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); // Convert from web-safe to normal, add trailing "="s + + +const normal64 = base64 => base64.replace(/-/g, "+").replace(/_/g, "/") + "==".substring(0, 3 * base64.length % 4); + +function attemptExchange(apdu, timeoutMillis, scrambleKey, unwrap) { + const keyHandle = wrapApdu(apdu, scrambleKey); + const challenge = Buffer.from("0000000000000000000000000000000000000000000000000000000000000000", "hex"); + const signRequest = { + version: "U2F_V2", + keyHandle: webSafe64(keyHandle.toString("base64")), + challenge: webSafe64(challenge.toString("base64")), + appId: location.origin + }; + (0, _logs.log)("apdu", "=> " + apdu.toString("hex")); + return (0, _u2fApi.sign)(signRequest, timeoutMillis / 1000).then(response => { + const { + signatureData + } = response; + + if (typeof signatureData === "string") { + const data = Buffer.from(normal64(signatureData), "base64"); + let result; + + if (!unwrap) { + result = data; + } else { + result = data.slice(5); + } + + (0, _logs.log)("apdu", "<= " + result.toString("hex")); + return result; + } else { + throw response; + } + }); +} + +let transportInstances = []; + +function emitDisconnect() { + transportInstances.forEach(t => t.emit("disconnect")); + transportInstances = []; +} + +function isTimeoutU2FError(u2fError) { + return u2fError.metaData.code === 5; +} +/** + * U2F web Transport implementation + * @example + * import TransportU2F from "@ledgerhq/hw-transport-u2f"; + * ... + * TransportU2F.create().then(transport => ...) + */ + + +class TransportU2F extends _hwTransport.default { + /* + */ + + /* + */ + + /** + * static function to create a new Transport from a connected Ledger device discoverable via U2F (browser support) + */ + static async open(_, _openTimeout = 5000) { + return new TransportU2F(); + } + + constructor() { + super(); + this.scrambleKey = void 0; + this.unwrap = true; + transportInstances.push(this); + } + /** + * Exchange with the device using APDU protocol. + * @param apdu + * @returns a promise of apdu response + */ + + + async exchange(apdu) { + try { + return await attemptExchange(apdu, this.exchangeTimeout, this.scrambleKey, this.unwrap); + } catch (e) { + const isU2FError = typeof e.metaData === "object"; + + if (isU2FError) { + if (isTimeoutU2FError(e)) { + emitDisconnect(); + } // the wrapping make error more usable and "printable" to the end user. + + + throw wrapU2FTransportError(e, "Failed to sign with Ledger device: U2F " + e.metaData.type, "U2F_" + e.metaData.code); + } else { + throw e; + } + } + } + /** + */ + + + setScrambleKey(scrambleKey) { + this.scrambleKey = Buffer.from(scrambleKey, "ascii"); + } + /** + */ + + + setUnwrap(unwrap) { + this.unwrap = unwrap; + } + + close() { + // u2f have no way to clean things up + return Promise.resolve(); + } + +} + +exports.default = TransportU2F; +TransportU2F.isSupported = _u2fApi.isSupported; + +TransportU2F.list = () => // this transport is not discoverable but we are going to guess if it is here with isSupported() +(0, _u2fApi.isSupported)().then(supported => supported ? [null] : []); + +TransportU2F.listen = observer => { + let unsubscribed = false; + (0, _u2fApi.isSupported)().then(supported => { + if (unsubscribed) return; + + if (supported) { + observer.next({ + type: "add", + descriptor: null + }); + observer.complete(); + } else { + observer.error(new _errors.TransportError("U2F browser support is needed for Ledger. " + "Please use Chrome, Opera or Firefox with a U2F extension. " + "Also make sure you're on an HTTPS connection", "U2FNotSupported")); + } + }); + return { + unsubscribe: () => { + unsubscribed = true; + } + }; +}; + +}).call(this,require("buffer").Buffer) +},{"@ledgerhq/errors":123,"@ledgerhq/hw-transport":163,"@ledgerhq/logs":164,"buffer":172,"u2f-api":216}],163:[function(require,module,exports){ +arguments[4][160][0].apply(exports,arguments) +},{"@ledgerhq/errors":123,"buffer":172,"dup":160,"events":194}],164:[function(require,module,exports){ +arguments[4][161][0].apply(exports,arguments) +},{"dup":161}],165:[function(require,module,exports){ +"use strict"; + +(function(root) { + + function checkInt(value) { + return (parseInt(value) === value); + } + + function checkInts(arrayish) { + if (!checkInt(arrayish.length)) { return false; } + + for (var i = 0; i < arrayish.length; i++) { + if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) { + return false; + } + } + + return true; + } + + function coerceArray(arg, copy) { + + // ArrayBuffer view + if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === 'Uint8Array') { + + if (copy) { + if (arg.slice) { + arg = arg.slice(); + } else { + arg = Array.prototype.slice.call(arg); + } + } + + return arg; + } + + // It's an array; check it is a valid representation of a byte + if (Array.isArray(arg)) { + if (!checkInts(arg)) { + throw new Error('Array contains invalid value: ' + arg); + } + + return new Uint8Array(arg); + } + + // Something else, but behaves like an array (maybe a Buffer? Arguments?) + if (checkInt(arg.length) && checkInts(arg)) { + return new Uint8Array(arg); + } + + throw new Error('unsupported array-like object'); + } + + function createArray(length) { + return new Uint8Array(length); + } + + function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) { + if (sourceStart != null || sourceEnd != null) { + if (sourceArray.slice) { + sourceArray = sourceArray.slice(sourceStart, sourceEnd); + } else { + sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd); + } + } + targetArray.set(sourceArray, targetStart); + } + + + + var convertUtf8 = (function() { + function toBytes(text) { + var result = [], i = 0; + text = encodeURI(text); + while (i < text.length) { + var c = text.charCodeAt(i++); + + // if it is a % sign, encode the following 2 bytes as a hex value + if (c === 37) { + result.push(parseInt(text.substr(i, 2), 16)) + i += 2; + + // otherwise, just the actual byte + } else { + result.push(c) + } + } + + return coerceArray(result); + } + + function fromBytes(bytes) { + var result = [], i = 0; + + while (i < bytes.length) { + var c = bytes[i]; + + if (c < 128) { + result.push(String.fromCharCode(c)); + i++; + } else if (c > 191 && c < 224) { + result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f))); + i += 2; + } else { + result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f))); + i += 3; + } + } + + return result.join(''); + } + + return { + toBytes: toBytes, + fromBytes: fromBytes, + } + })(); + + var convertHex = (function() { + function toBytes(text) { + var result = []; + for (var i = 0; i < text.length; i += 2) { + result.push(parseInt(text.substr(i, 2), 16)); + } + + return result; + } + + // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html + var Hex = '0123456789abcdef'; + + function fromBytes(bytes) { + var result = []; + for (var i = 0; i < bytes.length; i++) { + var v = bytes[i]; + result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]); + } + return result.join(''); + } + + return { + toBytes: toBytes, + fromBytes: fromBytes, + } + })(); + + + // Number of rounds by keysize + var numberOfRounds = {16: 10, 24: 12, 32: 14} + + // Round constant words + var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; + + // S-box and Inverse S-box (S is for Substitution) + var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]; + var Si =[0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; + + // Transformations for encryption + var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a]; + var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616]; + var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16]; + var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; + + // Transformations for decryption + var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742]; + var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857]; + var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8]; + var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; + + // Transformations for decryption key expansion + var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]; + var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697]; + var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46]; + var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d]; + + function convertToInt32(bytes) { + var result = []; + for (var i = 0; i < bytes.length; i += 4) { + result.push( + (bytes[i ] << 24) | + (bytes[i + 1] << 16) | + (bytes[i + 2] << 8) | + bytes[i + 3] + ); + } + return result; + } + + var AES = function(key) { + if (!(this instanceof AES)) { + throw Error('AES must be instanitated with `new`'); + } + + Object.defineProperty(this, 'key', { + value: coerceArray(key, true) + }); + + this._prepare(); + } + + + AES.prototype._prepare = function() { + + var rounds = numberOfRounds[this.key.length]; + if (rounds == null) { + throw new Error('invalid key size (must be 16, 24 or 32 bytes)'); + } + + // encryption round keys + this._Ke = []; + + // decryption round keys + this._Kd = []; + + for (var i = 0; i <= rounds; i++) { + this._Ke.push([0, 0, 0, 0]); + this._Kd.push([0, 0, 0, 0]); + } + + var roundKeyCount = (rounds + 1) * 4; + var KC = this.key.length / 4; + + // convert the key into ints + var tk = convertToInt32(this.key); + + // copy values into round key arrays + var index; + for (var i = 0; i < KC; i++) { + index = i >> 2; + this._Ke[index][i % 4] = tk[i]; + this._Kd[rounds - index][i % 4] = tk[i]; + } + + // key expansion (fips-197 section 5.2) + var rconpointer = 0; + var t = KC, tt; + while (t < roundKeyCount) { + tt = tk[KC - 1]; + tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^ + (S[(tt >> 8) & 0xFF] << 16) ^ + (S[ tt & 0xFF] << 8) ^ + S[(tt >> 24) & 0xFF] ^ + (rcon[rconpointer] << 24)); + rconpointer += 1; + + // key expansion (for non-256 bit) + if (KC != 8) { + for (var i = 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + + // key expansion for 256-bit keys is "slightly different" (fips-197) + } else { + for (var i = 1; i < (KC / 2); i++) { + tk[i] ^= tk[i - 1]; + } + tt = tk[(KC / 2) - 1]; + + tk[KC / 2] ^= (S[ tt & 0xFF] ^ + (S[(tt >> 8) & 0xFF] << 8) ^ + (S[(tt >> 16) & 0xFF] << 16) ^ + (S[(tt >> 24) & 0xFF] << 24)); + + for (var i = (KC / 2) + 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + } + + // copy values into round key arrays + var i = 0, r, c; + while (i < KC && t < roundKeyCount) { + r = t >> 2; + c = t % 4; + this._Ke[r][c] = tk[i]; + this._Kd[rounds - r][c] = tk[i++]; + t++; + } + } + + // inverse-cipher-ify the decryption round key (fips-197 section 5.3) + for (var r = 1; r < rounds; r++) { + for (var c = 0; c < 4; c++) { + tt = this._Kd[r][c]; + this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^ + U2[(tt >> 16) & 0xFF] ^ + U3[(tt >> 8) & 0xFF] ^ + U4[ tt & 0xFF]); + } + } + } + + AES.prototype.encrypt = function(plaintext) { + if (plaintext.length != 16) { + throw new Error('invalid plaintext size (must be 16 bytes)'); + } + + var rounds = this._Ke.length - 1; + var a = [0, 0, 0, 0]; + + // convert plaintext to (ints ^ key) + var t = convertToInt32(plaintext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Ke[0][i]; + } + + // apply round transforms + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = (T1[(t[ i ] >> 24) & 0xff] ^ + T2[(t[(i + 1) % 4] >> 16) & 0xff] ^ + T3[(t[(i + 2) % 4] >> 8) & 0xff] ^ + T4[ t[(i + 3) % 4] & 0xff] ^ + this._Ke[r][i]); + } + t = a.slice(); + } + + // the last round is special + var result = createArray(16), tt; + for (var i = 0; i < 4; i++) { + tt = this._Ke[rounds][i]; + result[4 * i ] = (S[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; + result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; + result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; + result[4 * i + 3] = (S[ t[(i + 3) % 4] & 0xff] ^ tt ) & 0xff; + } + + return result; + } + + AES.prototype.decrypt = function(ciphertext) { + if (ciphertext.length != 16) { + throw new Error('invalid ciphertext size (must be 16 bytes)'); + } + + var rounds = this._Kd.length - 1; + var a = [0, 0, 0, 0]; + + // convert plaintext to (ints ^ key) + var t = convertToInt32(ciphertext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Kd[0][i]; + } + + // apply round transforms + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = (T5[(t[ i ] >> 24) & 0xff] ^ + T6[(t[(i + 3) % 4] >> 16) & 0xff] ^ + T7[(t[(i + 2) % 4] >> 8) & 0xff] ^ + T8[ t[(i + 1) % 4] & 0xff] ^ + this._Kd[r][i]); + } + t = a.slice(); + } + + // the last round is special + var result = createArray(16), tt; + for (var i = 0; i < 4; i++) { + tt = this._Kd[rounds][i]; + result[4 * i ] = (Si[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; + result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; + result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; + result[4 * i + 3] = (Si[ t[(i + 1) % 4] & 0xff] ^ tt ) & 0xff; + } + + return result; + } + + + /** + * Mode Of Operation - Electonic Codebook (ECB) + */ + var ModeOfOperationECB = function(key) { + if (!(this instanceof ModeOfOperationECB)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Electronic Code Block"; + this.name = "ecb"; + + this._aes = new AES(key); + } + + ModeOfOperationECB.prototype.encrypt = function(plaintext) { + plaintext = coerceArray(plaintext); + + if ((plaintext.length % 16) !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } + + var ciphertext = createArray(plaintext.length); + var block = createArray(16); + + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); + block = this._aes.encrypt(block); + copyArray(block, ciphertext, i); + } + + return ciphertext; + } + + ModeOfOperationECB.prototype.decrypt = function(ciphertext) { + ciphertext = coerceArray(ciphertext); + + if ((ciphertext.length % 16) !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } + + var plaintext = createArray(ciphertext.length); + var block = createArray(16); + + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); + copyArray(block, plaintext, i); + } + + return plaintext; + } + + + /** + * Mode Of Operation - Cipher Block Chaining (CBC) + */ + var ModeOfOperationCBC = function(key, iv) { + if (!(this instanceof ModeOfOperationCBC)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Cipher Block Chaining"; + this.name = "cbc"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 bytes)'); + } + + this._lastCipherblock = coerceArray(iv, true); + + this._aes = new AES(key); + } + + ModeOfOperationCBC.prototype.encrypt = function(plaintext) { + plaintext = coerceArray(plaintext); + + if ((plaintext.length % 16) !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } + + var ciphertext = createArray(plaintext.length); + var block = createArray(16); + + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); + + for (var j = 0; j < 16; j++) { + block[j] ^= this._lastCipherblock[j]; + } + + this._lastCipherblock = this._aes.encrypt(block); + copyArray(this._lastCipherblock, ciphertext, i); + } + + return ciphertext; + } + + ModeOfOperationCBC.prototype.decrypt = function(ciphertext) { + ciphertext = coerceArray(ciphertext); + + if ((ciphertext.length % 16) !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } + + var plaintext = createArray(ciphertext.length); + var block = createArray(16); + + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); + + for (var j = 0; j < 16; j++) { + plaintext[i + j] = block[j] ^ this._lastCipherblock[j]; + } + + copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16); + } + + return plaintext; + } + + + /** + * Mode Of Operation - Cipher Feedback (CFB) + */ + var ModeOfOperationCFB = function(key, iv, segmentSize) { + if (!(this instanceof ModeOfOperationCFB)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Cipher Feedback"; + this.name = "cfb"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 size)'); + } + + if (!segmentSize) { segmentSize = 1; } + + this.segmentSize = segmentSize; + + this._shiftRegister = coerceArray(iv, true); + + this._aes = new AES(key); + } + + ModeOfOperationCFB.prototype.encrypt = function(plaintext) { + if ((plaintext.length % this.segmentSize) != 0) { + throw new Error('invalid plaintext size (must be segmentSize bytes)'); + } + + var encrypted = coerceArray(plaintext, true); + + var xorSegment; + for (var i = 0; i < encrypted.length; i += this.segmentSize) { + xorSegment = this._aes.encrypt(this._shiftRegister); + for (var j = 0; j < this.segmentSize; j++) { + encrypted[i + j] ^= xorSegment[j]; + } + + // Shift the register + copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); + copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + } + + return encrypted; + } + + ModeOfOperationCFB.prototype.decrypt = function(ciphertext) { + if ((ciphertext.length % this.segmentSize) != 0) { + throw new Error('invalid ciphertext size (must be segmentSize bytes)'); + } + + var plaintext = coerceArray(ciphertext, true); + + var xorSegment; + for (var i = 0; i < plaintext.length; i += this.segmentSize) { + xorSegment = this._aes.encrypt(this._shiftRegister); + + for (var j = 0; j < this.segmentSize; j++) { + plaintext[i + j] ^= xorSegment[j]; + } + + // Shift the register + copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); + copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + } + + return plaintext; + } + + /** + * Mode Of Operation - Output Feedback (OFB) + */ + var ModeOfOperationOFB = function(key, iv) { + if (!(this instanceof ModeOfOperationOFB)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Output Feedback"; + this.name = "ofb"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 bytes)'); + } + + this._lastPrecipher = coerceArray(iv, true); + this._lastPrecipherIndex = 16; + + this._aes = new AES(key); + } + + ModeOfOperationOFB.prototype.encrypt = function(plaintext) { + var encrypted = coerceArray(plaintext, true); + + for (var i = 0; i < encrypted.length; i++) { + if (this._lastPrecipherIndex === 16) { + this._lastPrecipher = this._aes.encrypt(this._lastPrecipher); + this._lastPrecipherIndex = 0; + } + encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++]; + } + + return encrypted; + } + + // Decryption is symetric + ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt; + + + /** + * Counter object for CTR common mode of operation + */ + var Counter = function(initialValue) { + if (!(this instanceof Counter)) { + throw Error('Counter must be instanitated with `new`'); + } + + // We allow 0, but anything false-ish uses the default 1 + if (initialValue !== 0 && !initialValue) { initialValue = 1; } + + if (typeof(initialValue) === 'number') { + this._counter = createArray(16); + this.setValue(initialValue); + + } else { + this.setBytes(initialValue); + } + } + + Counter.prototype.setValue = function(value) { + if (typeof(value) !== 'number' || parseInt(value) != value) { + throw new Error('invalid counter value (must be an integer)'); + } + + for (var index = 15; index >= 0; --index) { + this._counter[index] = value % 256; + value = value >> 8; + } + } + + Counter.prototype.setBytes = function(bytes) { + bytes = coerceArray(bytes, true); + + if (bytes.length != 16) { + throw new Error('invalid counter bytes size (must be 16 bytes)'); + } + + this._counter = bytes; + }; + + Counter.prototype.increment = function() { + for (var i = 15; i >= 0; i--) { + if (this._counter[i] === 255) { + this._counter[i] = 0; + } else { + this._counter[i]++; + break; + } + } + } + + + /** + * Mode Of Operation - Counter (CTR) + */ + var ModeOfOperationCTR = function(key, counter) { + if (!(this instanceof ModeOfOperationCTR)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Counter"; + this.name = "ctr"; + + if (!(counter instanceof Counter)) { + counter = new Counter(counter) + } + + this._counter = counter; + + this._remainingCounter = null; + this._remainingCounterIndex = 16; + + this._aes = new AES(key); + } + + ModeOfOperationCTR.prototype.encrypt = function(plaintext) { + var encrypted = coerceArray(plaintext, true); + + for (var i = 0; i < encrypted.length; i++) { + if (this._remainingCounterIndex === 16) { + this._remainingCounter = this._aes.encrypt(this._counter._counter); + this._remainingCounterIndex = 0; + this._counter.increment(); + } + encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++]; + } + + return encrypted; + } + + // Decryption is symetric + ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; + + + /////////////////////// + // Padding + + // See:https://tools.ietf.org/html/rfc2315 + function pkcs7pad(data) { + data = coerceArray(data, true); + var padder = 16 - (data.length % 16); + var result = createArray(data.length + padder); + copyArray(data, result); + for (var i = data.length; i < result.length; i++) { + result[i] = padder; + } + return result; + } + + function pkcs7strip(data) { + data = coerceArray(data, true); + if (data.length < 16) { throw new Error('PKCS#7 invalid length'); } + + var padder = data[data.length - 1]; + if (padder > 16) { throw new Error('PKCS#7 padding byte out of range'); } + + var length = data.length - padder; + for (var i = 0; i < padder; i++) { + if (data[length + i] !== padder) { + throw new Error('PKCS#7 invalid padding byte'); + } + } + + var result = createArray(length); + copyArray(data, result, 0, 0, length); + return result; + } + + /////////////////////// + // Exporting + + + // The block cipher + var aesjs = { + AES: AES, + Counter: Counter, + + ModeOfOperation: { + ecb: ModeOfOperationECB, + cbc: ModeOfOperationCBC, + cfb: ModeOfOperationCFB, + ofb: ModeOfOperationOFB, + ctr: ModeOfOperationCTR + }, + + utils: { + hex: convertHex, + utf8: convertUtf8 + }, + + padding: { + pkcs7: { + pad: pkcs7pad, + strip: pkcs7strip + } + }, + + _arrayTest: { + coerceArray: coerceArray, + createArray: createArray, + copyArray: copyArray, + } + }; + + + // node.js + if (typeof exports !== 'undefined') { + module.exports = aesjs + + // RequireJS/AMD + // http://www.requirejs.org/docs/api.html + // https://github.com/amdjs/amdjs-api/wiki/AMD + } else if (typeof(define) === 'function' && define.amd) { + define(aesjs); + + // Web Browsers + } else { + + // If there was an existing library at "aesjs" make sure it's still available + if (root.aesjs) { + aesjs._aesjs = root.aesjs; + } + + root.aesjs = aesjs; + } + + +})(this); + +},{}],166:[function(require,module,exports){ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function getLens (b64) { + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf('=') + if (validLen === -1) validLen = len + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4) + + return [validLen, placeHoldersLen] +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength (b64) { + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function _byteLength (b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function toByteArray (b64) { + var tmp + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + + var curByte = 0 + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen + + for (var i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)] + arr[curByte++] = (tmp >> 16) & 0xFF + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk( + uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) + )) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + '==' + ) + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1] + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + '=' + ) + } + + return parts.join('') +} + +},{}],167:[function(require,module,exports){ +'use strict' +var ALPHABET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' + +// pre-compute lookup table +var ALPHABET_MAP = {} +for (var z = 0; z < ALPHABET.length; z++) { + var x = ALPHABET.charAt(z) + + if (ALPHABET_MAP[x] !== undefined) throw new TypeError(x + ' is ambiguous') + ALPHABET_MAP[x] = z +} + +function polymodStep (pre) { + var b = pre >> 25 + return ((pre & 0x1FFFFFF) << 5) ^ + (-((b >> 0) & 1) & 0x3b6a57b2) ^ + (-((b >> 1) & 1) & 0x26508e6d) ^ + (-((b >> 2) & 1) & 0x1ea119fa) ^ + (-((b >> 3) & 1) & 0x3d4233dd) ^ + (-((b >> 4) & 1) & 0x2a1462b3) +} + +function prefixChk (prefix) { + var chk = 1 + for (var i = 0; i < prefix.length; ++i) { + var c = prefix.charCodeAt(i) + if (c < 33 || c > 126) return 'Invalid prefix (' + prefix + ')' + + chk = polymodStep(chk) ^ (c >> 5) + } + chk = polymodStep(chk) + + for (i = 0; i < prefix.length; ++i) { + var v = prefix.charCodeAt(i) + chk = polymodStep(chk) ^ (v & 0x1f) + } + return chk +} + +function encode (prefix, words, LIMIT) { + LIMIT = LIMIT || 90 + if ((prefix.length + 7 + words.length) > LIMIT) throw new TypeError('Exceeds length limit') + + prefix = prefix.toLowerCase() + + // determine chk mod + var chk = prefixChk(prefix) + if (typeof chk === 'string') throw new Error(chk) + + var result = prefix + '1' + for (var i = 0; i < words.length; ++i) { + var x = words[i] + if ((x >> 5) !== 0) throw new Error('Non 5-bit word') + + chk = polymodStep(chk) ^ x + result += ALPHABET.charAt(x) + } + + for (i = 0; i < 6; ++i) { + chk = polymodStep(chk) + } + chk ^= 1 + + for (i = 0; i < 6; ++i) { + var v = (chk >> ((5 - i) * 5)) & 0x1f + result += ALPHABET.charAt(v) + } + + return result +} + +function __decode (str, LIMIT) { + LIMIT = LIMIT || 90 + if (str.length < 8) return str + ' too short' + if (str.length > LIMIT) return 'Exceeds length limit' + + // don't allow mixed case + var lowered = str.toLowerCase() + var uppered = str.toUpperCase() + if (str !== lowered && str !== uppered) return 'Mixed-case string ' + str + str = lowered + + var split = str.lastIndexOf('1') + if (split === -1) return 'No separator character for ' + str + if (split === 0) return 'Missing prefix for ' + str + + var prefix = str.slice(0, split) + var wordChars = str.slice(split + 1) + if (wordChars.length < 6) return 'Data too short' + + var chk = prefixChk(prefix) + if (typeof chk === 'string') return chk + + var words = [] + for (var i = 0; i < wordChars.length; ++i) { + var c = wordChars.charAt(i) + var v = ALPHABET_MAP[c] + if (v === undefined) return 'Unknown character ' + c + chk = polymodStep(chk) ^ v + + // not in the checksum? + if (i + 6 >= wordChars.length) continue + words.push(v) + } + + if (chk !== 1) return 'Invalid checksum for ' + str + return { prefix: prefix, words: words } +} + +function decodeUnsafe () { + var res = __decode.apply(null, arguments) + if (typeof res === 'object') return res +} + +function decode (str) { + var res = __decode.apply(null, arguments) + if (typeof res === 'object') return res + + throw new Error(res) +} + +function convert (data, inBits, outBits, pad) { + var value = 0 + var bits = 0 + var maxV = (1 << outBits) - 1 + + var result = [] + for (var i = 0; i < data.length; ++i) { + value = (value << inBits) | data[i] + bits += inBits + + while (bits >= outBits) { + bits -= outBits + result.push((value >> bits) & maxV) + } + } + + if (pad) { + if (bits > 0) { + result.push((value << (outBits - bits)) & maxV) + } + } else { + if (bits >= inBits) return 'Excess padding' + if ((value << (outBits - bits)) & maxV) return 'Non-zero padding' + } + + return result +} + +function toWordsUnsafe (bytes) { + var res = convert(bytes, 8, 5, true) + if (Array.isArray(res)) return res +} + +function toWords (bytes) { + var res = convert(bytes, 8, 5, true) + if (Array.isArray(res)) return res + + throw new Error(res) +} + +function fromWordsUnsafe (words) { + var res = convert(words, 5, 8, false) + if (Array.isArray(res)) return res +} + +function fromWords (words) { + var res = convert(words, 5, 8, false) + if (Array.isArray(res)) return res + + throw new Error(res) +} + +module.exports = { + decodeUnsafe: decodeUnsafe, + decode: decode, + encode: encode, + toWordsUnsafe: toWordsUnsafe, + toWords: toWords, + fromWordsUnsafe: fromWordsUnsafe, + fromWords: fromWords +} + +},{}],168:[function(require,module,exports){ +;(function (globalObject) { + 'use strict'; + +/* + * bignumber.js v9.0.1 + * A JavaScript library for arbitrary-precision arithmetic. + * https://github.com/MikeMcl/bignumber.js + * Copyright (c) 2020 Michael Mclaughlin + * MIT Licensed. + * + * BigNumber.prototype methods | BigNumber methods + * | + * absoluteValue abs | clone + * comparedTo | config set + * decimalPlaces dp | DECIMAL_PLACES + * dividedBy div | ROUNDING_MODE + * dividedToIntegerBy idiv | EXPONENTIAL_AT + * exponentiatedBy pow | RANGE + * integerValue | CRYPTO + * isEqualTo eq | MODULO_MODE + * isFinite | POW_PRECISION + * isGreaterThan gt | FORMAT + * isGreaterThanOrEqualTo gte | ALPHABET + * isInteger | isBigNumber + * isLessThan lt | maximum max + * isLessThanOrEqualTo lte | minimum min + * isNaN | random + * isNegative | sum + * isPositive | + * isZero | + * minus | + * modulo mod | + * multipliedBy times | + * negated | + * plus | + * precision sd | + * shiftedBy | + * squareRoot sqrt | + * toExponential | + * toFixed | + * toFormat | + * toFraction | * toJSON | * toNumber | * toPrecision | @@ -5427,7 +25873,7 @@ function fromByteArray (uint8) { } })(this); -},{}],18:[function(require,module,exports){ +},{}],169:[function(require,module,exports){ (function (module, exports) { 'use strict'; @@ -5480,7 +25926,11 @@ function fromByteArray (uint8) { var Buffer; try { - Buffer = require('buffer').Buffer; + if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') { + Buffer = window.Buffer; + } else { + Buffer = require('buffer').Buffer; + } } catch (e) { } @@ -5521,23 +25971,19 @@ function fromByteArray (uint8) { var start = 0; if (number[0] === '-') { start++; - } - - if (base === 16) { - this._parseHex(number, start); - } else { - this._parseBase(number, base, start); - } - - if (number[0] === '-') { this.negative = 1; } - this.strip(); - - if (endian !== 'le') return; - - this._initArray(this.toArray(), base, endian); + if (start < number.length) { + if (base === 16) { + this._parseHex(number, start, endian); + } else { + this._parseBase(number, base, start); + if (endian === 'le') { + this._initArray(this.toArray(), base, endian); + } + } + } }; BN.prototype._initNumber = function _initNumber (number, base, endian) { @@ -5613,31 +26059,29 @@ function fromByteArray (uint8) { return this.strip(); }; - function parseHex (str, start, end) { - var r = 0; - var len = Math.min(str.length, end); - for (var i = start; i < len; i++) { - var c = str.charCodeAt(i) - 48; - - r <<= 4; - - // 'a' - 'f' - if (c >= 49 && c <= 54) { - r |= c - 49 + 0xa; - - // 'A' - 'F' - } else if (c >= 17 && c <= 22) { - r |= c - 17 + 0xa; + function parseHex4Bits (string, index) { + var c = string.charCodeAt(index); + // 'A' - 'F' + if (c >= 65 && c <= 70) { + return c - 55; + // 'a' - 'f' + } else if (c >= 97 && c <= 102) { + return c - 87; + // '0' - '9' + } else { + return (c - 48) & 0xf; + } + } - // '0' - '9' - } else { - r |= c & 0xf; - } + function parseHexByte (string, lowerBound, index) { + var r = parseHex4Bits(string, index); + if (index - 1 >= lowerBound) { + r |= parseHex4Bits(string, index - 1) << 4; } return r; } - BN.prototype._parseHex = function _parseHex (number, start) { + BN.prototype._parseHex = function _parseHex (number, start, endian) { // Create possibly bigger array to ensure that it fits the number this.length = Math.ceil((number.length - start) / 6); this.words = new Array(this.length); @@ -5645,25 +26089,38 @@ function fromByteArray (uint8) { this.words[i] = 0; } - var j, w; - // Scan 24-bit chunks and add them to the number + // 24-bits chunks var off = 0; - for (i = number.length - 6, j = 0; i >= start; i -= 6) { - w = parseHex(number, i, i + 6); - this.words[j] |= (w << off) & 0x3ffffff; - // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb - this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; - off += 24; - if (off >= 26) { - off -= 26; - j++; + var j = 0; + + var w; + if (endian === 'be') { + for (i = number.length - 1; i >= start; i -= 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 0x3ffffff; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } else { + var parseLength = number.length - start; + for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 0x3ffffff; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } } } - if (i + 6 !== start) { - w = parseHex(number, start, i + 6); - this.words[j] |= (w << off) & 0x3ffffff; - this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; - } + this.strip(); }; @@ -5734,6 +26191,8 @@ function fromByteArray (uint8) { this._iaddn(word); } } + + this.strip(); }; BN.prototype.copy = function copy (dest) { @@ -7033,4138 +27492,9805 @@ function fromByteArray (uint8) { o[19] = c; out.length++; } - return out; - }; + return out; + }; + + // Polyfill comb + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + + function bigMulTo (self, num, out) { + out.negative = num.negative ^ self.negative; + out.length = self.length + num.length; + + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + // Sum all words with the same `i + j = k` and accumulate `ncarry`, + // note that ncarry could be >= 0x3ffffff + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 0x3ffffff; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + + var lo = r & 0x3ffffff; + ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; + lo = (lo + rword) | 0; + rword = lo & 0x3ffffff; + ncarry = (ncarry + (lo >>> 26)) | 0; + + hncarry += ncarry >>> 26; + ncarry &= 0x3ffffff; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + + return out.strip(); + } + + function jumboMulTo (self, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self, num, out); + } + + BN.prototype.mulTo = function mulTo (num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + + return res; + }; + + // Cooley-Tukey algorithm for FFT + // slightly revisited to rely on looping instead of recursion + + function FFTM (x, y) { + this.x = x; + this.y = y; + } + + FFTM.prototype.makeRBT = function makeRBT (N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + + return t; + }; + + // Returns binary-reversed representation of `x` + FFTM.prototype.revBin = function revBin (x, l, N) { + if (x === 0 || x === N - 1) return x; + + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << (l - i - 1); + x >>= 1; + } + + return rb; + }; + + // Performs "tweedling" phase, therefore 'emulating' + // behaviour of the recursive algorithm + FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + + FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + + for (var j = 0; j < s; j++) { + var re = rtws[p + j]; + var ie = itws[p + j]; + + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + + var rx = rtwdf_ * ro - itwdf_ * io; + + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + + rtws[p + j] = re + ro; + itws[p + j] = ie + io; + + rtws[p + j + s] = re - ro; + itws[p + j + s] = ie - io; + + /* jshint maxdepth : false */ + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + + FFTM.prototype.guessLen13b = function guessLen13b (n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + + return 1 << i + 1 + odd; + }; + + FFTM.prototype.conjugate = function conjugate (rws, iws, N) { + if (N <= 1) return; + + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + + t = iws[i]; + + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + + FFTM.prototype.normalize13b = function normalize13b (ws, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + + Math.round(ws[2 * i] / N) + + carry; + + ws[i] = w & 0x3ffffff; + + if (w < 0x4000000) { + carry = 0; + } else { + carry = w / 0x4000000 | 0; + } + } + + return ws; + }; + + FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws[i] | 0); + + rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; + rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; + } + + // Pad with zeroes + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + + assert(carry === 0); + assert((carry & ~0x1fff) === 0); + }; + + FFTM.prototype.stub = function stub (N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + + return ph; + }; + + FFTM.prototype.mulp = function mulp (x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + + var rbt = this.makeRBT(N); + + var _ = this.stub(N); + + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + + var rmws = out.words; + rmws.length = N; + + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + + // Multiply `this` by `num` + BN.prototype.mul = function mul (num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + + // Multiply employing FFT + BN.prototype.mulf = function mulf (num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + + // In-place Multiplication + BN.prototype.imul = function imul (num) { + return this.clone().mulTo(num, this); + }; + + BN.prototype.imuln = function imuln (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + + // Carry + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); + carry >>= 26; + carry += (w / 0x4000000) | 0; + // NOTE: lo is 27bit maximum + carry += lo >>> 26; + this.words[i] = lo & 0x3ffffff; + } + + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + + return this; + }; + + BN.prototype.muln = function muln (num) { + return this.clone().imuln(num); + }; + + // `this` * `this` + BN.prototype.sqr = function sqr () { + return this.mul(this); + }; + + // `this` * `this` in-place + BN.prototype.isqr = function isqr () { + return this.imul(this.clone()); + }; + + // Math.pow(`this`, `num`) + BN.prototype.pow = function pow (num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + + // Skip leading zeroes + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + + res = res.mul(q); + } + } + + return res; + }; + + // Shift-left in-place + BN.prototype.iushln = function iushln (bits) { + assert(typeof bits === 'number' && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); + var i; + + if (r !== 0) { + var carry = 0; + + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = ((this.words[i] | 0) - newCarry) << r; + this.words[i] = c | carry; + carry = newCarry >>> (26 - r); + } + + if (carry) { + this.words[i] = carry; + this.length++; + } + } + + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + + this.length += s; + } + + return this.strip(); + }; + + BN.prototype.ishln = function ishln (bits) { + // TODO(indutny): implement me + assert(this.negative === 0); + return this.iushln(bits); + }; + + // Shift-right in-place + // NOTE: `hint` is a lowest bit before trailing zeroes + // NOTE: if `extended` is present - it will be filled with destroyed bits + BN.prototype.iushrn = function iushrn (bits, hint, extended) { + assert(typeof bits === 'number' && bits >= 0); + var h; + if (hint) { + h = (hint - (hint % 26)) / 26; + } else { + h = 0; + } + + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); + var maskedWords = extended; + + h -= s; + h = Math.max(0, h); + + // Extended mode, copy masked part + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + + if (s === 0) { + // No-op, we should not move anything at all + } else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = (carry << (26 - r)) | (word >>> r); + carry = word & mask; + } + + // Push carried bits as a mask + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + + return this.strip(); + }; + + BN.prototype.ishrn = function ishrn (bits, hint, extended) { + // TODO(indutny): implement me + assert(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + + // Shift-left + BN.prototype.shln = function shln (bits) { + return this.clone().ishln(bits); + }; + + BN.prototype.ushln = function ushln (bits) { + return this.clone().iushln(bits); + }; + + // Shift-right + BN.prototype.shrn = function shrn (bits) { + return this.clone().ishrn(bits); + }; + + BN.prototype.ushrn = function ushrn (bits) { + return this.clone().iushrn(bits); + }; + + // Test if n bit is set + BN.prototype.testn = function testn (bit) { + assert(typeof bit === 'number' && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + + // Fast case: bit is much higher than all existing words + if (this.length <= s) return false; + + // Check bit and return + var w = this.words[s]; + + return !!(w & q); + }; + + // Return only lowers bits of number (in-place) + BN.prototype.imaskn = function imaskn (bits) { + assert(typeof bits === 'number' && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + + assert(this.negative === 0, 'imaskn works only with positive numbers'); + + if (this.length <= s) { + return this; + } + + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + + if (r !== 0) { + var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); + this.words[this.length - 1] &= mask; + } + + return this.strip(); + }; + + // Return only lowers bits of number + BN.prototype.maskn = function maskn (bits) { + return this.clone().imaskn(bits); + }; + + // Add plain number `num` to `this` + BN.prototype.iaddn = function iaddn (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + if (num < 0) return this.isubn(-num); + + // Possible sign change + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + + // Add without checks + return this._iaddn(num); + }; + + BN.prototype._iaddn = function _iaddn (num) { + this.words[0] += num; + + // Carry + for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { + this.words[i] -= 0x4000000; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + + return this; + }; + + // Subtract plain number `num` from `this` + BN.prototype.isubn = function isubn (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + if (num < 0) return this.iaddn(-num); + + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + + this.words[0] -= num; + + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + // Carry + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 0x4000000; + this.words[i + 1] -= 1; + } + } + + return this.strip(); + }; + + BN.prototype.addn = function addn (num) { + return this.clone().iaddn(num); + }; + + BN.prototype.subn = function subn (num) { + return this.clone().isubn(num); + }; + + BN.prototype.iabs = function iabs () { + this.negative = 0; + + return this; + }; + + BN.prototype.abs = function abs () { + return this.clone().iabs(); + }; + + BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { + var len = num.length + shift; + var i; + + this._expand(len); + + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 0x3ffffff; + carry = (w >> 26) - ((right / 0x4000000) | 0); + this.words[i + shift] = w & 0x3ffffff; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 0x3ffffff; + } + + if (carry === 0) return this.strip(); + + // Subtraction overflow + assert(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 0x3ffffff; + } + this.negative = 1; + + return this.strip(); + }; + + BN.prototype._wordDiv = function _wordDiv (num, mode) { + var shift = this.length - num.length; + + var a = this.clone(); + var b = num; + + // Normalize + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + + // Initialize quotient + var m = a.length - b.length; + var q; + + if (mode !== 'mod') { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + + var diff = a.clone()._ishlnsubmul(b, 1, m); + if (diff.negative === 0) { + a = diff; + if (q) { + q.words[m] = 1; + } + } + + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 0x4000000 + + (a.words[b.length + j - 1] | 0); + + // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max + // (0x7ffffff) + qj = Math.min((qj / bhi) | 0, 0x3ffffff); + + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + + // Denormalize + if (mode !== 'div' && shift !== 0) { + a.iushrn(shift); + } + + return { + div: q || null, + mod: a + }; + }; + + // NOTE: 1) `mode` can be set to `mod` to request mod only, + // to `div` to request div only, or be absent to + // request both div & mod + // 2) `positive` is true if unsigned mod is requested + BN.prototype.divmod = function divmod (num, mode, positive) { + assert(!num.isZero()); + + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + + if (mode !== 'mod') { + div = res.div.neg(); + } + + if (mode !== 'div') { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + + return { + div: div, + mod: mod + }; + } + + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + + if (mode !== 'mod') { + div = res.div.neg(); + } + + return { + div: div, + mod: res.mod + }; + } + + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + + if (mode !== 'div') { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + + return { + div: res.div, + mod: mod + }; + } + + // Both numbers are positive at this point + + // Strip both numbers to approximate shift value + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + + // Very short reduction + if (num.length === 1) { + if (mode === 'div') { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + + if (mode === 'mod') { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + + return this._wordDiv(num, mode); + }; + + // Find `this` / `num` + BN.prototype.div = function div (num) { + return this.divmod(num, 'div', false).div; + }; + + // Find `this` % `num` + BN.prototype.mod = function mod (num) { + return this.divmod(num, 'mod', false).mod; + }; + + BN.prototype.umod = function umod (num) { + return this.divmod(num, 'mod', true).mod; + }; + + // Find Round(`this` / `num`) + BN.prototype.divRound = function divRound (num) { + var dm = this.divmod(num); + + // Fast case - exact division + if (dm.mod.isZero()) return dm.div; + + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + + // Round down + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + + // Round up + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + + BN.prototype.modn = function modn (num) { + assert(num <= 0x3ffffff); + var p = (1 << 26) % num; + + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + + return acc; + }; + + // In-place division by number + BN.prototype.idivn = function idivn (num) { + assert(num <= 0x3ffffff); + + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 0x4000000; + this.words[i] = (w / num) | 0; + carry = w % num; + } + + return this.strip(); + }; + + BN.prototype.divn = function divn (num) { + return this.clone().idivn(num); + }; + + BN.prototype.egcd = function egcd (p) { + assert(p.negative === 0); + assert(!p.isZero()); + + var x = this; + var y = p.clone(); + + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + + // A * x + B * y = x + var A = new BN(1); + var B = new BN(0); + + // C * x + D * y = y + var C = new BN(0); + var D = new BN(1); + + var g = 0; + + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + + var yp = y.clone(); + var xp = x.clone(); + + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + + A.iushrn(1); + B.iushrn(1); + } + } + + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + + C.iushrn(1); + D.iushrn(1); + } + } + + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + + // This is reduced incarnation of the binary EEA + // above, designated to invert members of the + // _prime_ fields F(p) at a maximal speed + BN.prototype._invmp = function _invmp (p) { + assert(p.negative === 0); + assert(!p.isZero()); + + var a = this; + var b = p.clone(); + + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + + var x1 = new BN(1); + var x2 = new BN(0); + + var delta = b.clone(); + + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + + x1.iushrn(1); + } + } + + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + + x2.iushrn(1); + } + } + + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + + if (res.cmpn(0) < 0) { + res.iadd(p); + } + + return res; + }; + + BN.prototype.gcd = function gcd (num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + + // Remove common factor of two + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + + var r = a.cmp(b); + if (r < 0) { + // Swap `a` and `b` to make `a` always bigger than `b` + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + + a.isub(b); + } while (true); + + return b.iushln(shift); + }; + + // Invert number in the field F(num) + BN.prototype.invm = function invm (num) { + return this.egcd(num).a.umod(num); + }; + + BN.prototype.isEven = function isEven () { + return (this.words[0] & 1) === 0; + }; + + BN.prototype.isOdd = function isOdd () { + return (this.words[0] & 1) === 1; + }; + + // And first word and num + BN.prototype.andln = function andln (num) { + return this.words[0] & num; + }; + + // Increment at the bit position in-line + BN.prototype.bincn = function bincn (bit) { + assert(typeof bit === 'number'); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + + // Fast case: bit is much higher than all existing words + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + + // Add bit and propagate, if needed + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 0x3ffffff; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + + BN.prototype.isZero = function isZero () { + return this.length === 1 && this.words[0] === 0; + }; + + BN.prototype.cmpn = function cmpn (num) { + var negative = num < 0; + + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + + this.strip(); + + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + + assert(num <= 0x3ffffff, 'Number is too big'); + + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + + // Compare two numbers and return: + // 1 - if `this` > `num` + // 0 - if `this` == `num` + // -1 - if `this` < `num` + BN.prototype.cmp = function cmp (num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + + // Unsigned comparison + BN.prototype.ucmp = function ucmp (num) { + // At this point both numbers have the same sign + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + + BN.prototype.gtn = function gtn (num) { + return this.cmpn(num) === 1; + }; + + BN.prototype.gt = function gt (num) { + return this.cmp(num) === 1; + }; + + BN.prototype.gten = function gten (num) { + return this.cmpn(num) >= 0; + }; + + BN.prototype.gte = function gte (num) { + return this.cmp(num) >= 0; + }; + + BN.prototype.ltn = function ltn (num) { + return this.cmpn(num) === -1; + }; + + BN.prototype.lt = function lt (num) { + return this.cmp(num) === -1; + }; + + BN.prototype.lten = function lten (num) { + return this.cmpn(num) <= 0; + }; + + BN.prototype.lte = function lte (num) { + return this.cmp(num) <= 0; + }; + + BN.prototype.eqn = function eqn (num) { + return this.cmpn(num) === 0; + }; + + BN.prototype.eq = function eq (num) { + return this.cmp(num) === 0; + }; + + // + // A reduce context, could be using montgomery or something better, depending + // on the `m` itself. + // + BN.red = function red (num) { + return new Red(num); + }; + + BN.prototype.toRed = function toRed (ctx) { + assert(!this.red, 'Already a number in reduction context'); + assert(this.negative === 0, 'red works only with positives'); + return ctx.convertTo(this)._forceRed(ctx); + }; + + BN.prototype.fromRed = function fromRed () { + assert(this.red, 'fromRed works only with numbers in reduction context'); + return this.red.convertFrom(this); + }; + + BN.prototype._forceRed = function _forceRed (ctx) { + this.red = ctx; + return this; + }; + + BN.prototype.forceRed = function forceRed (ctx) { + assert(!this.red, 'Already a number in reduction context'); + return this._forceRed(ctx); + }; + + BN.prototype.redAdd = function redAdd (num) { + assert(this.red, 'redAdd works only with red numbers'); + return this.red.add(this, num); + }; + + BN.prototype.redIAdd = function redIAdd (num) { + assert(this.red, 'redIAdd works only with red numbers'); + return this.red.iadd(this, num); + }; + + BN.prototype.redSub = function redSub (num) { + assert(this.red, 'redSub works only with red numbers'); + return this.red.sub(this, num); + }; + + BN.prototype.redISub = function redISub (num) { + assert(this.red, 'redISub works only with red numbers'); + return this.red.isub(this, num); + }; + + BN.prototype.redShl = function redShl (num) { + assert(this.red, 'redShl works only with red numbers'); + return this.red.shl(this, num); + }; + + BN.prototype.redMul = function redMul (num) { + assert(this.red, 'redMul works only with red numbers'); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + + BN.prototype.redIMul = function redIMul (num) { + assert(this.red, 'redMul works only with red numbers'); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + + BN.prototype.redSqr = function redSqr () { + assert(this.red, 'redSqr works only with red numbers'); + this.red._verify1(this); + return this.red.sqr(this); + }; + + BN.prototype.redISqr = function redISqr () { + assert(this.red, 'redISqr works only with red numbers'); + this.red._verify1(this); + return this.red.isqr(this); + }; + + // Square root over p + BN.prototype.redSqrt = function redSqrt () { + assert(this.red, 'redSqrt works only with red numbers'); + this.red._verify1(this); + return this.red.sqrt(this); + }; + + BN.prototype.redInvm = function redInvm () { + assert(this.red, 'redInvm works only with red numbers'); + this.red._verify1(this); + return this.red.invm(this); + }; + + // Return negative clone of `this` % `red modulo` + BN.prototype.redNeg = function redNeg () { + assert(this.red, 'redNeg works only with red numbers'); + this.red._verify1(this); + return this.red.neg(this); + }; + + BN.prototype.redPow = function redPow (num) { + assert(this.red && !num.red, 'redPow(normalNum)'); + this.red._verify1(this); + return this.red.pow(this, num); + }; + + // Prime numbers with efficient reduction + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + + // Pseudo-Mersenne prime + function MPrime (name, p) { + // P = 2 ^ N - K + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + + this.tmp = this._tmp(); + } + + MPrime.prototype._tmp = function _tmp () { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + + MPrime.prototype.ireduce = function ireduce (num) { + // Assumes that `num` is less than `P^2` + // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) + var r = num; + var rlen; + + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== undefined) { + // r is BN v4 instance + r.strip(); + } else { + // r is BN v5 instance + r._strip(); + } + } + + return r; + }; + + MPrime.prototype.split = function split (input, out) { + input.iushrn(this.n, 0, out); + }; + + MPrime.prototype.imulK = function imulK (num) { + return num.imul(this.k); + }; + + function K256 () { + MPrime.call( + this, + 'k256', + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); + } + inherits(K256, MPrime); + + K256.prototype.split = function split (input, output) { + // 256 = 9 * 26 + 22 + var mask = 0x3fffff; + + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + + // Shift by 9 limbs + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + + K256.prototype.imulK = function imulK (num) { + // K = 0x1000003d1 = [ 0x40, 0x3d1 ] + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + + // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 0x3d1; + num.words[i] = lo & 0x3ffffff; + lo = w * 0x40 + ((lo / 0x4000000) | 0); + } + + // Fast length reduction + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + + function P224 () { + MPrime.call( + this, + 'p224', + 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); + } + inherits(P224, MPrime); + + function P192 () { + MPrime.call( + this, + 'p192', + 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); + } + inherits(P192, MPrime); + + function P25519 () { + // 2 ^ 255 - 19 + MPrime.call( + this, + '25519', + '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); + } + inherits(P25519, MPrime); + + P25519.prototype.imulK = function imulK (num) { + // K = 0x13 + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 0x13 + carry; + var lo = hi & 0x3ffffff; + hi >>>= 26; + + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + + // Exported mostly for testing purposes, use plain name instead + BN._prime = function prime (name) { + // Cached version of prime + if (primes[name]) return primes[name]; + + var prime; + if (name === 'k256') { + prime = new K256(); + } else if (name === 'p224') { + prime = new P224(); + } else if (name === 'p192') { + prime = new P192(); + } else if (name === 'p25519') { + prime = new P25519(); + } else { + throw new Error('Unknown prime ' + name); + } + primes[name] = prime; + + return prime; + }; + + // + // Base reduction engine + // + function Red (m) { + if (typeof m === 'string') { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert(m.gtn(1), 'modulus must be greater than 1'); + this.m = m; + this.prime = null; + } + } + + Red.prototype._verify1 = function _verify1 (a) { + assert(a.negative === 0, 'red works only with positives'); + assert(a.red, 'red works only with red numbers'); + }; + + Red.prototype._verify2 = function _verify2 (a, b) { + assert((a.negative | b.negative) === 0, 'red works only with positives'); + assert(a.red && a.red === b.red, + 'red works only with red numbers'); + }; + + Red.prototype.imod = function imod (a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + + Red.prototype.neg = function neg (a) { + if (a.isZero()) { + return a.clone(); + } + + return this.m.sub(a)._forceRed(this); + }; + + Red.prototype.add = function add (a, b) { + this._verify2(a, b); + + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + + Red.prototype.iadd = function iadd (a, b) { + this._verify2(a, b); + + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + + Red.prototype.sub = function sub (a, b) { + this._verify2(a, b); + + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + + Red.prototype.isub = function isub (a, b) { + this._verify2(a, b); + + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + + Red.prototype.shl = function shl (a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + + Red.prototype.imul = function imul (a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + + Red.prototype.mul = function mul (a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + + Red.prototype.isqr = function isqr (a) { + return this.imul(a, a.clone()); + }; + + Red.prototype.sqr = function sqr (a) { + return this.mul(a, a); + }; + + Red.prototype.sqrt = function sqrt (a) { + if (a.isZero()) return a.clone(); + + var mod3 = this.m.andln(3); + assert(mod3 % 2 === 1); + + // Fast case + if (mod3 === 3) { + var pow = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow); + } + + // Tonelli-Shanks algorithm (Totally unoptimized and slow) + // + // Find Q and S, that Q * 2 ^ S = (P - 1) + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert(!q.isZero()); + + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + + // Find quadratic non-residue + // NOTE: Max is such because of generalized Riemann hypothesis. + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + + return r; + }; + + Red.prototype.invm = function invm (a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + + Red.prototype.pow = function pow (a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + + var res = wnd[0]; + var current = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = (word >> j) & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + + if (bit === 0 && current === 0) { + currentLen = 0; + continue; + } + + current <<= 1; + current |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + + res = this.mul(res, wnd[current]); + currentLen = 0; + current = 0; + } + start = 26; + } + + return res; + }; + + Red.prototype.convertTo = function convertTo (num) { + var r = num.umod(this.m); + + return r === num ? r.clone() : r; + }; + + Red.prototype.convertFrom = function convertFrom (num) { + var res = num.clone(); + res.red = null; + return res; + }; + + // + // Montgomery method engine + // + + BN.mont = function mont (num) { + return new Mont(num); + }; + + function Mont (m) { + Red.call(this, m); + + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - (this.shift % 26); + } + + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + + Mont.prototype.convertTo = function convertTo (num) { + return this.imod(num.ushln(this.shift)); + }; + + Mont.prototype.convertFrom = function convertFrom (num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + + Mont.prototype.imul = function imul (a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } - // Polyfill comb - if (!Math.imul) { - comb10MulTo = smallMulTo; - } + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; - function bigMulTo (self, num, out) { - out.negative = num.negative ^ self.negative; - out.length = self.length + num.length; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } - var carry = 0; - var hncarry = 0; - for (var k = 0; k < out.length - 1; k++) { - // Sum all words with the same `i + j = k` and accumulate `ncarry`, - // note that ncarry could be >= 0x3ffffff - var ncarry = hncarry; - hncarry = 0; - var rword = carry & 0x3ffffff; - var maxJ = Math.min(k, num.length - 1); - for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { - var i = k - j; - var a = self.words[i] | 0; - var b = num.words[j] | 0; - var r = a * b; + return res._forceRed(this); + }; - var lo = r & 0x3ffffff; - ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; - lo = (lo + rword) | 0; - rword = lo & 0x3ffffff; - ncarry = (ncarry + (lo >>> 26)) | 0; + Mont.prototype.mul = function mul (a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); - hncarry += ncarry >>> 26; - ncarry &= 0x3ffffff; - } - out.words[k] = rword; - carry = ncarry; - ncarry = hncarry; - } - if (carry !== 0) { - out.words[k] = carry; - } else { - out.length--; + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); } - return out.strip(); + return res._forceRed(this); + }; + + Mont.prototype.invm = function invm (a) { + // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; +})(typeof module === 'undefined' || module, this); + +},{"buffer":171}],170:[function(require,module,exports){ +var r; + +module.exports = function rand(len) { + if (!r) + r = new Rand(null); + + return r.generate(len); +}; + +function Rand(rand) { + this.rand = rand; +} +module.exports.Rand = Rand; + +Rand.prototype.generate = function generate(len) { + return this._rand(len); +}; + +// Emulate crypto API using randy +Rand.prototype._rand = function _rand(n) { + if (this.rand.getBytes) + return this.rand.getBytes(n); + + var res = new Uint8Array(n); + for (var i = 0; i < res.length; i++) + res[i] = this.rand.getByte(); + return res; +}; + +if (typeof self === 'object') { + if (self.crypto && self.crypto.getRandomValues) { + // Modern browsers + Rand.prototype._rand = function _rand(n) { + var arr = new Uint8Array(n); + self.crypto.getRandomValues(arr); + return arr; + }; + } else if (self.msCrypto && self.msCrypto.getRandomValues) { + // IE + Rand.prototype._rand = function _rand(n) { + var arr = new Uint8Array(n); + self.msCrypto.getRandomValues(arr); + return arr; + }; + + // Safari's WebWorkers do not have `crypto` + } else if (typeof window === 'object') { + // Old junk + Rand.prototype._rand = function() { + throw new Error('Not implemented yet'); + }; } +} else { + // Node.js or Web worker with no crypto support + try { + var crypto = require('crypto'); + if (typeof crypto.randomBytes !== 'function') + throw new Error('Not supported'); - function jumboMulTo (self, num, out) { - var fftm = new FFTM(); - return fftm.mulp(self, num, out); + Rand.prototype._rand = function _rand(n) { + return crypto.randomBytes(n); + }; + } catch (e) { } +} - BN.prototype.mulTo = function mulTo (num, out) { - var res; - var len = this.length + num.length; - if (this.length === 10 && num.length === 10) { - res = comb10MulTo(this, num, out); - } else if (len < 63) { - res = smallMulTo(this, num, out); - } else if (len < 1024) { - res = bigMulTo(this, num, out); - } else { - res = jumboMulTo(this, num, out); - } +},{"crypto":171}],171:[function(require,module,exports){ - return res; - }; +},{}],172:[function(require,module,exports){ +(function (Buffer){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ - // Cooley-Tukey algorithm for FFT - // slightly revisited to rely on looping instead of recursion +'use strict' - function FFTM (x, y) { - this.x = x; - this.y = y; +var base64 = require('base64-js') +var ieee754 = require('ieee754') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +var K_MAX_LENGTH = 0x7fffffff +exports.kMaxLength = K_MAX_LENGTH + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() + +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && + typeof console.error === 'function') { + console.error( + 'This browser lacks typed array (Uint8Array) support which is required by ' + + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' + ) +} + +function typedArraySupport () { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1) + arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } + return arr.foo() === 42 + } catch (e) { + return false } +} - FFTM.prototype.makeRBT = function makeRBT (N) { - var t = new Array(N); - var l = BN.prototype._countBits(N) - 1; - for (var i = 0; i < N; i++) { - t[i] = this.revBin(i, l, N); - } +Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.buffer + } +}) - return t; - }; +Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.byteOffset + } +}) - // Returns binary-reversed representation of `x` - FFTM.prototype.revBin = function revBin (x, l, N) { - if (x === 0 || x === N - 1) return x; +function createBuffer (length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"') + } + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf +} - var rb = 0; - for (var i = 0; i < l; i++) { - rb |= (x & 1) << (l - i - 1); - x >>= 1; +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + +function Buffer (arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ) } + return allocUnsafe(arg) + } + return from(arg, encodingOrOffset, length) +} - return rb; - }; +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species != null && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) +} - // Performs "tweedling" phase, therefore 'emulating' - // behaviour of the recursive algorithm - FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { - for (var i = 0; i < N; i++) { - rtws[i] = rws[rbt[i]]; - itws[i] = iws[rbt[i]]; - } - }; +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) + } - FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { - this.permute(rbt, rws, iws, rtws, itws, N); + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) + } - for (var s = 1; s < N; s <<= 1) { - var l = s << 1; + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } - var rtwdf = Math.cos(2 * Math.PI / l); - var itwdf = Math.sin(2 * Math.PI / l); + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } - for (var p = 0; p < N; p += l) { - var rtwdf_ = rtwdf; - var itwdf_ = itwdf; + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) + } - for (var j = 0; j < s; j++) { - var re = rtws[p + j]; - var ie = itws[p + j]; + var b = fromObject(value) + if (b) return b - var ro = rtws[p + j + s]; - var io = itws[p + j + s]; + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) + } - var rx = rtwdf_ * ro - itwdf_ * io; + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) +} - io = rtwdf_ * io + itwdf_ * ro; - ro = rx; +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length) +} - rtws[p + j] = re + ro; - itws[p + j] = ie + io; +// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 +Buffer.prototype.__proto__ = Uint8Array.prototype +Buffer.__proto__ = Uint8Array - rtws[p + j + s] = re - ro; - itws[p + j + s] = ie - io; +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number') + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } +} - /* jshint maxdepth : false */ - if (j !== l) { - rx = rtwdf * rtwdf_ - itwdf * itwdf_; +function alloc (size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill) + } + return createBuffer(size) +} - itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; - rtwdf_ = rx; - } - } - } - } - }; +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding) +} - FFTM.prototype.guessLen13b = function guessLen13b (n, m) { - var N = Math.max(m, n) | 1; - var odd = N & 1; - var i = 0; - for (N = N / 2 | 0; N; N = N >>> 1) { - i++; - } +function allocUnsafe (size) { + assertSize(size) + return createBuffer(size < 0 ? 0 : checked(size) | 0) +} - return 1 << i + 1 + odd; - }; +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size) +} - FFTM.prototype.conjugate = function conjugate (rws, iws, N) { - if (N <= 1) return; +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } - for (var i = 0; i < N / 2; i++) { - var t = rws[i]; + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } - rws[i] = rws[N - i - 1]; - rws[N - i - 1] = t; + var length = byteLength(string, encoding) | 0 + var buf = createBuffer(length) - t = iws[i]; + var actual = buf.write(string, encoding) - iws[i] = -iws[N - i - 1]; - iws[N - i - 1] = -t; - } - }; + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual) + } - FFTM.prototype.normalize13b = function normalize13b (ws, N) { - var carry = 0; - for (var i = 0; i < N / 2; i++) { - var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + - Math.round(ws[2 * i] / N) + - carry; + return buf +} - ws[i] = w & 0x3ffffff; +function fromArrayLike (array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + var buf = createBuffer(length) + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255 + } + return buf +} - if (w < 0x4000000) { - carry = 0; - } else { - carry = w / 0x4000000 | 0; - } - } +function fromArrayBuffer (array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds') + } - return ws; - }; + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds') + } - FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { - var carry = 0; - for (var i = 0; i < len; i++) { - carry = carry + (ws[i] | 0); + var buf + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array) + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset) + } else { + buf = new Uint8Array(array, byteOffset, length) + } - rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; - rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; - } + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype + return buf +} - // Pad with zeroes - for (i = 2 * len; i < N; ++i) { - rws[i] = 0; +function fromObject (obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + var buf = createBuffer(len) + + if (buf.length === 0) { + return buf } - assert(carry === 0); - assert((carry & ~0x1fff) === 0); - }; + obj.copy(buf, 0, 0, len) + return buf + } - FFTM.prototype.stub = function stub (N) { - var ph = new Array(N); - for (var i = 0; i < N; i++) { - ph[i] = 0; + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) } + return fromArrayLike(obj) + } - return ph; - }; + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } +} - FFTM.prototype.mulp = function mulp (x, y, out) { - var N = 2 * this.guessLen13b(x.length, y.length); +function checked (length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') + } + return length | 0 +} - var rbt = this.makeRBT(N); +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} - var _ = this.stub(N); +Buffer.isBuffer = function isBuffer (b) { + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false +} - var rws = new Array(N); - var rwst = new Array(N); - var iwst = new Array(N); +Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) + } - var nrws = new Array(N); - var nrwst = new Array(N); - var niwst = new Array(N); + if (a === b) return 0 - var rmws = out.words; - rmws.length = N; + var x = a.length + var y = b.length - this.convert13b(x.words, x.length, rws, N); - this.convert13b(y.words, y.length, nrws, N); + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } - this.transform(rws, _, rwst, iwst, N, rbt); - this.transform(nrws, _, nrwst, niwst, N, rbt); + if (x < y) return -1 + if (y < x) return 1 + return 0 +} - for (var i = 0; i < N; i++) { - var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; - iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; - rwst[i] = rx; - } +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} - this.conjugate(rwst, iwst, N); - this.transform(rwst, iwst, rmws, _, N, rbt); - this.conjugate(rmws, _, N); - this.normalize13b(rmws, N); +Buffer.concat = function concat (list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } - out.negative = x.negative ^ y.negative; - out.length = x.length + y.length; - return out.strip(); - }; + if (list.length === 0) { + return Buffer.alloc(0) + } - // Multiply `this` by `num` - BN.prototype.mul = function mul (num) { - var out = new BN(null); - out.words = new Array(this.length + num.length); - return this.mulTo(num, out); - }; + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } - // Multiply employing FFT - BN.prototype.mulf = function mulf (num) { - var out = new BN(null); - out.words = new Array(this.length + num.length); - return jumboMulTo(this, num, out); - }; + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf) + } + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} - // In-place Multiplication - BN.prototype.imul = function imul (num) { - return this.clone().mulTo(num, this); - }; +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) + } - BN.prototype.imuln = function imuln (num) { - assert(typeof num === 'number'); - assert(num < 0x4000000); + var len = string.length + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 - // Carry - var carry = 0; - for (var i = 0; i < this.length; i++) { - var w = (this.words[i] | 0) * num; - var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); - carry >>= 26; - carry += (w / 0x4000000) | 0; - // NOTE: lo is 27bit maximum - carry += lo >>> 26; - this.words[i] = lo & 0x3ffffff; + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } + encoding = ('' + encoding).toLowerCase() + loweredCase = true } + } +} +Buffer.byteLength = byteLength - if (carry !== 0) { - this.words[i] = carry; - this.length++; - } +function slowToString (encoding, start, end) { + var loweredCase = false - return this; - }; + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. - BN.prototype.muln = function muln (num) { - return this.clone().imuln(num); - }; + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } - // `this` * `this` - BN.prototype.sqr = function sqr () { - return this.mul(this); - }; + if (end === undefined || end > this.length) { + end = this.length + } - // `this` * `this` in-place - BN.prototype.isqr = function isqr () { - return this.imul(this.clone()); - }; + if (end <= 0) { + return '' + } - // Math.pow(`this`, `num`) - BN.prototype.pow = function pow (num) { - var w = toBitArray(num); - if (w.length === 0) return new BN(1); + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 - // Skip leading zeroes - var res = this; - for (var i = 0; i < w.length; i++, res = res.sqr()) { - if (w[i] !== 0) break; - } + if (end <= start) { + return '' + } - if (++i < w.length) { - for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { - if (w[i] === 0) continue; + if (!encoding) encoding = 'utf8' - res = res.mul(q); - } - } + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) - return res; - }; + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) - // Shift-left in-place - BN.prototype.iushln = function iushln (bits) { - assert(typeof bits === 'number' && bits >= 0); - var r = bits % 26; - var s = (bits - r) / 26; - var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); - var i; + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) - if (r !== 0) { - var carry = 0; + case 'base64': + return base64Slice(this, start, end) - for (i = 0; i < this.length; i++) { - var newCarry = this.words[i] & carryMask; - var c = ((this.words[i] | 0) - newCarry) << r; - this.words[i] = c | carry; - carry = newCarry >>> (26 - r); - } + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) - if (carry) { - this.words[i] = carry; - this.length++; - } + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true } + } +} - if (s !== 0) { - for (i = this.length - 1; i >= 0; i--) { - this.words[i + s] = this.words[i]; - } +// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 +Buffer.prototype._isBuffer = true - for (i = 0; i < s; i++) { - this.words[i] = 0; - } +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} - this.length += s; - } +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} - return this.strip(); - }; +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} - BN.prototype.ishln = function ishln (bits) { - // TODO(indutny): implement me - assert(this.negative === 0); - return this.iushln(bits); - }; +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} - // Shift-right in-place - // NOTE: `hint` is a lowest bit before trailing zeroes - // NOTE: if `extended` is present - it will be filled with destroyed bits - BN.prototype.iushrn = function iushrn (bits, hint, extended) { - assert(typeof bits === 'number' && bits >= 0); - var h; - if (hint) { - h = (hint - (hint % 26)) / 26; - } else { - h = 0; - } +Buffer.prototype.toString = function toString () { + var length = this.length + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} - var r = bits % 26; - var s = Math.min((bits - r) / 26, this.length); - var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); - var maskedWords = extended; +Buffer.prototype.toLocaleString = Buffer.prototype.toString - h -= s; - h = Math.max(0, h); +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} - // Extended mode, copy masked part - if (maskedWords) { - for (var i = 0; i < s; i++) { - maskedWords.words[i] = this.words[i]; - } - maskedWords.length = s; - } +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' + return '' +} - if (s === 0) { - // No-op, we should not move anything at all - } else if (this.length > s) { - this.length -= s; - for (i = 0; i < this.length; i++) { - this.words[i] = this.words[i + s]; - } - } else { - this.words[0] = 0; - this.length = 1; - } +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } + if (!Buffer.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) + } - var carry = 0; - for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { - var word = this.words[i] | 0; - this.words[i] = (carry << (26 - r)) | (word >>> r); - carry = word & mask; - } + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } - // Push carried bits as a mask - if (maskedWords && carry !== 0) { - maskedWords.words[maskedWords.length++] = carry; - } + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } - if (this.length === 0) { - this.words[0] = 0; - this.length = 1; - } + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } - return this.strip(); - }; + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 - BN.prototype.ishrn = function ishrn (bits, hint, extended) { - // TODO(indutny): implement me - assert(this.negative === 0); - return this.iushrn(bits, hint, extended); - }; + if (this === target) return 0 - // Shift-left - BN.prototype.shln = function shln (bits) { - return this.clone().ishln(bits); - }; + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) - BN.prototype.ushln = function ushln (bits) { - return this.clone().iushln(bits); - }; + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) - // Shift-right - BN.prototype.shrn = function shrn (bits) { - return this.clone().ishrn(bits); - }; + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } - BN.prototype.ushrn = function ushrn (bits) { - return this.clone().iushrn(bits); - }; + if (x < y) return -1 + if (y < x) return 1 + return 0 +} - // Test if n bit is set - BN.prototype.testn = function testn (bit) { - assert(typeof bit === 'number' && bit >= 0); - var r = bit % 26; - var s = (bit - r) / 26; - var q = 1 << r; +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } - // Fast case: bit is much higher than all existing words - if (this.length <= s) return false; + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } - // Check bit and return - var w = this.words[s]; + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } - return !!(w & q); - }; + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } - // Return only lowers bits of number (in-place) - BN.prototype.imaskn = function imaskn (bits) { - assert(typeof bits === 'number' && bits >= 0); - var r = bits % 26; - var s = (bits - r) / 26; + throw new TypeError('val must be string, number or Buffer') +} - assert(this.negative === 0, 'imaskn works only with positive numbers'); +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length - if (this.length <= s) { - return this; + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 } + } - if (r !== 0) { - s++; + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) } - this.length = Math.min(s, this.length); + } - if (r !== 0) { - var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); - this.words[this.length - 1] &= mask; + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i } + } - return this.strip(); - }; + return -1 +} - // Return only lowers bits of number - BN.prototype.maskn = function maskn (bits) { - return this.clone().imaskn(bits); - }; +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} - // Add plain number `num` to `this` - BN.prototype.iaddn = function iaddn (num) { - assert(typeof num === 'number'); - assert(num < 0x4000000); - if (num < 0) return this.isubn(-num); +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} - // Possible sign change - if (this.negative !== 0) { - if (this.length === 1 && (this.words[0] | 0) < num) { - this.words[0] = num - (this.words[0] | 0); - this.negative = 0; - return this; - } +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} - this.negative = 0; - this.isubn(num); - this.negative = 1; - return this; +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining } + } - // Add without checks - return this._iaddn(num); - }; + var strLen = string.length - BN.prototype._iaddn = function _iaddn (num) { - this.words[0] += num; + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (numberIsNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} - // Carry - for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { - this.words[i] -= 0x4000000; - if (i === this.length - 1) { - this.words[i + 1] = 1; - } else { - this.words[i + 1]++; - } - } - this.length = Math.max(this.length, i + 1); +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} - return this; - }; +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} - // Subtract plain number `num` from `this` - BN.prototype.isubn = function isubn (num) { - assert(typeof num === 'number'); - assert(num < 0x4000000); - if (num < 0) return this.iaddn(-num); +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} - if (this.negative !== 0) { - this.negative = 0; - this.iaddn(num); - this.negative = 1; - return this; - } +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} - this.words[0] -= num; +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} - if (this.length === 1 && this.words[0] < 0) { - this.words[0] = -this.words[0]; - this.negative = 1; +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0 + if (isFinite(length)) { + length = length >>> 0 + if (encoding === undefined) encoding = 'utf8' } else { - // Carry - for (var i = 0; i < this.length && this.words[i] < 0; i++) { - this.words[i] += 0x4000000; - this.words[i + 1] -= 1; - } + encoding = length + length = undefined } + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } - return this.strip(); - }; - - BN.prototype.addn = function addn (num) { - return this.clone().iaddn(num); - }; + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining - BN.prototype.subn = function subn (num) { - return this.clone().isubn(num); - }; + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } - BN.prototype.iabs = function iabs () { - this.negative = 0; + if (!encoding) encoding = 'utf8' - return this; - }; + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) - BN.prototype.abs = function abs () { - return this.clone().iabs(); - }; + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) - BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { - var len = num.length + shift; - var i; + case 'ascii': + return asciiWrite(this, string, offset, length) - this._expand(len); + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) - var w; - var carry = 0; - for (i = 0; i < num.length; i++) { - w = (this.words[i + shift] | 0) + carry; - var right = (num.words[i] | 0) * mul; - w -= right & 0x3ffffff; - carry = (w >> 26) - ((right / 0x4000000) | 0); - this.words[i + shift] = w & 0x3ffffff; - } - for (; i < this.length - shift; i++) { - w = (this.words[i + shift] | 0) + carry; - carry = w >> 26; - this.words[i + shift] = w & 0x3ffffff; - } + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) - if (carry === 0) return this.strip(); + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) - // Subtraction overflow - assert(carry === -1); - carry = 0; - for (i = 0; i < this.length; i++) { - w = -(this.words[i] | 0) + carry; - carry = w >> 26; - this.words[i] = w & 0x3ffffff; + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true } - this.negative = 1; + } +} - return this.strip(); - }; +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} - BN.prototype._wordDiv = function _wordDiv (num, mode) { - var shift = this.length - num.length; +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} - var a = this.clone(); - var b = num; +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] - // Normalize - var bhi = b.words[b.length - 1] | 0; - var bhiBits = this._countBits(bhi); - shift = 26 - bhiBits; - if (shift !== 0) { - b = b.ushln(shift); - a.iushln(shift); - bhi = b.words[b.length - 1] | 0; - } + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 - // Initialize quotient - var m = a.length - b.length; - var q; + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint - if (mode !== 'mod') { - q = new BN(null); - q.length = m + 1; - q.words = new Array(q.length); - for (var i = 0; i < q.length; i++) { - q.words[i] = 0; + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } } } - var diff = a.clone()._ishlnsubmul(b, 1, m); - if (diff.negative === 0) { - a = diff; - if (q) { - q.words[m] = 1; - } + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF } - for (var j = m - 1; j >= 0; j--) { - var qj = (a.words[b.length + j] | 0) * 0x4000000 + - (a.words[b.length + j - 1] | 0); + res.push(codePoint) + i += bytesPerSequence + } - // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max - // (0x7ffffff) - qj = Math.min((qj / bhi) | 0, 0x3ffffff); + return decodeCodePointsArray(res) +} - a._ishlnsubmul(b, qj, j); - while (a.negative !== 0) { - qj--; - a.negative = 0; - a._ishlnsubmul(b, 1, j); - if (!a.isZero()) { - a.negative ^= 1; - } - } - if (q) { - q.words[j] = qj; - } - } - if (q) { - q.strip(); - } - a.strip(); +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 - // Denormalize - if (mode !== 'div' && shift !== 0) { - a.iushrn(shift); - } +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } - return { - div: q || null, - mod: a - }; - }; + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} - // NOTE: 1) `mode` can be set to `mod` to request mod only, - // to `div` to request div only, or be absent to - // request both div & mod - // 2) `positive` is true if unsigned mod is requested - BN.prototype.divmod = function divmod (num, mode, positive) { - assert(!num.isZero()); +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} - if (this.isZero()) { - return { - div: new BN(0), - mod: new BN(0) - }; - } +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) + } + return res +} - var div, mod, res; - if (this.negative !== 0 && num.negative === 0) { - res = this.neg().divmod(num, mode); +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end - if (mode !== 'mod') { - div = res.div.neg(); - } + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } - if (mode !== 'div') { - mod = res.mod.neg(); - if (positive && mod.negative !== 0) { - mod.iadd(num); - } - } + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } - return { - div: div, - mod: mod - }; - } + if (end < start) end = start - if (this.negative === 0 && num.negative !== 0) { - res = this.divmod(num.neg(), mode); + var newBuf = this.subarray(start, end) + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype + return newBuf +} - if (mode !== 'mod') { - div = res.div.neg(); - } +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} - return { - div: div, - mod: res.mod - }; - } +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) - if ((this.negative & num.negative) !== 0) { - res = this.neg().divmod(num.neg(), mode); + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } - if (mode !== 'div') { - mod = res.mod.neg(); - if (positive && mod.negative !== 0) { - mod.isub(num); - } - } + return val +} - return { - div: res.div, - mod: mod - }; - } +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } - // Both numbers are positive at this point + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } - // Strip both numbers to approximate shift value - if (num.length > this.length || this.cmp(num) < 0) { - return { - div: new BN(0), - mod: this - }; - } + return val +} - // Very short reduction - if (num.length === 1) { - if (mode === 'div') { - return { - div: this.divn(num.words[0]), - mod: null - }; - } +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} - if (mode === 'mod') { - return { - div: null, - mod: new BN(this.modn(num.words[0])) - }; - } +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} - return { - div: this.divn(num.words[0]), - mod: new BN(this.modn(num.words[0])) - }; - } +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} - return this._wordDiv(num, mode); - }; +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) - // Find `this` / `num` - BN.prototype.div = function div (num) { - return this.divmod(num, 'div', false).div; - }; + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} - // Find `this` % `num` - BN.prototype.mod = function mod (num) { - return this.divmod(num, 'mod', false).mod; - }; +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) - BN.prototype.umod = function umod (num) { - return this.divmod(num, 'mod', true).mod; - }; + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} - // Find Round(`this` / `num`) - BN.prototype.divRound = function divRound (num) { - var dm = this.divmod(num); +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) - // Fast case - exact division - if (dm.mod.isZero()) return dm.div; + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 - var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + if (val >= mul) val -= Math.pow(2, 8 * byteLength) - var half = num.ushrn(1); - var r2 = num.andln(1); - var cmp = mod.cmp(half); + return val +} - // Round down - if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) - // Round up - return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); - }; + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 - BN.prototype.modn = function modn (num) { - assert(num <= 0x3ffffff); - var p = (1 << 26) % num; + if (val >= mul) val -= Math.pow(2, 8 * byteLength) - var acc = 0; - for (var i = this.length - 1; i >= 0; i--) { - acc = (p * acc + (this.words[i] | 0)) % num; - } + return val +} - return acc; - }; +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} - // In-place division by number - BN.prototype.idivn = function idivn (num) { - assert(num <= 0x3ffffff); +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} - var carry = 0; - for (var i = this.length - 1; i >= 0; i--) { - var w = (this.words[i] | 0) + carry * 0x4000000; - this.words[i] = (w / num) | 0; - carry = w % num; - } +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} - return this.strip(); - }; +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) - BN.prototype.divn = function divn (num) { - return this.clone().idivn(num); - }; + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} - BN.prototype.egcd = function egcd (p) { - assert(p.negative === 0); - assert(!p.isZero()); +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) - var x = this; - var y = p.clone(); + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} - if (x.negative !== 0) { - x = x.umod(p); - } else { - x = x.clone(); - } +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} - // A * x + B * y = x - var A = new BN(1); - var B = new BN(0); +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} - // C * x + D * y = y - var C = new BN(0); - var D = new BN(1); +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} - var g = 0; +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} - while (x.isEven() && y.isEven()) { - x.iushrn(1); - y.iushrn(1); - ++g; - } +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} - var yp = y.clone(); - var xp = x.clone(); +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } - while (!x.isZero()) { - for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); - if (i > 0) { - x.iushrn(i); - while (i-- > 0) { - if (A.isOdd() || B.isOdd()) { - A.iadd(yp); - B.isub(xp); - } + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } - A.iushrn(1); - B.iushrn(1); - } - } + return offset + byteLength +} - for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); - if (j > 0) { - y.iushrn(j); - while (j-- > 0) { - if (C.isOdd() || D.isOdd()) { - C.iadd(yp); - D.isub(xp); - } +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } - C.iushrn(1); - D.iushrn(1); - } - } + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } - if (x.cmp(y) >= 0) { - x.isub(y); - A.isub(C); - B.isub(D); - } else { - y.isub(x); - C.isub(A); - D.isub(B); - } - } + return offset + byteLength +} - return { - a: C, - b: D, - gcd: y.iushln(g) - }; - }; +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + this[offset] = (value & 0xff) + return offset + 1 +} - // This is reduced incarnation of the binary EEA - // above, designated to invert members of the - // _prime_ fields F(p) at a maximal speed - BN.prototype._invmp = function _invmp (p) { - assert(p.negative === 0); - assert(!p.isZero()); +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} - var a = this; - var b = p.clone(); +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} - if (a.negative !== 0) { - a = a.umod(p); - } else { - a = a.clone(); - } +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + return offset + 4 +} - var x1 = new BN(1); - var x2 = new BN(0); +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} - var delta = b.clone(); +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) - while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { - for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); - if (i > 0) { - a.iushrn(i); - while (i-- > 0) { - if (x1.isOdd()) { - x1.iadd(delta); - } + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } - x1.iushrn(1); - } - } + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } - for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); - if (j > 0) { - b.iushrn(j); - while (j-- > 0) { - if (x2.isOdd()) { - x2.iadd(delta); - } + return offset + byteLength +} - x2.iushrn(1); - } - } +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) - if (a.cmp(b) >= 0) { - a.isub(b); - x1.isub(x2); - } else { - b.isub(a); - x2.isub(x1); - } - } + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } - var res; - if (a.cmpn(1) === 0) { - res = x1; - } else { - res = x2; + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } - if (res.cmpn(0) < 0) { - res.iadd(p); - } + return offset + byteLength +} - return res; - }; +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} - BN.prototype.gcd = function gcd (num) { - if (this.isZero()) return num.abs(); - if (num.isZero()) return this.abs(); +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} - var a = this.clone(); - var b = num.clone(); - a.negative = 0; - b.negative = 0; +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} - // Remove common factor of two - for (var shift = 0; a.isEven() && b.isEven(); shift++) { - a.iushrn(1); - b.iushrn(1); - } +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + return offset + 4 +} - do { - while (a.isEven()) { - a.iushrn(1); - } - while (b.isEven()) { - b.iushrn(1); - } +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} - var r = a.cmp(b); - if (r < 0) { - // Swap `a` and `b` to make `a` always bigger than `b` - var t = a; - a = b; - b = t; - } else if (r === 0 || b.cmpn(1) === 0) { - break; - } +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} - a.isub(b); - } while (true); +function writeFloat (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} - return b.iushln(shift); - }; +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} - // Invert number in the field F(num) - BN.prototype.invm = function invm (num) { - return this.egcd(num).a.umod(num); - }; +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} - BN.prototype.isEven = function isEven () { - return (this.words[0] & 1) === 0; - }; +function writeDouble (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} - BN.prototype.isOdd = function isOdd () { - return (this.words[0] & 1) === 1; - }; +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} - // And first word and num - BN.prototype.andln = function andln (num) { - return this.words[0] & num; - }; +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} - // Increment at the bit position in-line - BN.prototype.bincn = function bincn (bit) { - assert(typeof bit === 'number'); - var r = bit % 26; - var s = (bit - r) / 26; - var q = 1 << r; +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start - // Fast case: bit is much higher than all existing words - if (this.length <= s) { - this._expand(s + 1); - this.words[s] |= q; - return this; - } + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 - // Add bit and propagate, if needed - var carry = q; - for (var i = s; carry !== 0 && i < this.length; i++) { - var w = this.words[i] | 0; - w += carry; - carry = w >>> 26; - w &= 0x3ffffff; - this.words[i] = w; - } - if (carry !== 0) { - this.words[i] = carry; - this.length++; - } - return this; - }; + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('Index out of range') + if (end < 0) throw new RangeError('sourceEnd out of bounds') - BN.prototype.isZero = function isZero () { - return this.length === 1 && this.words[0] === 0; - }; + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } - BN.prototype.cmpn = function cmpn (num) { - var negative = num < 0; + var len = end - start - if (this.negative !== 0 && !negative) return -1; - if (this.negative === 0 && negative) return 1; + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end) + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ) + } - this.strip(); + return len +} - var res; - if (this.length > 1) { - res = 1; - } else { - if (negative) { - num = -num; +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if ((encoding === 'utf8' && code < 128) || + encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code } - - assert(num <= 0x3ffffff, 'Number is too big'); - - var w = this.words[0] | 0; - res = w === num ? 0 : w < num ? -1 : 1; } - if (this.negative !== 0) return -res | 0; - return res; - }; + } else if (typeof val === 'number') { + val = val & 255 + } - // Compare two numbers and return: - // 1 - if `this` > `num` - // 0 - if `this` == `num` - // -1 - if `this` < `num` - BN.prototype.cmp = function cmp (num) { - if (this.negative !== 0 && num.negative === 0) return -1; - if (this.negative === 0 && num.negative !== 0) return 1; + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } - var res = this.ucmp(num); - if (this.negative !== 0) return -res | 0; - return res; - }; + if (end <= start) { + return this + } - // Unsigned comparison - BN.prototype.ucmp = function ucmp (num) { - // At this point both numbers have the same sign - if (this.length > num.length) return 1; - if (this.length < num.length) return -1; + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 - var res = 0; - for (var i = this.length - 1; i >= 0; i--) { - var a = this.words[i] | 0; - var b = num.words[i] | 0; + if (!val) val = 0 - if (a === b) continue; - if (a < b) { - res = -1; - } else if (a > b) { - res = 1; - } - break; + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val } - return res; - }; + } else { + var bytes = Buffer.isBuffer(val) + ? val + : Buffer.from(val, encoding) + var len = bytes.length + if (len === 0) { + throw new TypeError('The value "' + val + + '" is invalid for argument "value"') + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } - BN.prototype.gtn = function gtn (num) { - return this.cmpn(num) === 1; - }; + return this +} - BN.prototype.gt = function gt (num) { - return this.cmp(num) === 1; - }; +// HELPER FUNCTIONS +// ================ - BN.prototype.gten = function gten (num) { - return this.cmpn(num) >= 0; - }; +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g - BN.prototype.gte = function gte (num) { - return this.cmp(num) >= 0; - }; +function base64clean (str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0] + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} - BN.prototype.ltn = function ltn (num) { - return this.cmpn(num) === -1; - }; +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} - BN.prototype.lt = function lt (num) { - return this.cmp(num) === -1; - }; +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] - BN.prototype.lten = function lten (num) { - return this.cmpn(num) <= 0; - }; + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) - BN.prototype.lte = function lte (num) { - return this.cmp(num) <= 0; - }; + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } - BN.prototype.eqn = function eqn (num) { - return this.cmpn(num) === 0; - }; + // valid lead + leadSurrogate = codePoint - BN.prototype.eq = function eq (num) { - return this.cmp(num) === 0; - }; + continue + } - // - // A reduce context, could be using montgomery or something better, depending - // on the `m` itself. - // - BN.red = function red (num) { - return new Red(num); - }; + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } - BN.prototype.toRed = function toRed (ctx) { - assert(!this.red, 'Already a number in reduction context'); - assert(this.negative === 0, 'red works only with positives'); - return ctx.convertTo(this)._forceRed(ctx); - }; + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } - BN.prototype.fromRed = function fromRed () { - assert(this.red, 'fromRed works only with numbers in reduction context'); - return this.red.convertFrom(this); - }; + leadSurrogate = null - BN.prototype._forceRed = function _forceRed (ctx) { - this.red = ctx; - return this; - }; + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } - BN.prototype.forceRed = function forceRed (ctx) { - assert(!this.red, 'Already a number in reduction context'); - return this._forceRed(ctx); - }; + return bytes +} - BN.prototype.redAdd = function redAdd (num) { - assert(this.red, 'redAdd works only with red numbers'); - return this.red.add(this, num); - }; +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} - BN.prototype.redIAdd = function redIAdd (num) { - assert(this.red, 'redIAdd works only with red numbers'); - return this.red.iadd(this, num); - }; +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break - BN.prototype.redSub = function redSub (num) { - assert(this.red, 'redSub works only with red numbers'); - return this.red.sub(this, num); - }; + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } - BN.prototype.redISub = function redISub (num) { - assert(this.red, 'redISub works only with red numbers'); - return this.red.isub(this, num); - }; + return byteArray +} - BN.prototype.redShl = function redShl (num) { - assert(this.red, 'redShl works only with red numbers'); - return this.red.shl(this, num); - }; +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} - BN.prototype.redMul = function redMul (num) { - assert(this.red, 'redMul works only with red numbers'); - this.red._verify2(this, num); - return this.red.mul(this, num); - }; +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} - BN.prototype.redIMul = function redIMul (num) { - assert(this.red, 'redMul works only with red numbers'); - this.red._verify2(this, num); - return this.red.imul(this, num); - }; +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) +} +function numberIsNaN (obj) { + // For IE11 support + return obj !== obj // eslint-disable-line no-self-compare +} - BN.prototype.redSqr = function redSqr () { - assert(this.red, 'redSqr works only with red numbers'); - this.red._verify1(this); - return this.red.sqr(this); - }; +}).call(this,require("buffer").Buffer) +},{"base64-js":166,"buffer":172,"ieee754":208}],173:[function(require,module,exports){ +'use strict'; - BN.prototype.redISqr = function redISqr () { - assert(this.red, 'redISqr works only with red numbers'); - this.red._verify1(this); - return this.red.isqr(this); - }; +var elliptic = exports; - // Square root over p - BN.prototype.redSqrt = function redSqrt () { - assert(this.red, 'redSqrt works only with red numbers'); - this.red._verify1(this); - return this.red.sqrt(this); - }; +elliptic.version = require('../package.json').version; +elliptic.utils = require('./elliptic/utils'); +elliptic.rand = require('brorand'); +elliptic.curve = require('./elliptic/curve'); +elliptic.curves = require('./elliptic/curves'); - BN.prototype.redInvm = function redInvm () { - assert(this.red, 'redInvm works only with red numbers'); - this.red._verify1(this); - return this.red.invm(this); - }; +// Protocols +elliptic.ec = require('./elliptic/ec'); +elliptic.eddsa = require('./elliptic/eddsa'); - // Return negative clone of `this` % `red modulo` - BN.prototype.redNeg = function redNeg () { - assert(this.red, 'redNeg works only with red numbers'); - this.red._verify1(this); - return this.red.neg(this); - }; +},{"../package.json":189,"./elliptic/curve":176,"./elliptic/curves":179,"./elliptic/ec":180,"./elliptic/eddsa":183,"./elliptic/utils":187,"brorand":170}],174:[function(require,module,exports){ +'use strict'; - BN.prototype.redPow = function redPow (num) { - assert(this.red && !num.red, 'redPow(normalNum)'); - this.red._verify1(this); - return this.red.pow(this, num); - }; +var BN = require('bn.js'); +var utils = require('../utils'); +var getNAF = utils.getNAF; +var getJSF = utils.getJSF; +var assert = utils.assert; - // Prime numbers with efficient reduction - var primes = { - k256: null, - p224: null, - p192: null, - p25519: null - }; +function BaseCurve(type, conf) { + this.type = type; + this.p = new BN(conf.p, 16); - // Pseudo-Mersenne prime - function MPrime (name, p) { - // P = 2 ^ N - K - this.name = name; - this.p = new BN(p, 16); - this.n = this.p.bitLength(); - this.k = new BN(1).iushln(this.n).isub(this.p); + // Use Montgomery, when there is no fast reduction for the prime + this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); - this.tmp = this._tmp(); - } + // Useful for many curves + this.zero = new BN(0).toRed(this.red); + this.one = new BN(1).toRed(this.red); + this.two = new BN(2).toRed(this.red); - MPrime.prototype._tmp = function _tmp () { - var tmp = new BN(null); - tmp.words = new Array(Math.ceil(this.n / 13)); - return tmp; - }; + // Curve configuration, optional + this.n = conf.n && new BN(conf.n, 16); + this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); - MPrime.prototype.ireduce = function ireduce (num) { - // Assumes that `num` is less than `P^2` - // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) - var r = num; - var rlen; + // Temporary arrays + this._wnafT1 = new Array(4); + this._wnafT2 = new Array(4); + this._wnafT3 = new Array(4); + this._wnafT4 = new Array(4); - do { - this.split(r, this.tmp); - r = this.imulK(r); - r = r.iadd(this.tmp); - rlen = r.bitLength(); - } while (rlen > this.n); + this._bitLength = this.n ? this.n.bitLength() : 0; - var cmp = rlen < this.n ? -1 : r.ucmp(this.p); - if (cmp === 0) { - r.words[0] = 0; - r.length = 1; - } else if (cmp > 0) { - r.isub(this.p); - } else { - r.strip(); - } + // Generalized Greg Maxwell's trick + var adjustCount = this.n && this.p.div(this.n); + if (!adjustCount || adjustCount.cmpn(100) > 0) { + this.redN = null; + } else { + this._maxwellTrick = true; + this.redN = this.n.toRed(this.red); + } +} +module.exports = BaseCurve; - return r; - }; +BaseCurve.prototype.point = function point() { + throw new Error('Not implemented'); +}; - MPrime.prototype.split = function split (input, out) { - input.iushrn(this.n, 0, out); - }; +BaseCurve.prototype.validate = function validate() { + throw new Error('Not implemented'); +}; - MPrime.prototype.imulK = function imulK (num) { - return num.imul(this.k); - }; +BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { + assert(p.precomputed); + var doubles = p._getDoubles(); + + var naf = getNAF(k, 1, this._bitLength); + var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); + I /= 3; + + // Translate into more windowed form + var repr = []; + var j; + var nafW; + for (j = 0; j < naf.length; j += doubles.step) { + nafW = 0; + for (var l = j + doubles.step - 1; l >= j; l--) + nafW = (nafW << 1) + naf[l]; + repr.push(nafW); + } - function K256 () { - MPrime.call( - this, - 'k256', - 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); + var a = this.jpoint(null, null, null); + var b = this.jpoint(null, null, null); + for (var i = I; i > 0; i--) { + for (j = 0; j < repr.length; j++) { + nafW = repr[j]; + if (nafW === i) + b = b.mixedAdd(doubles.points[j]); + else if (nafW === -i) + b = b.mixedAdd(doubles.points[j].neg()); + } + a = a.add(b); } - inherits(K256, MPrime); + return a.toP(); +}; - K256.prototype.split = function split (input, output) { - // 256 = 9 * 26 + 22 - var mask = 0x3fffff; +BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { + var w = 4; - var outLen = Math.min(input.length, 9); - for (var i = 0; i < outLen; i++) { - output.words[i] = input.words[i]; - } - output.length = outLen; + // Precompute window + var nafPoints = p._getNAFPoints(w); + w = nafPoints.wnd; + var wnd = nafPoints.points; - if (input.length <= 9) { - input.words[0] = 0; - input.length = 1; - return; - } + // Get NAF form + var naf = getNAF(k, w, this._bitLength); - // Shift by 9 limbs - var prev = input.words[9]; - output.words[output.length++] = prev & mask; + // Add `this`*(N+1) for every w-NAF index + var acc = this.jpoint(null, null, null); + for (var i = naf.length - 1; i >= 0; i--) { + // Count zeroes + for (var l = 0; i >= 0 && naf[i] === 0; i--) + l++; + if (i >= 0) + l++; + acc = acc.dblp(l); - for (i = 10; i < input.length; i++) { - var next = input.words[i] | 0; - input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); - prev = next; - } - prev >>>= 22; - input.words[i - 10] = prev; - if (prev === 0 && input.length > 10) { - input.length -= 10; + if (i < 0) + break; + var z = naf[i]; + assert(z !== 0); + if (p.type === 'affine') { + // J +- P + if (z > 0) + acc = acc.mixedAdd(wnd[(z - 1) >> 1]); + else + acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); } else { - input.length -= 9; + // J +- J + if (z > 0) + acc = acc.add(wnd[(z - 1) >> 1]); + else + acc = acc.add(wnd[(-z - 1) >> 1].neg()); } - }; + } + return p.type === 'affine' ? acc.toP() : acc; +}; - K256.prototype.imulK = function imulK (num) { - // K = 0x1000003d1 = [ 0x40, 0x3d1 ] - num.words[num.length] = 0; - num.words[num.length + 1] = 0; - num.length += 2; +BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, + points, + coeffs, + len, + jacobianResult) { + var wndWidth = this._wnafT1; + var wnd = this._wnafT2; + var naf = this._wnafT3; + + // Fill all arrays + var max = 0; + var i; + var j; + var p; + for (i = 0; i < len; i++) { + p = points[i]; + var nafPoints = p._getNAFPoints(defW); + wndWidth[i] = nafPoints.wnd; + wnd[i] = nafPoints.points; + } - // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 - var lo = 0; - for (var i = 0; i < num.length; i++) { - var w = num.words[i] | 0; - lo += w * 0x3d1; - num.words[i] = lo & 0x3ffffff; - lo = w * 0x40 + ((lo / 0x4000000) | 0); + // Comb small window NAFs + for (i = len - 1; i >= 1; i -= 2) { + var a = i - 1; + var b = i; + if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { + naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength); + naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength); + max = Math.max(naf[a].length, max); + max = Math.max(naf[b].length, max); + continue; + } + + var comb = [ + points[a], /* 1 */ + null, /* 3 */ + null, /* 5 */ + points[b], /* 7 */ + ]; + + // Try to avoid Projective points, if possible + if (points[a].y.cmp(points[b].y) === 0) { + comb[1] = points[a].add(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].add(points[b].neg()); + } else { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } + + var index = [ + -3, /* -1 -1 */ + -1, /* -1 0 */ + -5, /* -1 1 */ + -7, /* 0 -1 */ + 0, /* 0 0 */ + 7, /* 0 1 */ + 5, /* 1 -1 */ + 1, /* 1 0 */ + 3, /* 1 1 */ + ]; + + var jsf = getJSF(coeffs[a], coeffs[b]); + max = Math.max(jsf[0].length, max); + naf[a] = new Array(max); + naf[b] = new Array(max); + for (j = 0; j < max; j++) { + var ja = jsf[0][j] | 0; + var jb = jsf[1][j] | 0; + + naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; + naf[b][j] = 0; + wnd[a] = comb; } + } - // Fast length reduction - if (num.words[num.length - 1] === 0) { - num.length--; - if (num.words[num.length - 1] === 0) { - num.length--; + var acc = this.jpoint(null, null, null); + var tmp = this._wnafT4; + for (i = max; i >= 0; i--) { + var k = 0; + + while (i >= 0) { + var zero = true; + for (j = 0; j < len; j++) { + tmp[j] = naf[j][i] | 0; + if (tmp[j] !== 0) + zero = false; } + if (!zero) + break; + k++; + i--; } - return num; - }; + if (i >= 0) + k++; + acc = acc.dblp(k); + if (i < 0) + break; - function P224 () { - MPrime.call( - this, - 'p224', - 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); + for (j = 0; j < len; j++) { + var z = tmp[j]; + p; + if (z === 0) + continue; + else if (z > 0) + p = wnd[j][(z - 1) >> 1]; + else if (z < 0) + p = wnd[j][(-z - 1) >> 1].neg(); + + if (p.type === 'affine') + acc = acc.mixedAdd(p); + else + acc = acc.add(p); + } } - inherits(P224, MPrime); + // Zeroify references + for (i = 0; i < len; i++) + wnd[i] = null; - function P192 () { - MPrime.call( - this, - 'p192', - 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); - } - inherits(P192, MPrime); + if (jacobianResult) + return acc; + else + return acc.toP(); +}; - function P25519 () { - // 2 ^ 255 - 19 - MPrime.call( - this, - '25519', - '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); - } - inherits(P25519, MPrime); +function BasePoint(curve, type) { + this.curve = curve; + this.type = type; + this.precomputed = null; +} +BaseCurve.BasePoint = BasePoint; - P25519.prototype.imulK = function imulK (num) { - // K = 0x13 - var carry = 0; - for (var i = 0; i < num.length; i++) { - var hi = (num.words[i] | 0) * 0x13 + carry; - var lo = hi & 0x3ffffff; - hi >>>= 26; +BasePoint.prototype.eq = function eq(/*other*/) { + throw new Error('Not implemented'); +}; - num.words[i] = lo; - carry = hi; - } - if (carry !== 0) { - num.words[num.length++] = carry; - } - return num; - }; +BasePoint.prototype.validate = function validate() { + return this.curve.validate(this); +}; - // Exported mostly for testing purposes, use plain name instead - BN._prime = function prime (name) { - // Cached version of prime - if (primes[name]) return primes[name]; +BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + bytes = utils.toArray(bytes, enc); - var prime; - if (name === 'k256') { - prime = new K256(); - } else if (name === 'p224') { - prime = new P224(); - } else if (name === 'p192') { - prime = new P192(); - } else if (name === 'p25519') { - prime = new P25519(); - } else { - throw new Error('Unknown prime ' + name); - } - primes[name] = prime; + var len = this.p.byteLength(); - return prime; - }; + // uncompressed, hybrid-odd, hybrid-even + if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) && + bytes.length - 1 === 2 * len) { + if (bytes[0] === 0x06) + assert(bytes[bytes.length - 1] % 2 === 0); + else if (bytes[0] === 0x07) + assert(bytes[bytes.length - 1] % 2 === 1); - // - // Base reduction engine - // - function Red (m) { - if (typeof m === 'string') { - var prime = BN._prime(m); - this.m = prime.p; - this.prime = prime; - } else { - assert(m.gtn(1), 'modulus must be greater than 1'); - this.m = m; - this.prime = null; - } + var res = this.point(bytes.slice(1, 1 + len), + bytes.slice(1 + len, 1 + 2 * len)); + + return res; + } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && + bytes.length - 1 === len) { + return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03); } + throw new Error('Unknown point format'); +}; - Red.prototype._verify1 = function _verify1 (a) { - assert(a.negative === 0, 'red works only with positives'); - assert(a.red, 'red works only with red numbers'); - }; +BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { + return this.encode(enc, true); +}; - Red.prototype._verify2 = function _verify2 (a, b) { - assert((a.negative | b.negative) === 0, 'red works only with positives'); - assert(a.red && a.red === b.red, - 'red works only with red numbers'); - }; +BasePoint.prototype._encode = function _encode(compact) { + var len = this.curve.p.byteLength(); + var x = this.getX().toArray('be', len); - Red.prototype.imod = function imod (a) { - if (this.prime) return this.prime.ireduce(a)._forceRed(this); - return a.umod(this.m)._forceRed(this); - }; + if (compact) + return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x); - Red.prototype.neg = function neg (a) { - if (a.isZero()) { - return a.clone(); - } + return [ 0x04 ].concat(x, this.getY().toArray('be', len)); +}; - return this.m.sub(a)._forceRed(this); - }; +BasePoint.prototype.encode = function encode(enc, compact) { + return utils.encode(this._encode(compact), enc); +}; - Red.prototype.add = function add (a, b) { - this._verify2(a, b); +BasePoint.prototype.precompute = function precompute(power) { + if (this.precomputed) + return this; - var res = a.add(b); - if (res.cmp(this.m) >= 0) { - res.isub(this.m); - } - return res._forceRed(this); + var precomputed = { + doubles: null, + naf: null, + beta: null, }; + precomputed.naf = this._getNAFPoints(8); + precomputed.doubles = this._getDoubles(4, power); + precomputed.beta = this._getBeta(); + this.precomputed = precomputed; - Red.prototype.iadd = function iadd (a, b) { - this._verify2(a, b); + return this; +}; - var res = a.iadd(b); - if (res.cmp(this.m) >= 0) { - res.isub(this.m); - } - return res; - }; +BasePoint.prototype._hasDoubles = function _hasDoubles(k) { + if (!this.precomputed) + return false; - Red.prototype.sub = function sub (a, b) { - this._verify2(a, b); + var doubles = this.precomputed.doubles; + if (!doubles) + return false; - var res = a.sub(b); - if (res.cmpn(0) < 0) { - res.iadd(this.m); - } - return res._forceRed(this); - }; + return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); +}; - Red.prototype.isub = function isub (a, b) { - this._verify2(a, b); +BasePoint.prototype._getDoubles = function _getDoubles(step, power) { + if (this.precomputed && this.precomputed.doubles) + return this.precomputed.doubles; - var res = a.isub(b); - if (res.cmpn(0) < 0) { - res.iadd(this.m); - } - return res; + var doubles = [ this ]; + var acc = this; + for (var i = 0; i < power; i += step) { + for (var j = 0; j < step; j++) + acc = acc.dbl(); + doubles.push(acc); + } + return { + step: step, + points: doubles, }; +}; - Red.prototype.shl = function shl (a, num) { - this._verify1(a); - return this.imod(a.ushln(num)); - }; +BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { + if (this.precomputed && this.precomputed.naf) + return this.precomputed.naf; - Red.prototype.imul = function imul (a, b) { - this._verify2(a, b); - return this.imod(a.imul(b)); + var res = [ this ]; + var max = (1 << wnd) - 1; + var dbl = max === 1 ? null : this.dbl(); + for (var i = 1; i < max; i++) + res[i] = res[i - 1].add(dbl); + return { + wnd: wnd, + points: res, }; +}; - Red.prototype.mul = function mul (a, b) { - this._verify2(a, b); - return this.imod(a.mul(b)); - }; +BasePoint.prototype._getBeta = function _getBeta() { + return null; +}; - Red.prototype.isqr = function isqr (a) { - return this.imul(a, a.clone()); - }; +BasePoint.prototype.dblp = function dblp(k) { + var r = this; + for (var i = 0; i < k; i++) + r = r.dbl(); + return r; +}; - Red.prototype.sqr = function sqr (a) { - return this.mul(a, a); - }; +},{"../utils":187,"bn.js":169}],175:[function(require,module,exports){ +'use strict'; - Red.prototype.sqrt = function sqrt (a) { - if (a.isZero()) return a.clone(); +var utils = require('../utils'); +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = require('./base'); - var mod3 = this.m.andln(3); - assert(mod3 % 2 === 1); +var assert = utils.assert; - // Fast case - if (mod3 === 3) { - var pow = this.m.add(new BN(1)).iushrn(2); - return this.pow(a, pow); - } +function EdwardsCurve(conf) { + // NOTE: Important as we are creating point in Base.call() + this.twisted = (conf.a | 0) !== 1; + this.mOneA = this.twisted && (conf.a | 0) === -1; + this.extended = this.mOneA; - // Tonelli-Shanks algorithm (Totally unoptimized and slow) - // - // Find Q and S, that Q * 2 ^ S = (P - 1) - var q = this.m.subn(1); - var s = 0; - while (!q.isZero() && q.andln(1) === 0) { - s++; - q.iushrn(1); - } - assert(!q.isZero()); + Base.call(this, 'edwards', conf); - var one = new BN(1).toRed(this); - var nOne = one.redNeg(); + this.a = new BN(conf.a, 16).umod(this.red.m); + this.a = this.a.toRed(this.red); + this.c = new BN(conf.c, 16).toRed(this.red); + this.c2 = this.c.redSqr(); + this.d = new BN(conf.d, 16).toRed(this.red); + this.dd = this.d.redAdd(this.d); - // Find quadratic non-residue - // NOTE: Max is such because of generalized Riemann hypothesis. - var lpow = this.m.subn(1).iushrn(1); - var z = this.m.bitLength(); - z = new BN(2 * z * z).toRed(this); + assert(!this.twisted || this.c.fromRed().cmpn(1) === 0); + this.oneC = (conf.c | 0) === 1; +} +inherits(EdwardsCurve, Base); +module.exports = EdwardsCurve; + +EdwardsCurve.prototype._mulA = function _mulA(num) { + if (this.mOneA) + return num.redNeg(); + else + return this.a.redMul(num); +}; - while (this.pow(z, lpow).cmp(nOne) !== 0) { - z.redIAdd(nOne); - } +EdwardsCurve.prototype._mulC = function _mulC(num) { + if (this.oneC) + return num; + else + return this.c.redMul(num); +}; - var c = this.pow(z, q); - var r = this.pow(a, q.addn(1).iushrn(1)); - var t = this.pow(a, q); - var m = s; - while (t.cmp(one) !== 0) { - var tmp = t; - for (var i = 0; tmp.cmp(one) !== 0; i++) { - tmp = tmp.redSqr(); - } - assert(i < m); - var b = this.pow(c, new BN(1).iushln(m - i - 1)); +// Just for compatibility with Short curve +EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { + return this.point(x, y, z, t); +}; - r = r.redMul(b); - c = b.redSqr(); - t = t.redMul(c); - m = i; - } +EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new BN(x, 16); + if (!x.red) + x = x.toRed(this.red); - return r; - }; + var x2 = x.redSqr(); + var rhs = this.c2.redSub(this.a.redMul(x2)); + var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); - Red.prototype.invm = function invm (a) { - var inv = a._invmp(this.m); - if (inv.negative !== 0) { - inv.negative = 0; - return this.imod(inv).redNeg(); - } else { - return this.imod(inv); - } - }; + var y2 = rhs.redMul(lhs.redInvm()); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error('invalid point'); - Red.prototype.pow = function pow (a, num) { - if (num.isZero()) return new BN(1).toRed(this); - if (num.cmpn(1) === 0) return a.clone(); + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); - var windowSize = 4; - var wnd = new Array(1 << windowSize); - wnd[0] = new BN(1).toRed(this); - wnd[1] = a; - for (var i = 2; i < wnd.length; i++) { - wnd[i] = this.mul(wnd[i - 1], a); - } + return this.point(x, y); +}; - var res = wnd[0]; - var current = 0; - var currentLen = 0; - var start = num.bitLength() % 26; - if (start === 0) { - start = 26; - } +EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { + y = new BN(y, 16); + if (!y.red) + y = y.toRed(this.red); + + // x^2 = (y^2 - c^2) / (c^2 d y^2 - a) + var y2 = y.redSqr(); + var lhs = y2.redSub(this.c2); + var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a); + var x2 = lhs.redMul(rhs.redInvm()); + + if (x2.cmp(this.zero) === 0) { + if (odd) + throw new Error('invalid point'); + else + return this.point(this.zero, y); + } - for (i = num.length - 1; i >= 0; i--) { - var word = num.words[i]; - for (var j = start - 1; j >= 0; j--) { - var bit = (word >> j) & 1; - if (res !== wnd[0]) { - res = this.sqr(res); - } + var x = x2.redSqrt(); + if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) + throw new Error('invalid point'); - if (bit === 0 && current === 0) { - currentLen = 0; - continue; - } + if (x.fromRed().isOdd() !== odd) + x = x.redNeg(); - current <<= 1; - current |= bit; - currentLen++; - if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + return this.point(x, y); +}; - res = this.mul(res, wnd[current]); - currentLen = 0; - current = 0; - } - start = 26; - } +EdwardsCurve.prototype.validate = function validate(point) { + if (point.isInfinity()) + return true; - return res; - }; + // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2) + point.normalize(); - Red.prototype.convertTo = function convertTo (num) { - var r = num.umod(this.m); + var x2 = point.x.redSqr(); + var y2 = point.y.redSqr(); + var lhs = x2.redMul(this.a).redAdd(y2); + var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); - return r === num ? r.clone() : r; - }; + return lhs.cmp(rhs) === 0; +}; - Red.prototype.convertFrom = function convertFrom (num) { - var res = num.clone(); - res.red = null; - return res; - }; +function Point(curve, x, y, z, t) { + Base.BasePoint.call(this, curve, 'projective'); + if (x === null && y === null && z === null) { + this.x = this.curve.zero; + this.y = this.curve.one; + this.z = this.curve.one; + this.t = this.curve.zero; + this.zOne = true; + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + this.z = z ? new BN(z, 16) : this.curve.one; + this.t = t && new BN(t, 16); + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + if (this.t && !this.t.red) + this.t = this.t.toRed(this.curve.red); + this.zOne = this.z === this.curve.one; + + // Use extended coordinates + if (this.curve.extended && !this.t) { + this.t = this.x.redMul(this.y); + if (!this.zOne) + this.t = this.t.redMul(this.z.redInvm()); + } + } +} +inherits(Point, Base.BasePoint); - // - // Montgomery method engine - // +EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { + return Point.fromJSON(this, obj); +}; - BN.mont = function mont (num) { - return new Mont(num); - }; +EdwardsCurve.prototype.point = function point(x, y, z, t) { + return new Point(this, x, y, z, t); +}; - function Mont (m) { - Red.call(this, m); +Point.fromJSON = function fromJSON(curve, obj) { + return new Point(curve, obj[0], obj[1], obj[2]); +}; - this.shift = this.m.bitLength(); - if (this.shift % 26 !== 0) { - this.shift += 26 - (this.shift % 26); - } +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; - this.r = new BN(1).iushln(this.shift); - this.r2 = this.imod(this.r.sqr()); - this.rinv = this.r._invmp(this.m); +Point.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.x.cmpn(0) === 0 && + (this.y.cmp(this.z) === 0 || + (this.zOne && this.y.cmp(this.curve.c) === 0)); +}; - this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); - this.minv = this.minv.umod(this.r); - this.minv = this.r.sub(this.minv); +Point.prototype._extDbl = function _extDbl() { + // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html + // #doubling-dbl-2008-hwcd + // 4M + 4S + + // A = X1^2 + var a = this.x.redSqr(); + // B = Y1^2 + var b = this.y.redSqr(); + // C = 2 * Z1^2 + var c = this.z.redSqr(); + c = c.redIAdd(c); + // D = a * A + var d = this.curve._mulA(a); + // E = (X1 + Y1)^2 - A - B + var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); + // G = D + B + var g = d.redAdd(b); + // F = G - C + var f = g.redSub(c); + // H = D - B + var h = d.redSub(b); + // X3 = E * F + var nx = e.redMul(f); + // Y3 = G * H + var ny = g.redMul(h); + // T3 = E * H + var nt = e.redMul(h); + // Z3 = F * G + var nz = f.redMul(g); + return this.curve.point(nx, ny, nz, nt); +}; + +Point.prototype._projDbl = function _projDbl() { + // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html + // #doubling-dbl-2008-bbjlp + // #doubling-dbl-2007-bl + // and others + // Generally 3M + 4S or 2M + 4S + + // B = (X1 + Y1)^2 + var b = this.x.redAdd(this.y).redSqr(); + // C = X1^2 + var c = this.x.redSqr(); + // D = Y1^2 + var d = this.y.redSqr(); + + var nx; + var ny; + var nz; + var e; + var h; + var j; + if (this.curve.twisted) { + // E = a * C + e = this.curve._mulA(c); + // F = E + D + var f = e.redAdd(d); + if (this.zOne) { + // X3 = (B - C - D) * (F - 2) + nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); + // Y3 = F * (E - D) + ny = f.redMul(e.redSub(d)); + // Z3 = F^2 - 2 * F + nz = f.redSqr().redSub(f).redSub(f); + } else { + // H = Z1^2 + h = this.z.redSqr(); + // J = F - 2 * H + j = f.redSub(h).redISub(h); + // X3 = (B-C-D)*J + nx = b.redSub(c).redISub(d).redMul(j); + // Y3 = F * (E - D) + ny = f.redMul(e.redSub(d)); + // Z3 = F * J + nz = f.redMul(j); + } + } else { + // E = C + D + e = c.redAdd(d); + // H = (c * Z1)^2 + h = this.curve._mulC(this.z).redSqr(); + // J = E - 2 * H + j = e.redSub(h).redSub(h); + // X3 = c * (B - E) * J + nx = this.curve._mulC(b.redISub(e)).redMul(j); + // Y3 = c * E * (C - D) + ny = this.curve._mulC(e).redMul(c.redISub(d)); + // Z3 = E * J + nz = e.redMul(j); } - inherits(Mont, Red); + return this.curve.point(nx, ny, nz); +}; - Mont.prototype.convertTo = function convertTo (num) { - return this.imod(num.ushln(this.shift)); - }; +Point.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; - Mont.prototype.convertFrom = function convertFrom (num) { - var r = this.imod(num.mul(this.rinv)); - r.red = null; - return r; - }; + // Double in extended coordinates + if (this.curve.extended) + return this._extDbl(); + else + return this._projDbl(); +}; - Mont.prototype.imul = function imul (a, b) { - if (a.isZero() || b.isZero()) { - a.words[0] = 0; - a.length = 1; - return a; - } +Point.prototype._extAdd = function _extAdd(p) { + // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html + // #addition-add-2008-hwcd-3 + // 8M + + // A = (Y1 - X1) * (Y2 - X2) + var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); + // B = (Y1 + X1) * (Y2 + X2) + var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); + // C = T1 * k * T2 + var c = this.t.redMul(this.curve.dd).redMul(p.t); + // D = Z1 * 2 * Z2 + var d = this.z.redMul(p.z.redAdd(p.z)); + // E = B - A + var e = b.redSub(a); + // F = D - C + var f = d.redSub(c); + // G = D + C + var g = d.redAdd(c); + // H = B + A + var h = b.redAdd(a); + // X3 = E * F + var nx = e.redMul(f); + // Y3 = G * H + var ny = g.redMul(h); + // T3 = E * H + var nt = e.redMul(h); + // Z3 = F * G + var nz = f.redMul(g); + return this.curve.point(nx, ny, nz, nt); +}; + +Point.prototype._projAdd = function _projAdd(p) { + // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html + // #addition-add-2008-bbjlp + // #addition-add-2007-bl + // 10M + 1S + + // A = Z1 * Z2 + var a = this.z.redMul(p.z); + // B = A^2 + var b = a.redSqr(); + // C = X1 * X2 + var c = this.x.redMul(p.x); + // D = Y1 * Y2 + var d = this.y.redMul(p.y); + // E = d * C * D + var e = this.curve.d.redMul(c).redMul(d); + // F = B - E + var f = b.redSub(e); + // G = B + E + var g = b.redAdd(e); + // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D) + var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); + var nx = a.redMul(f).redMul(tmp); + var ny; + var nz; + if (this.curve.twisted) { + // Y3 = A * G * (D - a * C) + ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); + // Z3 = F * G + nz = f.redMul(g); + } else { + // Y3 = A * G * (D - C) + ny = a.redMul(g).redMul(d.redSub(c)); + // Z3 = c * F * G + nz = this.curve._mulC(f).redMul(g); + } + return this.curve.point(nx, ny, nz); +}; + +Point.prototype.add = function add(p) { + if (this.isInfinity()) + return p; + if (p.isInfinity()) + return this; + + if (this.curve.extended) + return this._extAdd(p); + else + return this._projAdd(p); +}; - var t = a.imul(b); - var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); - var u = t.isub(c).iushrn(this.shift); - var res = u; +Point.prototype.mul = function mul(k) { + if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else + return this.curve._wnafMul(this, k); +}; - if (u.cmp(this.m) >= 0) { - res = u.isub(this.m); - } else if (u.cmpn(0) < 0) { - res = u.iadd(this.m); - } +Point.prototype.mulAdd = function mulAdd(k1, p, k2) { + return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false); +}; - return res._forceRed(this); - }; +Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) { + return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true); +}; - Mont.prototype.mul = function mul (a, b) { - if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); +Point.prototype.normalize = function normalize() { + if (this.zOne) + return this; - var t = a.mul(b); - var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); - var u = t.isub(c).iushrn(this.shift); - var res = u; - if (u.cmp(this.m) >= 0) { - res = u.isub(this.m); - } else if (u.cmpn(0) < 0) { - res = u.iadd(this.m); - } + // Normalize coordinates + var zi = this.z.redInvm(); + this.x = this.x.redMul(zi); + this.y = this.y.redMul(zi); + if (this.t) + this.t = this.t.redMul(zi); + this.z = this.curve.one; + this.zOne = true; + return this; +}; - return res._forceRed(this); - }; +Point.prototype.neg = function neg() { + return this.curve.point(this.x.redNeg(), + this.y, + this.z, + this.t && this.t.redNeg()); +}; - Mont.prototype.invm = function invm (a) { - // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R - var res = this.imod(a._invmp(this.m).mul(this.r2)); - return res._forceRed(this); - }; -})(typeof module === 'undefined' || module, this); +Point.prototype.getX = function getX() { + this.normalize(); + return this.x.fromRed(); +}; -},{"buffer":19}],19:[function(require,module,exports){ +Point.prototype.getY = function getY() { + this.normalize(); + return this.y.fromRed(); +}; -},{}],20:[function(require,module,exports){ -(function (Buffer){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -/* eslint-disable no-proto */ +Point.prototype.eq = function eq(other) { + return this === other || + this.getX().cmp(other.getX()) === 0 && + this.getY().cmp(other.getY()) === 0; +}; -'use strict' +Point.prototype.eqXToP = function eqXToP(x) { + var rx = x.toRed(this.curve.red).redMul(this.z); + if (this.x.cmp(rx) === 0) + return true; -var base64 = require('base64-js') -var ieee754 = require('ieee754') + var xc = x.clone(); + var t = this.curve.redN.redMul(this.z); + for (;;) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; + } +}; -var K_MAX_LENGTH = 0x7fffffff -exports.kMaxLength = K_MAX_LENGTH +// Compatibility with BaseCurve +Point.prototype.toP = Point.prototype.normalize; +Point.prototype.mixedAdd = Point.prototype.add; -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Print warning and recommend using `buffer` v4.x which has an Object - * implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * We report that the browser does not support typed arrays if the are not subclassable - * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` - * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support - * for __proto__ and has a buggy typed array implementation. - */ -Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() +},{"../utils":187,"./base":174,"bn.js":169,"inherits":188}],176:[function(require,module,exports){ +'use strict'; -if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && - typeof console.error === 'function') { - console.error( - 'This browser lacks typed array (Uint8Array) support which is required by ' + - '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' - ) -} +var curve = exports; -function typedArraySupport () { - // Can typed array instances can be augmented? - try { - var arr = new Uint8Array(1) - arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } - return arr.foo() === 42 - } catch (e) { - return false - } -} +curve.base = require('./base'); +curve.short = require('./short'); +curve.mont = require('./mont'); +curve.edwards = require('./edwards'); -Object.defineProperty(Buffer.prototype, 'parent', { - enumerable: true, - get: function () { - if (!Buffer.isBuffer(this)) return undefined - return this.buffer - } -}) +},{"./base":174,"./edwards":175,"./mont":177,"./short":178}],177:[function(require,module,exports){ +'use strict'; -Object.defineProperty(Buffer.prototype, 'offset', { - enumerable: true, - get: function () { - if (!Buffer.isBuffer(this)) return undefined - return this.byteOffset - } -}) +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = require('./base'); -function createBuffer (length) { - if (length > K_MAX_LENGTH) { - throw new RangeError('The value "' + length + '" is invalid for option "size"') - } - // Return an augmented `Uint8Array` instance - var buf = new Uint8Array(length) - buf.__proto__ = Buffer.prototype - return buf -} +var utils = require('../utils'); -/** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ +function MontCurve(conf) { + Base.call(this, 'mont', conf); -function Buffer (arg, encodingOrOffset, length) { - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new TypeError( - 'The "string" argument must be of type string. Received type number' - ) - } - return allocUnsafe(arg) - } - return from(arg, encodingOrOffset, length) + this.a = new BN(conf.a, 16).toRed(this.red); + this.b = new BN(conf.b, 16).toRed(this.red); + this.i4 = new BN(4).toRed(this.red).redInvm(); + this.two = new BN(2).toRed(this.red); + this.a24 = this.i4.redMul(this.a.redAdd(this.two)); } +inherits(MontCurve, Base); +module.exports = MontCurve; -// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 -if (typeof Symbol !== 'undefined' && Symbol.species != null && - Buffer[Symbol.species] === Buffer) { - Object.defineProperty(Buffer, Symbol.species, { - value: null, - configurable: true, - enumerable: false, - writable: false - }) -} +MontCurve.prototype.validate = function validate(point) { + var x = point.normalize().x; + var x2 = x.redSqr(); + var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); + var y = rhs.redSqrt(); -Buffer.poolSize = 8192 // not used by this implementation + return y.redSqr().cmp(rhs) === 0; +}; -function from (value, encodingOrOffset, length) { - if (typeof value === 'string') { - return fromString(value, encodingOrOffset) +function Point(curve, x, z) { + Base.BasePoint.call(this, curve, 'projective'); + if (x === null && z === null) { + this.x = this.curve.one; + this.z = this.curve.zero; + } else { + this.x = new BN(x, 16); + this.z = new BN(z, 16); + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); } +} +inherits(Point, Base.BasePoint); - if (ArrayBuffer.isView(value)) { - return fromArrayLike(value) - } +MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + return this.point(utils.toArray(bytes, enc), 1); +}; - if (value == null) { - throw TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + - 'or Array-like Object. Received type ' + (typeof value) - ) - } +MontCurve.prototype.point = function point(x, z) { + return new Point(this, x, z); +}; - if (isInstance(value, ArrayBuffer) || - (value && isInstance(value.buffer, ArrayBuffer))) { - return fromArrayBuffer(value, encodingOrOffset, length) - } +MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { + return Point.fromJSON(this, obj); +}; - if (typeof value === 'number') { - throw new TypeError( - 'The "value" argument must not be of type number. Received type number' - ) - } +Point.prototype.precompute = function precompute() { + // No-op +}; - var valueOf = value.valueOf && value.valueOf() - if (valueOf != null && valueOf !== value) { - return Buffer.from(valueOf, encodingOrOffset, length) - } +Point.prototype._encode = function _encode() { + return this.getX().toArray('be', this.curve.p.byteLength()); +}; - var b = fromObject(value) - if (b) return b +Point.fromJSON = function fromJSON(curve, obj) { + return new Point(curve, obj[0], obj[1] || curve.one); +}; - if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && - typeof value[Symbol.toPrimitive] === 'function') { - return Buffer.from( - value[Symbol.toPrimitive]('string'), encodingOrOffset, length - ) - } +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; - throw new TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + - 'or Array-like Object. Received type ' + (typeof value) - ) -} +Point.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.z.cmpn(0) === 0; +}; -/** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ -Buffer.from = function (value, encodingOrOffset, length) { - return from(value, encodingOrOffset, length) -} +Point.prototype.dbl = function dbl() { + // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3 + // 2M + 2S + 4A + + // A = X1 + Z1 + var a = this.x.redAdd(this.z); + // AA = A^2 + var aa = a.redSqr(); + // B = X1 - Z1 + var b = this.x.redSub(this.z); + // BB = B^2 + var bb = b.redSqr(); + // C = AA - BB + var c = aa.redSub(bb); + // X3 = AA * BB + var nx = aa.redMul(bb); + // Z3 = C * (BB + A24 * C) + var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); + return this.curve.point(nx, nz); +}; -// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: -// https://github.com/feross/buffer/pull/148 -Buffer.prototype.__proto__ = Uint8Array.prototype -Buffer.__proto__ = Uint8Array +Point.prototype.add = function add() { + throw new Error('Not supported on Montgomery curve'); +}; -function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be of type number') - } else if (size < 0) { - throw new RangeError('The value "' + size + '" is invalid for option "size"') - } -} +Point.prototype.diffAdd = function diffAdd(p, diff) { + // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3 + // 4M + 2S + 6A + + // A = X2 + Z2 + var a = this.x.redAdd(this.z); + // B = X2 - Z2 + var b = this.x.redSub(this.z); + // C = X3 + Z3 + var c = p.x.redAdd(p.z); + // D = X3 - Z3 + var d = p.x.redSub(p.z); + // DA = D * A + var da = d.redMul(a); + // CB = C * B + var cb = c.redMul(b); + // X5 = Z1 * (DA + CB)^2 + var nx = diff.z.redMul(da.redAdd(cb).redSqr()); + // Z5 = X1 * (DA - CB)^2 + var nz = diff.x.redMul(da.redISub(cb).redSqr()); + return this.curve.point(nx, nz); +}; -function alloc (size, fill, encoding) { - assertSize(size) - if (size <= 0) { - return createBuffer(size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(size).fill(fill, encoding) - : createBuffer(size).fill(fill) +Point.prototype.mul = function mul(k) { + var t = k.clone(); + var a = this; // (N / 2) * Q + Q + var b = this.curve.point(null, null); // (N / 2) * Q + var c = this; // Q + + for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) + bits.push(t.andln(1)); + + for (var i = bits.length - 1; i >= 0; i--) { + if (bits[i] === 0) { + // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q + a = a.diffAdd(b, c); + // N * Q = 2 * ((N / 2) * Q + Q)) + b = b.dbl(); + } else { + // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q) + b = a.diffAdd(b, c); + // N * Q + Q = 2 * ((N / 2) * Q + Q) + a = a.dbl(); + } } - return createBuffer(size) -} + return b; +}; -/** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ -Buffer.alloc = function (size, fill, encoding) { - return alloc(size, fill, encoding) -} +Point.prototype.mulAdd = function mulAdd() { + throw new Error('Not supported on Montgomery curve'); +}; + +Point.prototype.jumlAdd = function jumlAdd() { + throw new Error('Not supported on Montgomery curve'); +}; + +Point.prototype.eq = function eq(other) { + return this.getX().cmp(other.getX()) === 0; +}; + +Point.prototype.normalize = function normalize() { + this.x = this.x.redMul(this.z.redInvm()); + this.z = this.curve.one; + return this; +}; -function allocUnsafe (size) { - assertSize(size) - return createBuffer(size < 0 ? 0 : checked(size) | 0) -} +Point.prototype.getX = function getX() { + // Normalize coordinates + this.normalize(); -/** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ -Buffer.allocUnsafe = function (size) { - return allocUnsafe(size) -} -/** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ -Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(size) -} + return this.x.fromRed(); +}; -function fromString (string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8' - } +},{"../utils":187,"./base":174,"bn.js":169,"inherits":188}],178:[function(require,module,exports){ +'use strict'; - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } +var utils = require('../utils'); +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = require('./base'); - var length = byteLength(string, encoding) | 0 - var buf = createBuffer(length) +var assert = utils.assert; - var actual = buf.write(string, encoding) +function ShortCurve(conf) { + Base.call(this, 'short', conf); - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - buf = buf.slice(0, actual) - } + this.a = new BN(conf.a, 16).toRed(this.red); + this.b = new BN(conf.b, 16).toRed(this.red); + this.tinv = this.two.redInvm(); - return buf -} + this.zeroA = this.a.fromRed().cmpn(0) === 0; + this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; -function fromArrayLike (array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0 - var buf = createBuffer(length) - for (var i = 0; i < length; i += 1) { - buf[i] = array[i] & 255 - } - return buf + // If the curve is endomorphic, precalculate beta and lambda + this.endo = this._getEndomorphism(conf); + this._endoWnafT1 = new Array(4); + this._endoWnafT2 = new Array(4); } +inherits(ShortCurve, Base); +module.exports = ShortCurve; -function fromArrayBuffer (array, byteOffset, length) { - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('"offset" is outside of buffer bounds') - } +ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { + // No efficient endomorphism + if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) + return; - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('"length" is outside of buffer bounds') + // Compute beta and lambda, that lambda * P = (beta * Px; Py) + var beta; + var lambda; + if (conf.beta) { + beta = new BN(conf.beta, 16).toRed(this.red); + } else { + var betas = this._getEndoRoots(this.p); + // Choose the smallest beta + beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; + beta = beta.toRed(this.red); + } + if (conf.lambda) { + lambda = new BN(conf.lambda, 16); + } else { + // Choose the lambda that is matching selected beta + var lambdas = this._getEndoRoots(this.n); + if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { + lambda = lambdas[0]; + } else { + lambda = lambdas[1]; + assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); + } } - var buf - if (byteOffset === undefined && length === undefined) { - buf = new Uint8Array(array) - } else if (length === undefined) { - buf = new Uint8Array(array, byteOffset) + // Get basis vectors, used for balanced length-two representation + var basis; + if (conf.basis) { + basis = conf.basis.map(function(vec) { + return { + a: new BN(vec.a, 16), + b: new BN(vec.b, 16), + }; + }); } else { - buf = new Uint8Array(array, byteOffset, length) + basis = this._getEndoBasis(lambda); } - // Return an augmented `Uint8Array` instance - buf.__proto__ = Buffer.prototype - return buf -} + return { + beta: beta, + lambda: lambda, + basis: basis, + }; +}; -function fromObject (obj) { - if (Buffer.isBuffer(obj)) { - var len = checked(obj.length) | 0 - var buf = createBuffer(len) +ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { + // Find roots of for x^2 + x + 1 in F + // Root = (-1 +- Sqrt(-3)) / 2 + // + var red = num === this.p ? this.red : BN.mont(num); + var tinv = new BN(2).toRed(red).redInvm(); + var ntinv = tinv.redNeg(); - if (buf.length === 0) { - return buf - } + var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); - obj.copy(buf, 0, 0, len) - return buf - } + var l1 = ntinv.redAdd(s).fromRed(); + var l2 = ntinv.redSub(s).fromRed(); + return [ l1, l2 ]; +}; - if (obj.length !== undefined) { - if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { - return createBuffer(0) +ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { + // aprxSqrt >= sqrt(this.n) + var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); + + // 3.74 + // Run EGCD, until r(L + 1) < aprxSqrt + var u = lambda; + var v = this.n.clone(); + var x1 = new BN(1); + var y1 = new BN(0); + var x2 = new BN(0); + var y2 = new BN(1); + + // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n) + var a0; + var b0; + // First vector + var a1; + var b1; + // Second vector + var a2; + var b2; + + var prevR; + var i = 0; + var r; + var x; + while (u.cmpn(0) !== 0) { + var q = v.div(u); + r = v.sub(q.mul(u)); + x = x2.sub(q.mul(x1)); + var y = y2.sub(q.mul(y1)); + + if (!a1 && r.cmp(aprxSqrt) < 0) { + a0 = prevR.neg(); + b0 = x1; + a1 = r.neg(); + b1 = x; + } else if (a1 && ++i === 2) { + break; } - return fromArrayLike(obj) - } + prevR = r; - if (obj.type === 'Buffer' && Array.isArray(obj.data)) { - return fromArrayLike(obj.data) + v = u; + u = r; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; } -} - -function checked (length) { - // Note: cannot use `length < K_MAX_LENGTH` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= K_MAX_LENGTH) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') + a2 = r.neg(); + b2 = x; + + var len1 = a1.sqr().add(b1.sqr()); + var len2 = a2.sqr().add(b2.sqr()); + if (len2.cmp(len1) >= 0) { + a2 = a0; + b2 = b0; } - return length | 0 -} -function SlowBuffer (length) { - if (+length != length) { // eslint-disable-line eqeqeq - length = 0 + // Normalize signs + if (a1.negative) { + a1 = a1.neg(); + b1 = b1.neg(); + } + if (a2.negative) { + a2 = a2.neg(); + b2 = b2.neg(); } - return Buffer.alloc(+length) -} -Buffer.isBuffer = function isBuffer (b) { - return b != null && b._isBuffer === true && - b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false -} + return [ + { a: a1, b: b1 }, + { a: a2, b: b2 }, + ]; +}; -Buffer.compare = function compare (a, b) { - if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) - if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError( - 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' - ) - } +ShortCurve.prototype._endoSplit = function _endoSplit(k) { + var basis = this.endo.basis; + var v1 = basis[0]; + var v2 = basis[1]; - if (a === b) return 0 + var c1 = v2.b.mul(k).divRound(this.n); + var c2 = v1.b.neg().mul(k).divRound(this.n); - var x = a.length - var y = b.length + var p1 = c1.mul(v1.a); + var p2 = c2.mul(v2.a); + var q1 = c1.mul(v1.b); + var q2 = c2.mul(v2.b); - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i] - y = b[i] - break - } - } + // Calculate answer + var k1 = k.sub(p1).sub(p2); + var k2 = q1.add(q2).neg(); + return { k1: k1, k2: k2 }; +}; - if (x < y) return -1 - if (y < x) return 1 - return 0 -} +ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new BN(x, 16); + if (!x.red) + x = x.toRed(this.red); -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false + var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error('invalid point'); + + // XXX Is there any way to tell if the number is odd without converting it + // to non-red form? + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); + + return this.point(x, y); +}; + +ShortCurve.prototype.validate = function validate(point) { + if (point.inf) + return true; + + var x = point.x; + var y = point.y; + + var ax = this.a.redMul(x); + var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); + return y.redSqr().redISub(rhs).cmpn(0) === 0; +}; + +ShortCurve.prototype._endoWnafMulAdd = + function _endoWnafMulAdd(points, coeffs, jacobianResult) { + var npoints = this._endoWnafT1; + var ncoeffs = this._endoWnafT2; + for (var i = 0; i < points.length; i++) { + var split = this._endoSplit(coeffs[i]); + var p = points[i]; + var beta = p._getBeta(); + + if (split.k1.negative) { + split.k1.ineg(); + p = p.neg(true); + } + if (split.k2.negative) { + split.k2.ineg(); + beta = beta.neg(true); + } + + npoints[i * 2] = p; + npoints[i * 2 + 1] = beta; + ncoeffs[i * 2] = split.k1; + ncoeffs[i * 2 + 1] = split.k2; + } + var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); + + // Clean-up references to points and coefficients + for (var j = 0; j < i * 2; j++) { + npoints[j] = null; + ncoeffs[j] = null; + } + return res; + }; + +function Point(curve, x, y, isRed) { + Base.BasePoint.call(this, curve, 'affine'); + if (x === null && y === null) { + this.x = null; + this.y = null; + this.inf = true; + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + // Force redgomery representation when loading from JSON + if (isRed) { + this.x.forceRed(this.curve.red); + this.y.forceRed(this.curve.red); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + this.inf = false; } } +inherits(Point, Base.BasePoint); -Buffer.concat = function concat (list, length) { - if (!Array.isArray(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') +ShortCurve.prototype.point = function point(x, y, isRed) { + return new Point(this, x, y, isRed); +}; + +ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { + return Point.fromJSON(this, obj, red); +}; + +Point.prototype._getBeta = function _getBeta() { + if (!this.curve.endo) + return; + + var pre = this.precomputed; + if (pre && pre.beta) + return pre.beta; + + var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); + if (pre) { + var curve = this.curve; + var endoMul = function(p) { + return curve.point(p.x.redMul(curve.endo.beta), p.y); + }; + pre.beta = beta; + beta.precomputed = { + beta: null, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(endoMul), + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(endoMul), + }, + }; } + return beta; +}; - if (list.length === 0) { - return Buffer.alloc(0) +Point.prototype.toJSON = function toJSON() { + if (!this.precomputed) + return [ this.x, this.y ]; + + return [ this.x, this.y, this.precomputed && { + doubles: this.precomputed.doubles && { + step: this.precomputed.doubles.step, + points: this.precomputed.doubles.points.slice(1), + }, + naf: this.precomputed.naf && { + wnd: this.precomputed.naf.wnd, + points: this.precomputed.naf.points.slice(1), + }, + } ]; +}; + +Point.fromJSON = function fromJSON(curve, obj, red) { + if (typeof obj === 'string') + obj = JSON.parse(obj); + var res = curve.point(obj[0], obj[1], red); + if (!obj[2]) + return res; + + function obj2point(obj) { + return curve.point(obj[0], obj[1], red); } - var i - if (length === undefined) { - length = 0 - for (i = 0; i < list.length; ++i) { - length += list[i].length - } + var pre = obj[2]; + res.precomputed = { + beta: null, + doubles: pre.doubles && { + step: pre.doubles.step, + points: [ res ].concat(pre.doubles.points.map(obj2point)), + }, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: [ res ].concat(pre.naf.points.map(obj2point)), + }, + }; + return res; +}; + +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +Point.prototype.isInfinity = function isInfinity() { + return this.inf; +}; + +Point.prototype.add = function add(p) { + // O + P = P + if (this.inf) + return p; + + // P + O = P + if (p.inf) + return this; + + // P + P = 2P + if (this.eq(p)) + return this.dbl(); + + // P + (-P) = O + if (this.neg().eq(p)) + return this.curve.point(null, null); + + // P + Q = O + if (this.x.cmp(p.x) === 0) + return this.curve.point(null, null); + + var c = this.y.redSub(p.y); + if (c.cmpn(0) !== 0) + c = c.redMul(this.x.redSub(p.x).redInvm()); + var nx = c.redSqr().redISub(this.x).redISub(p.x); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); +}; + +Point.prototype.dbl = function dbl() { + if (this.inf) + return this; + + // 2P = O + var ys1 = this.y.redAdd(this.y); + if (ys1.cmpn(0) === 0) + return this.curve.point(null, null); + + var a = this.curve.a; + + var x2 = this.x.redSqr(); + var dyinv = ys1.redInvm(); + var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); + + var nx = c.redSqr().redISub(this.x.redAdd(this.x)); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); +}; + +Point.prototype.getX = function getX() { + return this.x.fromRed(); +}; + +Point.prototype.getY = function getY() { + return this.y.fromRed(); +}; + +Point.prototype.mul = function mul(k) { + k = new BN(k, 16); + if (this.isInfinity()) + return this; + else if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else if (this.curve.endo) + return this.curve._endoWnafMulAdd([ this ], [ k ]); + else + return this.curve._wnafMul(this, k); +}; + +Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { + var points = [ this, p2 ]; + var coeffs = [ k1, k2 ]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2); +}; + +Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) { + var points = [ this, p2 ]; + var coeffs = [ k1, k2 ]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs, true); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2, true); +}; + +Point.prototype.eq = function eq(p) { + return this === p || + this.inf === p.inf && + (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); +}; + +Point.prototype.neg = function neg(_precompute) { + if (this.inf) + return this; + + var res = this.curve.point(this.x, this.y.redNeg()); + if (_precompute && this.precomputed) { + var pre = this.precomputed; + var negate = function(p) { + return p.neg(); + }; + res.precomputed = { + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(negate), + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(negate), + }, + }; } + return res; +}; - var buffer = Buffer.allocUnsafe(length) - var pos = 0 - for (i = 0; i < list.length; ++i) { - var buf = list[i] - if (isInstance(buf, Uint8Array)) { - buf = Buffer.from(buf) - } - if (!Buffer.isBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos) - pos += buf.length +Point.prototype.toJ = function toJ() { + if (this.inf) + return this.curve.jpoint(null, null, null); + + var res = this.curve.jpoint(this.x, this.y, this.curve.one); + return res; +}; + +function JPoint(curve, x, y, z) { + Base.BasePoint.call(this, curve, 'jacobian'); + if (x === null && y === null && z === null) { + this.x = this.curve.one; + this.y = this.curve.one; + this.z = new BN(0); + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + this.z = new BN(z, 16); } - return buffer + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + + this.zOne = this.z === this.curve.one; } +inherits(JPoint, Base.BasePoint); -function byteLength (string, encoding) { - if (Buffer.isBuffer(string)) { - return string.length - } - if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - throw new TypeError( - 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + - 'Received type ' + typeof string - ) - } +ShortCurve.prototype.jpoint = function jpoint(x, y, z) { + return new JPoint(this, x, y, z); +}; - var len = string.length - var mustMatch = (arguments.length > 2 && arguments[2] === true) - if (!mustMatch && len === 0) return 0 +JPoint.prototype.toP = function toP() { + if (this.isInfinity()) + return this.curve.point(null, null); - // Use a for loop to avoid recursion - var loweredCase = false - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) { - return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 - } - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } + var zinv = this.z.redInvm(); + var zinv2 = zinv.redSqr(); + var ax = this.x.redMul(zinv2); + var ay = this.y.redMul(zinv2).redMul(zinv); + + return this.curve.point(ax, ay); +}; + +JPoint.prototype.neg = function neg() { + return this.curve.jpoint(this.x, this.y.redNeg(), this.z); +}; + +JPoint.prototype.add = function add(p) { + // O + P = P + if (this.isInfinity()) + return p; + + // P + O = P + if (p.isInfinity()) + return this; + + // 12M + 4S + 7A + var pz2 = p.z.redSqr(); + var z2 = this.z.redSqr(); + var u1 = this.x.redMul(pz2); + var u2 = p.x.redMul(z2); + var s1 = this.y.redMul(pz2.redMul(p.z)); + var s2 = p.y.redMul(z2.redMul(this.z)); + + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); } -} -Buffer.byteLength = byteLength -function slowToString (encoding, start, end) { - var loweredCase = false + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(p.z).redMul(h); - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0 + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.mixedAdd = function mixedAdd(p) { + // O + P = P + if (this.isInfinity()) + return p.toJ(); + + // P + O = P + if (p.isInfinity()) + return this; + + // 8M + 3S + 7A + var z2 = this.z.redSqr(); + var u1 = this.x; + var u2 = p.x.redMul(z2); + var s1 = this.y; + var s2 = p.y.redMul(z2).redMul(this.z); + + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' + + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(h); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.dblp = function dblp(pow) { + if (pow === 0) + return this; + if (this.isInfinity()) + return this; + if (!pow) + return this.dbl(); + + var i; + if (this.curve.zeroA || this.curve.threeA) { + var r = this; + for (i = 0; i < pow; i++) + r = r.dbl(); + return r; } - if (end === undefined || end > this.length) { - end = this.length + // 1M + 2S + 1A + N * (4S + 5M + 8A) + // N = 1 => 6M + 6S + 9A + var a = this.curve.a; + var tinv = this.curve.tinv; + + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + + // Reuse results + var jyd = jy.redAdd(jy); + for (i = 0; i < pow; i++) { + var jx2 = jx.redSqr(); + var jyd2 = jyd.redSqr(); + var jyd4 = jyd2.redSqr(); + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + + var t1 = jx.redMul(jyd2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + var dny = c.redMul(t2); + dny = dny.redIAdd(dny).redISub(jyd4); + var nz = jyd.redMul(jz); + if (i + 1 < pow) + jz4 = jz4.redMul(jyd4); + + jx = nx; + jz = nz; + jyd = dny; } - if (end <= 0) { - return '' + return this.curve.jpoint(jx, jyd.redMul(tinv), jz); +}; + +JPoint.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; + + if (this.curve.zeroA) + return this._zeroDbl(); + else if (this.curve.threeA) + return this._threeDbl(); + else + return this._dbl(); +}; + +JPoint.prototype._zeroDbl = function _zeroDbl() { + var nx; + var ny; + var nz; + // Z = 1 + if (this.zOne) { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html + // #doubling-mdbl-2007-bl + // 1M + 5S + 14A + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // S = 2 * ((X1 + YY)^2 - XX - YYYY) + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + // M = 3 * XX + a; a = 0 + var m = xx.redAdd(xx).redIAdd(xx); + // T = M ^ 2 - 2*S + var t = m.redSqr().redISub(s).redISub(s); + + // 8 * YYYY + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + + // X3 = T + nx = t; + // Y3 = M * (S - T) - 8 * YYYY + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + // Z3 = 2*Y1 + nz = this.y.redAdd(this.y); + } else { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html + // #doubling-dbl-2009-l + // 2M + 5S + 13A + + // A = X1^2 + var a = this.x.redSqr(); + // B = Y1^2 + var b = this.y.redSqr(); + // C = B^2 + var c = b.redSqr(); + // D = 2 * ((X1 + B)^2 - A - C) + var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); + d = d.redIAdd(d); + // E = 3 * A + var e = a.redAdd(a).redIAdd(a); + // F = E^2 + var f = e.redSqr(); + + // 8 * C + var c8 = c.redIAdd(c); + c8 = c8.redIAdd(c8); + c8 = c8.redIAdd(c8); + + // X3 = F - 2 * D + nx = f.redISub(d).redISub(d); + // Y3 = E * (D - X3) - 8 * C + ny = e.redMul(d.redISub(nx)).redISub(c8); + // Z3 = 2 * Y1 * Z1 + nz = this.y.redMul(this.z); + nz = nz.redIAdd(nz); } - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0 - start >>>= 0 + return this.curve.jpoint(nx, ny, nz); +}; - if (end <= start) { - return '' +JPoint.prototype._threeDbl = function _threeDbl() { + var nx; + var ny; + var nz; + // Z = 1 + if (this.zOne) { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html + // #doubling-mdbl-2007-bl + // 1M + 5S + 15A + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // S = 2 * ((X1 + YY)^2 - XX - YYYY) + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + // M = 3 * XX + a + var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); + // T = M^2 - 2 * S + var t = m.redSqr().redISub(s).redISub(s); + // X3 = T + nx = t; + // Y3 = M * (S - T) - 8 * YYYY + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + // Z3 = 2 * Y1 + nz = this.y.redAdd(this.y); + } else { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b + // 3M + 5S + + // delta = Z1^2 + var delta = this.z.redSqr(); + // gamma = Y1^2 + var gamma = this.y.redSqr(); + // beta = X1 * gamma + var beta = this.x.redMul(gamma); + // alpha = 3 * (X1 - delta) * (X1 + delta) + var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); + alpha = alpha.redAdd(alpha).redIAdd(alpha); + // X3 = alpha^2 - 8 * beta + var beta4 = beta.redIAdd(beta); + beta4 = beta4.redIAdd(beta4); + var beta8 = beta4.redAdd(beta4); + nx = alpha.redSqr().redISub(beta8); + // Z3 = (Y1 + Z1)^2 - gamma - delta + nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); + // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2 + var ggamma8 = gamma.redSqr(); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); } - if (!encoding) encoding = 'utf8' + return this.curve.jpoint(nx, ny, nz); +}; - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) +JPoint.prototype._dbl = function _dbl() { + var a = this.curve.a; - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) + // 4M + 6S + 10A + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); - case 'ascii': - return asciiSlice(this, start, end) + var jx2 = jx.redSqr(); + var jy2 = jy.redSqr(); - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); - case 'base64': - return base64Slice(this, start, end) + var jxd4 = jx.redAdd(jx); + jxd4 = jxd4.redIAdd(jxd4); + var t1 = jxd4.redMul(jy2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) + var jyd8 = jy2.redSqr(); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + var ny = c.redMul(t2).redISub(jyd8); + var nz = jy.redAdd(jy).redMul(jz); - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true - } + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.trpl = function trpl() { + if (!this.curve.zeroA) + return this.dbl().add(this); + + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl + // 5M + 10S + ... + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // ZZ = Z1^2 + var zz = this.z.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // M = 3 * XX + a * ZZ2; a = 0 + var m = xx.redAdd(xx).redIAdd(xx); + // MM = M^2 + var mm = m.redSqr(); + // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM + var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + e = e.redIAdd(e); + e = e.redAdd(e).redIAdd(e); + e = e.redISub(mm); + // EE = E^2 + var ee = e.redSqr(); + // T = 16*YYYY + var t = yyyy.redIAdd(yyyy); + t = t.redIAdd(t); + t = t.redIAdd(t); + t = t.redIAdd(t); + // U = (M + E)^2 - MM - EE - T + var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); + // X3 = 4 * (X1 * EE - 4 * YY * U) + var yyu4 = yy.redMul(u); + yyu4 = yyu4.redIAdd(yyu4); + yyu4 = yyu4.redIAdd(yyu4); + var nx = this.x.redMul(ee).redISub(yyu4); + nx = nx.redIAdd(nx); + nx = nx.redIAdd(nx); + // Y3 = 8 * Y1 * (U * (T - U) - E * EE) + var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + // Z3 = (Z1 + E)^2 - ZZ - EE + var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.mul = function mul(k, kbase) { + k = new BN(k, kbase); + + return this.curve._wnafMul(this, k); +}; + +JPoint.prototype.eq = function eq(p) { + if (p.type === 'affine') + return this.eq(p.toJ()); + + if (this === p) + return true; + + // x1 * z2^2 == x2 * z1^2 + var z2 = this.z.redSqr(); + var pz2 = p.z.redSqr(); + if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) + return false; + + // y1 * z2^3 == y2 * z1^3 + var z3 = z2.redMul(this.z); + var pz3 = pz2.redMul(p.z); + return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; +}; + +JPoint.prototype.eqXToP = function eqXToP(x) { + var zs = this.z.redSqr(); + var rx = x.toRed(this.curve.red).redMul(zs); + if (this.x.cmp(rx) === 0) + return true; + + var xc = x.clone(); + var t = this.curve.redN.redMul(zs); + for (;;) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; + + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; } -} +}; -// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) -// to detect a Buffer instance. It's not possible to use `instanceof Buffer` -// reliably in a browserify context because there could be multiple different -// copies of the 'buffer' package in use. This method works even for Buffer -// instances that were created from another copy of the `buffer` package. -// See: https://github.com/feross/buffer/issues/154 -Buffer.prototype._isBuffer = true +JPoint.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; -function swap (b, n, m) { - var i = b[n] - b[n] = b[m] - b[m] = i +JPoint.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.z.cmpn(0) === 0; +}; + +},{"../utils":187,"./base":174,"bn.js":169,"inherits":188}],179:[function(require,module,exports){ +'use strict'; + +var curves = exports; + +var hash = require('hash.js'); +var curve = require('./curve'); +var utils = require('./utils'); + +var assert = utils.assert; + +function PresetCurve(options) { + if (options.type === 'short') + this.curve = new curve.short(options); + else if (options.type === 'edwards') + this.curve = new curve.edwards(options); + else + this.curve = new curve.mont(options); + this.g = this.curve.g; + this.n = this.curve.n; + this.hash = options.hash; + + assert(this.g.validate(), 'Invalid curve'); + assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O'); } +curves.PresetCurve = PresetCurve; -Buffer.prototype.swap16 = function swap16 () { - var len = this.length - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1) - } - return this +function defineCurve(name, options) { + Object.defineProperty(curves, name, { + configurable: true, + enumerable: true, + get: function() { + var curve = new PresetCurve(options); + Object.defineProperty(curves, name, { + configurable: true, + enumerable: true, + value: curve, + }); + return curve; + }, + }); } -Buffer.prototype.swap32 = function swap32 () { - var len = this.length - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3) - swap(this, i + 1, i + 2) - } - return this +defineCurve('p192', { + type: 'short', + prime: 'p192', + p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff', + a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc', + b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1', + n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831', + hash: hash.sha256, + gRed: false, + g: [ + '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012', + '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811', + ], +}); + +defineCurve('p224', { + type: 'short', + prime: 'p224', + p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001', + a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe', + b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4', + n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d', + hash: hash.sha256, + gRed: false, + g: [ + 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21', + 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34', + ], +}); + +defineCurve('p256', { + type: 'short', + prime: null, + p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff', + a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc', + b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b', + n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551', + hash: hash.sha256, + gRed: false, + g: [ + '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296', + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5', + ], +}); + +defineCurve('p384', { + type: 'short', + prime: null, + p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'fffffffe ffffffff 00000000 00000000 ffffffff', + a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'fffffffe ffffffff 00000000 00000000 fffffffc', + b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' + + '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef', + n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' + + 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973', + hash: hash.sha384, + gRed: false, + g: [ + 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' + + '5502f25d bf55296c 3a545e38 72760ab7', + '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f', + ], +}); + +defineCurve('p521', { + type: 'short', + prime: null, + p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff', + a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff fffffffc', + b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' + + '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' + + '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00', + n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' + + 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409', + hash: hash.sha512, + gRed: false, + g: [ + '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' + + '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' + + 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66', + '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' + + '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' + + '3fad0761 353c7086 a272c240 88be9476 9fd16650', + ], +}); + +defineCurve('curve25519', { + type: 'mont', + prime: 'p25519', + p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', + a: '76d06', + b: '1', + n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', + hash: hash.sha256, + gRed: false, + g: [ + '9', + ], +}); + +defineCurve('ed25519', { + type: 'edwards', + prime: 'p25519', + p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', + a: '-1', + c: '1', + // -121665 * (121666^(-1)) (mod P) + d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3', + n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', + hash: hash.sha256, + gRed: false, + g: [ + '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a', + + // 4/5 + '6666666666666666666666666666666666666666666666666666666666666658', + ], +}); + +var pre; +try { + pre = require('./precomputed/secp256k1'); +} catch (e) { + pre = undefined; } -Buffer.prototype.swap64 = function swap64 () { - var len = this.length - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7) - swap(this, i + 1, i + 6) - swap(this, i + 2, i + 5) - swap(this, i + 3, i + 4) +defineCurve('secp256k1', { + type: 'short', + prime: 'k256', + p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', + a: '0', + b: '7', + n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', + h: '1', + hash: hash.sha256, + + // Precomputed endomorphism + beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee', + lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72', + basis: [ + { + a: '3086d221a7d46bcde86c90e49284eb15', + b: '-e4437ed6010e88286f547fa90abfe4c3', + }, + { + a: '114ca50f7a8e2f3f657c1108d9d44cfd8', + b: '3086d221a7d46bcde86c90e49284eb15', + }, + ], + + gRed: false, + g: [ + '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', + '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', + pre, + ], +}); + +},{"./curve":176,"./precomputed/secp256k1":186,"./utils":187,"hash.js":195}],180:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var HmacDRBG = require('hmac-drbg'); +var utils = require('../utils'); +var curves = require('../curves'); +var rand = require('brorand'); +var assert = utils.assert; + +var KeyPair = require('./key'); +var Signature = require('./signature'); + +function EC(options) { + if (!(this instanceof EC)) + return new EC(options); + + // Shortcut `elliptic.ec(curve-name)` + if (typeof options === 'string') { + assert(Object.prototype.hasOwnProperty.call(curves, options), + 'Unknown curve ' + options); + + options = curves[options]; } - return this -} -Buffer.prototype.toString = function toString () { - var length = this.length - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -} + // Shortcut for `elliptic.ec(elliptic.curves.curveName)` + if (options instanceof curves.PresetCurve) + options = { curve: options }; -Buffer.prototype.toLocaleString = Buffer.prototype.toString + this.curve = options.curve.curve; + this.n = this.curve.n; + this.nh = this.n.ushrn(1); + this.g = this.curve.g; -Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} + // Point on curve + this.g = options.curve.g; + this.g.precompute(options.curve.n.bitLength() + 1); -Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() - if (this.length > max) str += ' ... ' - return '' + // Hash for function for DRBG + this.hash = options.hash || options.curve.hash; } +module.exports = EC; + +EC.prototype.keyPair = function keyPair(options) { + return new KeyPair(this, options); +}; + +EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { + return KeyPair.fromPrivate(this, priv, enc); +}; + +EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { + return KeyPair.fromPublic(this, pub, enc); +}; + +EC.prototype.genKeyPair = function genKeyPair(options) { + if (!options) + options = {}; + + // Instantiate Hmac_DRBG + var drbg = new HmacDRBG({ + hash: this.hash, + pers: options.pers, + persEnc: options.persEnc || 'utf8', + entropy: options.entropy || rand(this.hash.hmacStrength), + entropyEnc: options.entropy && options.entropyEnc || 'utf8', + nonce: this.n.toArray(), + }); + + var bytes = this.n.byteLength(); + var ns2 = this.n.sub(new BN(2)); + for (;;) { + var priv = new BN(drbg.generate(bytes)); + if (priv.cmp(ns2) > 0) + continue; -Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (isInstance(target, Uint8Array)) { - target = Buffer.from(target, target.offset, target.byteLength) - } - if (!Buffer.isBuffer(target)) { - throw new TypeError( - 'The "target" argument must be one of type Buffer or Uint8Array. ' + - 'Received type ' + (typeof target) - ) + priv.iaddn(1); + return this.keyFromPrivate(priv); } +}; - if (start === undefined) { - start = 0 - } - if (end === undefined) { - end = target ? target.length : 0 - } - if (thisStart === undefined) { - thisStart = 0 - } - if (thisEnd === undefined) { - thisEnd = this.length - } +EC.prototype._truncateToN = function _truncateToN(msg, truncOnly) { + var delta = msg.byteLength() * 8 - this.n.bitLength(); + if (delta > 0) + msg = msg.ushrn(delta); + if (!truncOnly && msg.cmp(this.n) >= 0) + return msg.sub(this.n); + else + return msg; +}; - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') +EC.prototype.sign = function sign(msg, key, enc, options) { + if (typeof enc === 'object') { + options = enc; + enc = null; } + if (!options) + options = {}; + + key = this.keyFromPrivate(key, enc); + msg = this._truncateToN(new BN(msg, 16)); + + // Zero-extend key to provide enough entropy + var bytes = this.n.byteLength(); + var bkey = key.getPrivate().toArray('be', bytes); + + // Zero-extend nonce to have the same byte size as N + var nonce = msg.toArray('be', bytes); + + // Instantiate Hmac_DRBG + var drbg = new HmacDRBG({ + hash: this.hash, + entropy: bkey, + nonce: nonce, + pers: options.pers, + persEnc: options.persEnc || 'utf8', + }); - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } + // Number of bytes to generate + var ns1 = this.n.sub(new BN(1)); - start >>>= 0 - end >>>= 0 - thisStart >>>= 0 - thisEnd >>>= 0 + for (var iter = 0; ; iter++) { + var k = options.k ? + options.k(iter) : + new BN(drbg.generate(this.n.byteLength())); + k = this._truncateToN(k, true); + if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) + continue; - if (this === target) return 0 + var kp = this.g.mul(k); + if (kp.isInfinity()) + continue; - var x = thisEnd - thisStart - var y = end - start - var len = Math.min(x, y) + var kpX = kp.getX(); + var r = kpX.umod(this.n); + if (r.cmpn(0) === 0) + continue; - var thisCopy = this.slice(thisStart, thisEnd) - var targetCopy = target.slice(start, end) + var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); + s = s.umod(this.n); + if (s.cmpn(0) === 0) + continue; - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i] - y = targetCopy[i] - break + var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | + (kpX.cmp(r) !== 0 ? 2 : 0); + + // Use complement of `s`, if it is > `n / 2` + if (options.canonical && s.cmp(this.nh) > 0) { + s = this.n.sub(s); + recoveryParam ^= 1; } + + return new Signature({ r: r, s: s, recoveryParam: recoveryParam }); } +}; - if (x < y) return -1 - if (y < x) return 1 - return 0 -} +EC.prototype.verify = function verify(msg, signature, key, enc) { + msg = this._truncateToN(new BN(msg, 16)); + key = this.keyFromPublic(key, enc); + signature = new Signature(signature, 'hex'); -// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, -// OR the last index of `val` in `buffer` at offset <= `byteOffset`. -// -// Arguments: -// - buffer - a Buffer to search -// - val - a string, Buffer, or number -// - byteOffset - an index into `buffer`; will be clamped to an int32 -// - encoding - an optional encoding, relevant is val is a string -// - dir - true for indexOf, false for lastIndexOf -function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 + // Perform primitive values validation + var r = signature.r; + var s = signature.s; + if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) + return false; + if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) + return false; - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset - byteOffset = 0 - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000 - } - byteOffset = +byteOffset // Coerce to Number. - if (numberIsNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1) - } + // Validate signature + var sinv = s.invm(this.n); + var u1 = sinv.mul(msg).umod(this.n); + var u2 = sinv.mul(r).umod(this.n); + var p; - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1 - } else if (byteOffset < 0) { - if (dir) byteOffset = 0 - else return -1 - } + if (!this.curve._maxwellTrick) { + p = this.g.mulAdd(u1, key.getPublic(), u2); + if (p.isInfinity()) + return false; - // Normalize val - if (typeof val === 'string') { - val = Buffer.from(val, encoding) + return p.getX().umod(this.n).cmp(r) === 0; } - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (Buffer.isBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF // Search for a byte value [0-255] - if (typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) - } + // NOTE: Greg Maxwell's trick, inspired by: + // https://git.io/vad3K + + p = this.g.jmulAdd(u1, key.getPublic(), u2); + if (p.isInfinity()) + return false; + + // Compare `p.x` of Jacobian point with `r`, + // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the + // inverse of `p.z^2` + return p.eqXToP(r); +}; + +EC.prototype.recoverPubKey = function(msg, signature, j, enc) { + assert((3 & j) === j, 'The recovery param is more than two bits'); + signature = new Signature(signature, enc); + + var n = this.n; + var e = new BN(msg); + var r = signature.r; + var s = signature.s; + + // A set LSB signifies that the y-coordinate is odd + var isYOdd = j & 1; + var isSecondKey = j >> 1; + if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) + throw new Error('Unable to find sencond key candinate'); + + // 1.1. Let x = r + jn. + if (isSecondKey) + r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); + else + r = this.curve.pointFromX(r, isYOdd); + + var rInv = signature.r.invm(n); + var s1 = n.sub(e).mul(rInv).umod(n); + var s2 = s.mul(rInv).umod(n); + + // 1.6.1 Compute Q = r^-1 (sR - eG) + // Q = r^-1 (sR + -eG) + return this.g.mulAdd(s1, r, s2); +}; + +EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) { + signature = new Signature(signature, enc); + if (signature.recoveryParam !== null) + return signature.recoveryParam; + + for (var i = 0; i < 4; i++) { + var Qprime; + try { + Qprime = this.recoverPubKey(e, signature, i); + } catch (e) { + continue; } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + + if (Qprime.eq(Q)) + return i; } + throw new Error('Unable to find valid recovery factor'); +}; - throw new TypeError('val must be string, number or Buffer') +},{"../curves":179,"../utils":187,"./key":181,"./signature":182,"bn.js":169,"brorand":170,"hmac-drbg":207}],181:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var utils = require('../utils'); +var assert = utils.assert; + +function KeyPair(ec, options) { + this.ec = ec; + this.priv = null; + this.pub = null; + + // KeyPair(ec, { priv: ..., pub: ... }) + if (options.priv) + this._importPrivate(options.priv, options.privEnc); + if (options.pub) + this._importPublic(options.pub, options.pubEnc); } +module.exports = KeyPair; -function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1 - var arrLength = arr.length - var valLength = val.length +KeyPair.fromPublic = function fromPublic(ec, pub, enc) { + if (pub instanceof KeyPair) + return pub; - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase() - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 - } - indexSize = 2 - arrLength /= 2 - valLength /= 2 - byteOffset /= 2 - } + return new KeyPair(ec, { + pub: pub, + pubEnc: enc, + }); +}; + +KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) { + if (priv instanceof KeyPair) + return priv; + + return new KeyPair(ec, { + priv: priv, + privEnc: enc, + }); +}; + +KeyPair.prototype.validate = function validate() { + var pub = this.getPublic(); + + if (pub.isInfinity()) + return { result: false, reason: 'Invalid public key' }; + if (!pub.validate()) + return { result: false, reason: 'Public key is not a point' }; + if (!pub.mul(this.ec.curve.n).isInfinity()) + return { result: false, reason: 'Public key * N != O' }; + + return { result: true, reason: null }; +}; + +KeyPair.prototype.getPublic = function getPublic(compact, enc) { + // compact is optional argument + if (typeof compact === 'string') { + enc = compact; + compact = null; } - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } + if (!this.pub) + this.pub = this.ec.g.mul(this.priv); + + if (!enc) + return this.pub; + + return this.pub.encode(enc, compact); +}; + +KeyPair.prototype.getPrivate = function getPrivate(enc) { + if (enc === 'hex') + return this.priv.toString(16, 2); + else + return this.priv; +}; + +KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { + this.priv = new BN(key, enc || 16); + + // Ensure that the priv won't be bigger than n, otherwise we may fail + // in fixed multiplication method + this.priv = this.priv.umod(this.ec.curve.n); +}; + +KeyPair.prototype._importPublic = function _importPublic(key, enc) { + if (key.x || key.y) { + // Montgomery points only have an `x` coordinate. + // Weierstrass/Edwards points on the other hand have both `x` and + // `y` coordinates. + if (this.ec.curve.type === 'mont') { + assert(key.x, 'Need x coordinate'); + } else if (this.ec.curve.type === 'short' || + this.ec.curve.type === 'edwards') { + assert(key.x && key.y, 'Need both x and y coordinate'); + } + this.pub = this.ec.curve.point(key.x, key.y); + return; } + this.pub = this.ec.curve.decodePoint(key, enc); +}; - var i - if (dir) { - var foundIndex = -1 - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex - foundIndex = -1 - } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength - for (i = byteOffset; i >= 0; i--) { - var found = true - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false - break - } - } - if (found) return i - } +// ECDH +KeyPair.prototype.derive = function derive(pub) { + if(!pub.validate()) { + assert(pub.validate(), 'public point not validated'); } + return pub.mul(this.priv).getX(); +}; - return -1 +// ECDSA +KeyPair.prototype.sign = function sign(msg, enc, options) { + return this.ec.sign(msg, this, enc, options); +}; + +KeyPair.prototype.verify = function verify(msg, signature) { + return this.ec.verify(msg, signature, this); +}; + +KeyPair.prototype.inspect = function inspect() { + return ''; +}; + +},{"../utils":187,"bn.js":169}],182:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); + +var utils = require('../utils'); +var assert = utils.assert; + +function Signature(options, enc) { + if (options instanceof Signature) + return options; + + if (this._importDER(options, enc)) + return; + + assert(options.r && options.s, 'Signature without r or s'); + this.r = new BN(options.r, 16); + this.s = new BN(options.s, 16); + if (options.recoveryParam === undefined) + this.recoveryParam = null; + else + this.recoveryParam = options.recoveryParam; } +module.exports = Signature; -Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 +function Position() { + this.place = 0; } -Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +function getLength(buf, p) { + var initial = buf[p.place++]; + if (!(initial & 0x80)) { + return initial; + } + var octetLen = initial & 0xf; + + // Indefinite length or overflow + if (octetLen === 0 || octetLen > 4) { + return false; + } + + var val = 0; + for (var i = 0, off = p.place; i < octetLen; i++, off++) { + val <<= 8; + val |= buf[off]; + val >>>= 0; + } + + // Leading zeroes + if (val <= 0x7f) { + return false; + } + + p.place = off; + return val; } -Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +function rmPadding(buf) { + var i = 0; + var len = buf.length - 1; + while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) { + i++; + } + if (i === 0) { + return buf; + } + return buf.slice(i); } -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining +Signature.prototype._importDER = function _importDER(data, enc) { + data = utils.toArray(data, enc); + var p = new Position(); + if (data[p.place++] !== 0x30) { + return false; + } + var len = getLength(data, p); + if (len === false) { + return false; + } + if ((len + p.place) !== data.length) { + return false; + } + if (data[p.place++] !== 0x02) { + return false; + } + var rlen = getLength(data, p); + if (rlen === false) { + return false; + } + var r = data.slice(p.place, rlen + p.place); + p.place += rlen; + if (data[p.place++] !== 0x02) { + return false; + } + var slen = getLength(data, p); + if (slen === false) { + return false; + } + if (data.length !== slen + p.place) { + return false; + } + var s = data.slice(p.place, slen + p.place); + if (r[0] === 0) { + if (r[1] & 0x80) { + r = r.slice(1); + } else { + // Leading zeroes + return false; + } + } + if (s[0] === 0) { + if (s[1] & 0x80) { + s = s.slice(1); + } else { + // Leading zeroes + return false; } } - var strLen = string.length + this.r = new BN(r); + this.s = new BN(s); + this.recoveryParam = null; - if (length > strLen / 2) { - length = strLen / 2 + return true; +}; + +function constructLength(arr, len) { + if (len < 0x80) { + arr.push(len); + return; } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (numberIsNaN(parsed)) return i - buf[offset + i] = parsed + var octets = 1 + (Math.log(len) / Math.LN2 >>> 3); + arr.push(octets | 0x80); + while (--octets) { + arr.push((len >>> (octets << 3)) & 0xff); } - return i + arr.push(len); } -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} +Signature.prototype.toDER = function toDER(enc) { + var r = this.r.toArray(); + var s = this.s.toArray(); -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} + // Pad values + if (r[0] & 0x80) + r = [ 0 ].concat(r); + // Pad values + if (s[0] & 0x80) + s = [ 0 ].concat(s); -function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} + r = rmPadding(r); + s = rmPadding(s); -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} + while (!s[0] && !(s[1] & 0x80)) { + s = s.slice(1); + } + var arr = [ 0x02 ]; + constructLength(arr, r.length); + arr = arr.concat(r); + arr.push(0x02); + constructLength(arr, s.length); + var backHalf = arr.concat(s); + var res = [ 0x30 ]; + constructLength(res, backHalf.length); + res = res.concat(backHalf); + return utils.encode(res, enc); +}; -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +},{"../utils":187,"bn.js":169}],183:[function(require,module,exports){ +'use strict'; + +var hash = require('hash.js'); +var curves = require('../curves'); +var utils = require('../utils'); +var assert = utils.assert; +var parseBytes = utils.parseBytes; +var KeyPair = require('./key'); +var Signature = require('./signature'); + +function EDDSA(curve) { + assert(curve === 'ed25519', 'only tested with ed25519 so far'); + + if (!(this instanceof EDDSA)) + return new EDDSA(curve); + + curve = curves[curve].curve; + this.curve = curve; + this.g = curve.g; + this.g.precompute(curve.n.bitLength() + 1); + + this.pointClass = curve.point().constructor; + this.encodingLength = Math.ceil(curve.n.bitLength() / 8); + this.hash = hash.sha512; } -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8' - length = this.length - offset = 0 - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset - length = this.length - offset = 0 - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset >>> 0 - if (isFinite(length)) { - length = length >>> 0 - if (encoding === undefined) encoding = 'utf8' - } else { - encoding = length - length = undefined - } - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } +module.exports = EDDSA; - var remaining = this.length - offset - if (length === undefined || length > remaining) length = remaining +/** +* @param {Array|String} message - message bytes +* @param {Array|String|KeyPair} secret - secret bytes or a keypair +* @returns {Signature} - signature +*/ +EDDSA.prototype.sign = function sign(message, secret) { + message = parseBytes(message); + var key = this.keyFromSecret(secret); + var r = this.hashInt(key.messagePrefix(), message); + var R = this.g.mul(r); + var Rencoded = this.encodePoint(R); + var s_ = this.hashInt(Rencoded, key.pubBytes(), message) + .mul(key.priv()); + var S = r.add(s_).umod(this.curve.n); + return this.makeSignature({ R: R, S: S, Rencoded: Rencoded }); +}; - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } +/** +* @param {Array} message - message bytes +* @param {Array|String|Signature} sig - sig bytes +* @param {Array|String|Point|KeyPair} pub - public key +* @returns {Boolean} - true if public key matches sig of message +*/ +EDDSA.prototype.verify = function verify(message, sig, pub) { + message = parseBytes(message); + sig = this.makeSignature(sig); + var key = this.keyFromPublic(pub); + var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message); + var SG = this.g.mul(sig.S()); + var RplusAh = sig.R().add(key.pub().mul(h)); + return RplusAh.eq(SG); +}; - if (!encoding) encoding = 'utf8' +EDDSA.prototype.hashInt = function hashInt() { + var hash = this.hash(); + for (var i = 0; i < arguments.length; i++) + hash.update(arguments[i]); + return utils.intFromLE(hash.digest()).umod(this.curve.n); +}; - var loweredCase = false - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) +EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { + return KeyPair.fromPublic(this, pub); +}; - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) +EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { + return KeyPair.fromSecret(this, secret); +}; - case 'ascii': - return asciiWrite(this, string, offset, length) +EDDSA.prototype.makeSignature = function makeSignature(sig) { + if (sig instanceof Signature) + return sig; + return new Signature(this, sig); +}; - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) +/** +* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2 +* +* EDDSA defines methods for encoding and decoding points and integers. These are +* helper convenience methods, that pass along to utility functions implied +* parameters. +* +*/ +EDDSA.prototype.encodePoint = function encodePoint(point) { + var enc = point.getY().toArray('le', this.encodingLength); + enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0; + return enc; +}; - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) +EDDSA.prototype.decodePoint = function decodePoint(bytes) { + bytes = utils.parseBytes(bytes); - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) + var lastIx = bytes.length - 1; + var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80); + var xIsOdd = (bytes[lastIx] & 0x80) !== 0; - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} + var y = utils.intFromLE(normed); + return this.curve.pointFromY(y, xIsOdd); +}; -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} +EDDSA.prototype.encodeInt = function encodeInt(num) { + return num.toArray('le', this.encodingLength); +}; -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } +EDDSA.prototype.decodeInt = function decodeInt(bytes) { + return utils.intFromLE(bytes); +}; + +EDDSA.prototype.isPoint = function isPoint(val) { + return val instanceof this.pointClass; +}; + +},{"../curves":179,"../utils":187,"./key":184,"./signature":185,"hash.js":195}],184:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var assert = utils.assert; +var parseBytes = utils.parseBytes; +var cachedProperty = utils.cachedProperty; + +/** +* @param {EDDSA} eddsa - instance +* @param {Object} params - public/private key parameters +* +* @param {Array} [params.secret] - secret seed bytes +* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms) +* @param {Array} [params.pub] - public key point encoded as bytes +* +*/ +function KeyPair(eddsa, params) { + this.eddsa = eddsa; + this._secret = parseBytes(params.secret); + if (eddsa.isPoint(params.pub)) + this._pub = params.pub; + else + this._pubBytes = parseBytes(params.pub); } -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end) - var res = [] +KeyPair.fromPublic = function fromPublic(eddsa, pub) { + if (pub instanceof KeyPair) + return pub; + return new KeyPair(eddsa, { pub: pub }); +}; - var i = start - while (i < end) { - var firstByte = buf[i] - var codePoint = null - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1 +KeyPair.fromSecret = function fromSecret(eddsa, secret) { + if (secret instanceof KeyPair) + return secret; + return new KeyPair(eddsa, { secret: secret }); +}; - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint +KeyPair.prototype.secret = function secret() { + return this._secret; +}; - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte - } - break - case 2: - secondByte = buf[i + 1] - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint - } - } - break - case 3: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint - } - } - break - case 4: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - fourthByte = buf[i + 3] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint - } - } - } - } +cachedProperty(KeyPair, 'pubBytes', function pubBytes() { + return this.eddsa.encodePoint(this.pub()); +}); - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD - bytesPerSequence = 1 - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000 - res.push(codePoint >>> 10 & 0x3FF | 0xD800) - codePoint = 0xDC00 | codePoint & 0x3FF - } +cachedProperty(KeyPair, 'pub', function pub() { + if (this._pubBytes) + return this.eddsa.decodePoint(this._pubBytes); + return this.eddsa.g.mul(this.priv()); +}); - res.push(codePoint) - i += bytesPerSequence - } +cachedProperty(KeyPair, 'privBytes', function privBytes() { + var eddsa = this.eddsa; + var hash = this.hash(); + var lastIx = eddsa.encodingLength - 1; - return decodeCodePointsArray(res) -} + var a = hash.slice(0, eddsa.encodingLength); + a[0] &= 248; + a[lastIx] &= 127; + a[lastIx] |= 64; -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000 + return a; +}); -function decodeCodePointsArray (codePoints) { - var len = codePoints.length - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } +cachedProperty(KeyPair, 'priv', function priv() { + return this.eddsa.decodeInt(this.privBytes()); +}); - // Decode in chunks to avoid "call stack size exceeded". - var res = '' - var i = 0 - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ) - } - return res -} +cachedProperty(KeyPair, 'hash', function hash() { + return this.eddsa.hash().update(this.secret()).digest(); +}); -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) +cachedProperty(KeyPair, 'messagePrefix', function messagePrefix() { + return this.hash().slice(this.eddsa.encodingLength); +}); - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} +KeyPair.prototype.sign = function sign(message) { + assert(this._secret, 'KeyPair can only verify'); + return this.eddsa.sign(message, this); +}; -function latin1Slice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) +KeyPair.prototype.verify = function verify(message, sig) { + return this.eddsa.verify(message, sig, this); +}; - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]) - } - return ret -} +KeyPair.prototype.getSecret = function getSecret(enc) { + assert(this._secret, 'KeyPair is public only'); + return utils.encode(this.secret(), enc); +}; -function hexSlice (buf, start, end) { - var len = buf.length +KeyPair.prototype.getPublic = function getPublic(enc) { + return utils.encode(this.pubBytes(), enc); +}; - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len +module.exports = KeyPair; - var out = '' - for (var i = start; i < end; ++i) { - out += toHex(buf[i]) - } - return out -} +},{"../utils":187}],185:[function(require,module,exports){ +'use strict'; -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) +var BN = require('bn.js'); +var utils = require('../utils'); +var assert = utils.assert; +var cachedProperty = utils.cachedProperty; +var parseBytes = utils.parseBytes; + +/** +* @param {EDDSA} eddsa - eddsa instance +* @param {Array|Object} sig - +* @param {Array|Point} [sig.R] - R point as Point or bytes +* @param {Array|bn} [sig.S] - S scalar as bn or bytes +* @param {Array} [sig.Rencoded] - R point encoded +* @param {Array} [sig.Sencoded] - S scalar encoded +*/ +function Signature(eddsa, sig) { + this.eddsa = eddsa; + + if (typeof sig !== 'object') + sig = parseBytes(sig); + + if (Array.isArray(sig)) { + sig = { + R: sig.slice(0, eddsa.encodingLength), + S: sig.slice(eddsa.encodingLength), + }; } - return res + + assert(sig.R && sig.S, 'Signature without R or S'); + + if (eddsa.isPoint(sig.R)) + this._R = sig.R; + if (sig.S instanceof BN) + this._S = sig.S; + + this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; + this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; } -Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end +cachedProperty(Signature, 'S', function S() { + return this.eddsa.decodeInt(this.Sencoded()); +}); - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len - } +cachedProperty(Signature, 'R', function R() { + return this.eddsa.decodePoint(this.Rencoded()); +}); - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len - } +cachedProperty(Signature, 'Rencoded', function Rencoded() { + return this.eddsa.encodePoint(this.R()); +}); - if (end < start) end = start +cachedProperty(Signature, 'Sencoded', function Sencoded() { + return this.eddsa.encodeInt(this.S()); +}); - var newBuf = this.subarray(start, end) - // Return an augmented `Uint8Array` instance - newBuf.__proto__ = Buffer.prototype - return newBuf -} +Signature.prototype.toBytes = function toBytes() { + return this.Rencoded().concat(this.Sencoded()); +}; -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} +Signature.prototype.toHex = function toHex() { + return utils.encode(this.toBytes(), 'hex').toUpperCase(); +}; -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) +module.exports = Signature; + +},{"../utils":187,"bn.js":169}],186:[function(require,module,exports){ +module.exports = { + doubles: { + step: 4, + points: [ + [ + 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a', + 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821', + ], + [ + '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508', + '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf', + ], + [ + '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739', + 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695', + ], + [ + '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640', + '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9', + ], + [ + '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c', + '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36', + ], + [ + '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda', + '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f', + ], + [ + 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa', + '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999', + ], + [ + '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0', + 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09', + ], + [ + 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d', + '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d', + ], + [ + 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d', + 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088', + ], + [ + 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1', + '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d', + ], + [ + '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0', + '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8', + ], + [ + '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047', + '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a', + ], + [ + '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862', + '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453', + ], + [ + '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7', + '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160', + ], + [ + '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd', + '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0', + ], + [ + '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83', + '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6', + ], + [ + '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a', + '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589', + ], + [ + '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8', + 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17', + ], + [ + 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d', + '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda', + ], + [ + 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725', + '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd', + ], + [ + '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754', + '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2', + ], + [ + '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c', + '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6', + ], + [ + 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6', + '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f', + ], + [ + '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39', + 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01', + ], + [ + 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891', + '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3', + ], + [ + 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b', + 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f', + ], + [ + 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03', + '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7', + ], + [ + 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d', + 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78', + ], + [ + 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070', + '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1', + ], + [ + '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4', + 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150', + ], + [ + '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da', + '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82', + ], + [ + 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11', + '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc', + ], + [ + '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e', + 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b', + ], + [ + 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41', + '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51', + ], + [ + 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef', + '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45', + ], + [ + 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8', + 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120', + ], + [ + '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d', + '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84', + ], + [ + '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96', + '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d', + ], + [ + '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd', + 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d', + ], + [ + '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5', + '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8', + ], + [ + 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266', + '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8', + ], + [ + '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71', + '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac', + ], + [ + '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac', + 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f', + ], + [ + '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751', + '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962', + ], + [ + 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e', + '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907', + ], + [ + '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241', + 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec', + ], + [ + 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3', + 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d', + ], + [ + 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f', + '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414', + ], + [ + '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19', + 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd', + ], + [ + '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be', + 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0', + ], + [ + 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9', + '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811', + ], + [ + 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2', + '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1', + ], + [ + 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13', + '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c', + ], + [ + '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c', + 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73', + ], + [ + '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba', + '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd', + ], + [ + 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151', + 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405', + ], + [ + '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073', + 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589', + ], + [ + '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458', + '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e', + ], + [ + '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b', + '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27', + ], + [ + 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366', + 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1', + ], + [ + '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa', + '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482', + ], + [ + '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0', + '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945', + ], + [ + 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787', + '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573', + ], + [ + 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e', + 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82', + ], + ], + }, + naf: { + wnd: 7, + points: [ + [ + 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9', + '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672', + ], + [ + '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4', + 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6', + ], + [ + '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc', + '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da', + ], + [ + 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe', + 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37', + ], + [ + '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb', + 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b', + ], + [ + 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8', + 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81', + ], + [ + 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e', + '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58', + ], + [ + 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34', + '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77', + ], + [ + '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c', + '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a', + ], + [ + '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5', + '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c', + ], + [ + '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f', + '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67', + ], + [ + '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714', + '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402', + ], + [ + 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729', + 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55', + ], + [ + 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db', + '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482', + ], + [ + '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4', + 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82', + ], + [ + '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5', + 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396', + ], + [ + '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479', + '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49', + ], + [ + '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d', + '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf', + ], + [ + '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f', + '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a', + ], + [ + '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb', + 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7', + ], + [ + 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9', + 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933', + ], + [ + '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963', + '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a', + ], + [ + '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74', + '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6', + ], + [ + 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530', + 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37', + ], + [ + '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b', + '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e', + ], + [ + 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247', + 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6', + ], + [ + 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1', + 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476', + ], + [ + '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120', + '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40', + ], + [ + '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435', + '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61', + ], + [ + '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18', + '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683', + ], + [ + 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8', + '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5', + ], + [ + '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb', + '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b', + ], + [ + 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f', + '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417', + ], + [ + '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143', + 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868', + ], + [ + '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba', + 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a', + ], + [ + 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45', + 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6', + ], + [ + '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a', + '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996', + ], + [ + '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e', + 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e', + ], + [ + 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8', + 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d', + ], + [ + '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c', + '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2', + ], + [ + '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519', + 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e', + ], + [ + '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab', + '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437', + ], + [ + '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca', + 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311', + ], + [ + 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf', + '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4', + ], + [ + '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610', + '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575', + ], + [ + '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4', + 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d', + ], + [ + '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c', + 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d', + ], + [ + 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940', + 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629', + ], + [ + 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980', + 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06', + ], + [ + '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3', + '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374', + ], + [ + '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf', + '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee', + ], + [ + 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63', + '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1', + ], + [ + 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448', + 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b', + ], + [ + '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf', + '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661', + ], + [ + '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5', + '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6', + ], + [ + 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6', + '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e', + ], + [ + '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5', + '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d', + ], + [ + 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99', + 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc', + ], + [ + '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51', + 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4', + ], + [ + '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5', + '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c', + ], + [ + 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5', + '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b', + ], + [ + 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997', + '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913', + ], + [ + '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881', + '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154', + ], + [ + '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5', + '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865', + ], + [ + '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66', + 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc', + ], + [ + '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726', + 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224', + ], + [ + '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede', + '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e', + ], + [ + '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94', + '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6', + ], + [ + '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31', + '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511', + ], + [ + '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51', + 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b', + ], + [ + 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252', + 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2', + ], + [ + '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5', + 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c', + ], + [ + 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b', + '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3', + ], + [ + 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4', + '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d', + ], + [ + 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f', + '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700', + ], + [ + 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889', + '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4', + ], + [ + '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246', + 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196', + ], + [ + '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984', + '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4', + ], + [ + '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a', + 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257', + ], + [ + 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030', + 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13', + ], + [ + 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197', + '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096', + ], + [ + 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593', + 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38', + ], + [ + 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef', + '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f', + ], + [ + '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38', + '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448', + ], + [ + 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a', + '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a', + ], + [ + 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111', + '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4', + ], + [ + '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502', + '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437', + ], + [ + '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea', + 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7', + ], + [ + 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26', + '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d', + ], + [ + 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986', + '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a', + ], + [ + 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e', + '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54', + ], + [ + '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4', + '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77', + ], + [ + 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda', + 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517', + ], + [ + '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859', + 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10', + ], + [ + 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f', + 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125', + ], + [ + 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c', + '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e', + ], + [ + '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942', + 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1', + ], + [ + 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a', + '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2', + ], + [ + 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80', + '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423', + ], + [ + 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d', + '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8', + ], + [ + '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1', + 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758', + ], + [ + '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63', + 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375', + ], + [ + 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352', + '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d', + ], + [ + '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193', + 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec', + ], + [ + '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00', + '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0', + ], + [ + '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58', + 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c', + ], + [ + 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7', + 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4', + ], + [ + '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8', + 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f', + ], + [ + '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e', + '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649', + ], + [ + '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d', + 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826', + ], + [ + '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b', + '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5', + ], + [ + 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f', + 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87', + ], + [ + '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6', + '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b', + ], + [ + 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297', + '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc', + ], + [ + '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a', + '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c', + ], + [ + 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c', + 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f', + ], + [ + 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52', + '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a', + ], + [ + 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb', + 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46', + ], + [ + '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065', + 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f', + ], + [ + '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917', + '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03', + ], + [ + '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9', + 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08', + ], + [ + '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3', + '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8', + ], + [ + '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57', + '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373', + ], + [ + '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66', + 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3', + ], + [ + '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8', + '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8', + ], + [ + '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721', + '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1', + ], + [ + '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180', + '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9', + ], + ], + }, +}; - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul +},{}],187:[function(require,module,exports){ +'use strict'; + +var utils = exports; +var BN = require('bn.js'); +var minAssert = require('minimalistic-assert'); +var minUtils = require('minimalistic-crypto-utils'); + +utils.assert = minAssert; +utils.toArray = minUtils.toArray; +utils.zero2 = minUtils.zero2; +utils.toHex = minUtils.toHex; +utils.encode = minUtils.encode; + +// Represent num in a w-NAF form +function getNAF(num, w, bits) { + var naf = new Array(Math.max(num.bitLength(), bits) + 1); + naf.fill(0); + + var ws = 1 << (w + 1); + var k = num.clone(); + + for (var i = 0; i < naf.length; i++) { + var z; + var mod = k.andln(ws - 1); + if (k.isOdd()) { + if (mod > (ws >> 1) - 1) + z = (ws >> 1) - mod; + else + z = mod; + k.isubn(z); + } else { + z = 0; + } + + naf[i] = z; + k.iushrn(1); } - return val + return naf; } +utils.getNAF = getNAF; -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) - } +// Represent k1, k2 in a Joint Sparse Form +function getJSF(k1, k2) { + var jsf = [ + [], + [], + ]; - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul - } + k1 = k1.clone(); + k2 = k2.clone(); + var d1 = 0; + var d2 = 0; + var m8; + while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { + // First phase + var m14 = (k1.andln(3) + d1) & 3; + var m24 = (k2.andln(3) + d2) & 3; + if (m14 === 3) + m14 = -1; + if (m24 === 3) + m24 = -1; + var u1; + if ((m14 & 1) === 0) { + u1 = 0; + } else { + m8 = (k1.andln(7) + d1) & 7; + if ((m8 === 3 || m8 === 5) && m24 === 2) + u1 = -m14; + else + u1 = m14; + } + jsf[0].push(u1); - return val -} + var u2; + if ((m24 & 1) === 0) { + u2 = 0; + } else { + m8 = (k2.andln(7) + d2) & 7; + if ((m8 === 3 || m8 === 5) && m14 === 2) + u2 = -m24; + else + u2 = m24; + } + jsf[1].push(u2); + + // Second phase + if (2 * d1 === u1 + 1) + d1 = 1 - d1; + if (2 * d2 === u2 + 1) + d2 = 1 - d2; + k1.iushrn(1); + k2.iushrn(1); + } -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] + return jsf; } +utils.getJSF = getJSF; -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) +function cachedProperty(obj, name, computer) { + var key = '_' + name; + obj.prototype[name] = function cachedProperty() { + return this[key] !== undefined ? this[key] : + this[key] = computer.call(this); + }; } +utils.cachedProperty = cachedProperty; -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] +function parseBytes(bytes) { + return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') : + bytes; } +utils.parseBytes = parseBytes; -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) +function intFromLE(bytes) { + return new BN(bytes, 'hex', 'le'); } - -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) +utils.intFromLE = intFromLE; + + +},{"bn.js":169,"minimalistic-assert":211,"minimalistic-crypto-utils":212}],188:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } } -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul +},{}],189:[function(require,module,exports){ +module.exports={ + "name": "elliptic", + "version": "6.5.4", + "description": "EC cryptography", + "main": "lib/elliptic.js", + "files": [ + "lib" + ], + "scripts": { + "lint": "eslint lib test", + "lint:fix": "npm run lint -- --fix", + "unit": "istanbul test _mocha --reporter=spec test/index.js", + "test": "npm run lint && npm run unit", + "version": "grunt dist && git add dist/" + }, + "repository": { + "type": "git", + "url": "git@github.com:indutny/elliptic" + }, + "keywords": [ + "EC", + "Elliptic", + "curve", + "Cryptography" + ], + "author": "Fedor Indutny ", + "license": "MIT", + "bugs": { + "url": "https://github.com/indutny/elliptic/issues" + }, + "homepage": "https://github.com/indutny/elliptic", + "devDependencies": { + "brfs": "^2.0.2", + "coveralls": "^3.1.0", + "eslint": "^7.6.0", + "grunt": "^1.2.1", + "grunt-browserify": "^5.3.0", + "grunt-cli": "^1.3.2", + "grunt-contrib-connect": "^3.0.0", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-uglify": "^5.0.0", + "grunt-mocha-istanbul": "^5.0.2", + "grunt-saucelabs": "^9.0.1", + "istanbul": "^0.4.5", + "mocha": "^8.0.1" + }, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } - mul *= 0x80 +} - if (val >= mul) val -= Math.pow(2, 8 * byteLength) +},{}],190:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +exports.version = "ethers/5.4.4"; - return val +},{}],191:[function(require,module,exports){ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Wordlist = exports.version = exports.wordlists = exports.utils = exports.logger = exports.errors = exports.constants = exports.FixedNumber = exports.BigNumber = exports.ContractFactory = exports.Contract = exports.BaseContract = exports.providers = exports.getDefaultProvider = exports.VoidSigner = exports.Wallet = exports.Signer = void 0; +var contracts_1 = require("@ethersproject/contracts"); +Object.defineProperty(exports, "BaseContract", { enumerable: true, get: function () { return contracts_1.BaseContract; } }); +Object.defineProperty(exports, "Contract", { enumerable: true, get: function () { return contracts_1.Contract; } }); +Object.defineProperty(exports, "ContractFactory", { enumerable: true, get: function () { return contracts_1.ContractFactory; } }); +var bignumber_1 = require("@ethersproject/bignumber"); +Object.defineProperty(exports, "BigNumber", { enumerable: true, get: function () { return bignumber_1.BigNumber; } }); +Object.defineProperty(exports, "FixedNumber", { enumerable: true, get: function () { return bignumber_1.FixedNumber; } }); +var abstract_signer_1 = require("@ethersproject/abstract-signer"); +Object.defineProperty(exports, "Signer", { enumerable: true, get: function () { return abstract_signer_1.Signer; } }); +Object.defineProperty(exports, "VoidSigner", { enumerable: true, get: function () { return abstract_signer_1.VoidSigner; } }); +var wallet_1 = require("@ethersproject/wallet"); +Object.defineProperty(exports, "Wallet", { enumerable: true, get: function () { return wallet_1.Wallet; } }); +var constants = __importStar(require("@ethersproject/constants")); +exports.constants = constants; +var providers = __importStar(require("@ethersproject/providers")); +exports.providers = providers; +var providers_1 = require("@ethersproject/providers"); +Object.defineProperty(exports, "getDefaultProvider", { enumerable: true, get: function () { return providers_1.getDefaultProvider; } }); +var wordlists_1 = require("@ethersproject/wordlists"); +Object.defineProperty(exports, "Wordlist", { enumerable: true, get: function () { return wordlists_1.Wordlist; } }); +Object.defineProperty(exports, "wordlists", { enumerable: true, get: function () { return wordlists_1.wordlists; } }); +var utils = __importStar(require("./utils")); +exports.utils = utils; +var logger_1 = require("@ethersproject/logger"); +Object.defineProperty(exports, "errors", { enumerable: true, get: function () { return logger_1.ErrorCode; } }); +//////////////////////// +// Compile-Time Constants +// This is generated by "npm run dist" +var _version_1 = require("./_version"); +Object.defineProperty(exports, "version", { enumerable: true, get: function () { return _version_1.version; } }); +var logger = new logger_1.Logger(_version_1.version); +exports.logger = logger; + +},{"./_version":190,"./utils":193,"@ethersproject/abstract-signer":22,"@ethersproject/bignumber":31,"@ethersproject/constants":37,"@ethersproject/contracts":40,"@ethersproject/logger":57,"@ethersproject/providers":73,"@ethersproject/wallet":106,"@ethersproject/wordlists":111}],192:[function(require,module,exports){ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Wordlist = exports.version = exports.wordlists = exports.utils = exports.logger = exports.errors = exports.constants = exports.FixedNumber = exports.BigNumber = exports.ContractFactory = exports.Contract = exports.BaseContract = exports.providers = exports.getDefaultProvider = exports.VoidSigner = exports.Wallet = exports.Signer = exports.ethers = void 0; +// To modify this file, you must update ./misc/admin/lib/cmds/update-exports.js +var ethers = __importStar(require("./ethers")); +exports.ethers = ethers; +try { + var anyGlobal = window; + if (anyGlobal._ethers == null) { + anyGlobal._ethers = ethers; + } } +catch (error) { } +var ethers_1 = require("./ethers"); +Object.defineProperty(exports, "Signer", { enumerable: true, get: function () { return ethers_1.Signer; } }); +Object.defineProperty(exports, "Wallet", { enumerable: true, get: function () { return ethers_1.Wallet; } }); +Object.defineProperty(exports, "VoidSigner", { enumerable: true, get: function () { return ethers_1.VoidSigner; } }); +Object.defineProperty(exports, "getDefaultProvider", { enumerable: true, get: function () { return ethers_1.getDefaultProvider; } }); +Object.defineProperty(exports, "providers", { enumerable: true, get: function () { return ethers_1.providers; } }); +Object.defineProperty(exports, "BaseContract", { enumerable: true, get: function () { return ethers_1.BaseContract; } }); +Object.defineProperty(exports, "Contract", { enumerable: true, get: function () { return ethers_1.Contract; } }); +Object.defineProperty(exports, "ContractFactory", { enumerable: true, get: function () { return ethers_1.ContractFactory; } }); +Object.defineProperty(exports, "BigNumber", { enumerable: true, get: function () { return ethers_1.BigNumber; } }); +Object.defineProperty(exports, "FixedNumber", { enumerable: true, get: function () { return ethers_1.FixedNumber; } }); +Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return ethers_1.constants; } }); +Object.defineProperty(exports, "errors", { enumerable: true, get: function () { return ethers_1.errors; } }); +Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return ethers_1.logger; } }); +Object.defineProperty(exports, "utils", { enumerable: true, get: function () { return ethers_1.utils; } }); +Object.defineProperty(exports, "wordlists", { enumerable: true, get: function () { return ethers_1.wordlists; } }); +//////////////////////// +// Compile-Time Constants +Object.defineProperty(exports, "version", { enumerable: true, get: function () { return ethers_1.version; } }); +Object.defineProperty(exports, "Wordlist", { enumerable: true, get: function () { return ethers_1.Wordlist; } }); + +},{"./ethers":191}],193:[function(require,module,exports){ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatBytes32String = exports.Utf8ErrorFuncs = exports.toUtf8String = exports.toUtf8CodePoints = exports.toUtf8Bytes = exports._toEscapedUtf8String = exports.nameprep = exports.hexDataSlice = exports.hexDataLength = exports.hexZeroPad = exports.hexValue = exports.hexStripZeros = exports.hexConcat = exports.isHexString = exports.hexlify = exports.base64 = exports.base58 = exports.TransactionDescription = exports.LogDescription = exports.Interface = exports.SigningKey = exports.HDNode = exports.defaultPath = exports.isBytesLike = exports.isBytes = exports.zeroPad = exports.stripZeros = exports.concat = exports.arrayify = exports.shallowCopy = exports.resolveProperties = exports.getStatic = exports.defineReadOnly = exports.deepCopy = exports.checkProperties = exports.poll = exports.fetchJson = exports._fetchData = exports.RLP = exports.Logger = exports.checkResultErrors = exports.FormatTypes = exports.ParamType = exports.FunctionFragment = exports.EventFragment = exports.ErrorFragment = exports.ConstructorFragment = exports.Fragment = exports.defaultAbiCoder = exports.AbiCoder = void 0; +exports.Indexed = exports.Utf8ErrorReason = exports.UnicodeNormalizationForm = exports.SupportedAlgorithm = exports.mnemonicToSeed = exports.isValidMnemonic = exports.entropyToMnemonic = exports.mnemonicToEntropy = exports.getAccountPath = exports.verifyTypedData = exports.verifyMessage = exports.recoverPublicKey = exports.computePublicKey = exports.recoverAddress = exports.computeAddress = exports.getJsonWalletAddress = exports.TransactionTypes = exports.serializeTransaction = exports.parseTransaction = exports.accessListify = exports.joinSignature = exports.splitSignature = exports.soliditySha256 = exports.solidityKeccak256 = exports.solidityPack = exports.shuffled = exports.randomBytes = exports.sha512 = exports.sha256 = exports.ripemd160 = exports.keccak256 = exports.computeHmac = exports.commify = exports.parseUnits = exports.formatUnits = exports.parseEther = exports.formatEther = exports.isAddress = exports.getCreate2Address = exports.getContractAddress = exports.getIcapAddress = exports.getAddress = exports._TypedDataEncoder = exports.id = exports.isValidName = exports.namehash = exports.hashMessage = exports.parseBytes32String = void 0; +var abi_1 = require("@ethersproject/abi"); +Object.defineProperty(exports, "AbiCoder", { enumerable: true, get: function () { return abi_1.AbiCoder; } }); +Object.defineProperty(exports, "checkResultErrors", { enumerable: true, get: function () { return abi_1.checkResultErrors; } }); +Object.defineProperty(exports, "ConstructorFragment", { enumerable: true, get: function () { return abi_1.ConstructorFragment; } }); +Object.defineProperty(exports, "defaultAbiCoder", { enumerable: true, get: function () { return abi_1.defaultAbiCoder; } }); +Object.defineProperty(exports, "ErrorFragment", { enumerable: true, get: function () { return abi_1.ErrorFragment; } }); +Object.defineProperty(exports, "EventFragment", { enumerable: true, get: function () { return abi_1.EventFragment; } }); +Object.defineProperty(exports, "FormatTypes", { enumerable: true, get: function () { return abi_1.FormatTypes; } }); +Object.defineProperty(exports, "Fragment", { enumerable: true, get: function () { return abi_1.Fragment; } }); +Object.defineProperty(exports, "FunctionFragment", { enumerable: true, get: function () { return abi_1.FunctionFragment; } }); +Object.defineProperty(exports, "Indexed", { enumerable: true, get: function () { return abi_1.Indexed; } }); +Object.defineProperty(exports, "Interface", { enumerable: true, get: function () { return abi_1.Interface; } }); +Object.defineProperty(exports, "LogDescription", { enumerable: true, get: function () { return abi_1.LogDescription; } }); +Object.defineProperty(exports, "ParamType", { enumerable: true, get: function () { return abi_1.ParamType; } }); +Object.defineProperty(exports, "TransactionDescription", { enumerable: true, get: function () { return abi_1.TransactionDescription; } }); +var address_1 = require("@ethersproject/address"); +Object.defineProperty(exports, "getAddress", { enumerable: true, get: function () { return address_1.getAddress; } }); +Object.defineProperty(exports, "getCreate2Address", { enumerable: true, get: function () { return address_1.getCreate2Address; } }); +Object.defineProperty(exports, "getContractAddress", { enumerable: true, get: function () { return address_1.getContractAddress; } }); +Object.defineProperty(exports, "getIcapAddress", { enumerable: true, get: function () { return address_1.getIcapAddress; } }); +Object.defineProperty(exports, "isAddress", { enumerable: true, get: function () { return address_1.isAddress; } }); +var base64 = __importStar(require("@ethersproject/base64")); +exports.base64 = base64; +var basex_1 = require("@ethersproject/basex"); +Object.defineProperty(exports, "base58", { enumerable: true, get: function () { return basex_1.Base58; } }); +var bytes_1 = require("@ethersproject/bytes"); +Object.defineProperty(exports, "arrayify", { enumerable: true, get: function () { return bytes_1.arrayify; } }); +Object.defineProperty(exports, "concat", { enumerable: true, get: function () { return bytes_1.concat; } }); +Object.defineProperty(exports, "hexConcat", { enumerable: true, get: function () { return bytes_1.hexConcat; } }); +Object.defineProperty(exports, "hexDataSlice", { enumerable: true, get: function () { return bytes_1.hexDataSlice; } }); +Object.defineProperty(exports, "hexDataLength", { enumerable: true, get: function () { return bytes_1.hexDataLength; } }); +Object.defineProperty(exports, "hexlify", { enumerable: true, get: function () { return bytes_1.hexlify; } }); +Object.defineProperty(exports, "hexStripZeros", { enumerable: true, get: function () { return bytes_1.hexStripZeros; } }); +Object.defineProperty(exports, "hexValue", { enumerable: true, get: function () { return bytes_1.hexValue; } }); +Object.defineProperty(exports, "hexZeroPad", { enumerable: true, get: function () { return bytes_1.hexZeroPad; } }); +Object.defineProperty(exports, "isBytes", { enumerable: true, get: function () { return bytes_1.isBytes; } }); +Object.defineProperty(exports, "isBytesLike", { enumerable: true, get: function () { return bytes_1.isBytesLike; } }); +Object.defineProperty(exports, "isHexString", { enumerable: true, get: function () { return bytes_1.isHexString; } }); +Object.defineProperty(exports, "joinSignature", { enumerable: true, get: function () { return bytes_1.joinSignature; } }); +Object.defineProperty(exports, "zeroPad", { enumerable: true, get: function () { return bytes_1.zeroPad; } }); +Object.defineProperty(exports, "splitSignature", { enumerable: true, get: function () { return bytes_1.splitSignature; } }); +Object.defineProperty(exports, "stripZeros", { enumerable: true, get: function () { return bytes_1.stripZeros; } }); +var hash_1 = require("@ethersproject/hash"); +Object.defineProperty(exports, "_TypedDataEncoder", { enumerable: true, get: function () { return hash_1._TypedDataEncoder; } }); +Object.defineProperty(exports, "hashMessage", { enumerable: true, get: function () { return hash_1.hashMessage; } }); +Object.defineProperty(exports, "id", { enumerable: true, get: function () { return hash_1.id; } }); +Object.defineProperty(exports, "isValidName", { enumerable: true, get: function () { return hash_1.isValidName; } }); +Object.defineProperty(exports, "namehash", { enumerable: true, get: function () { return hash_1.namehash; } }); +var hdnode_1 = require("@ethersproject/hdnode"); +Object.defineProperty(exports, "defaultPath", { enumerable: true, get: function () { return hdnode_1.defaultPath; } }); +Object.defineProperty(exports, "entropyToMnemonic", { enumerable: true, get: function () { return hdnode_1.entropyToMnemonic; } }); +Object.defineProperty(exports, "getAccountPath", { enumerable: true, get: function () { return hdnode_1.getAccountPath; } }); +Object.defineProperty(exports, "HDNode", { enumerable: true, get: function () { return hdnode_1.HDNode; } }); +Object.defineProperty(exports, "isValidMnemonic", { enumerable: true, get: function () { return hdnode_1.isValidMnemonic; } }); +Object.defineProperty(exports, "mnemonicToEntropy", { enumerable: true, get: function () { return hdnode_1.mnemonicToEntropy; } }); +Object.defineProperty(exports, "mnemonicToSeed", { enumerable: true, get: function () { return hdnode_1.mnemonicToSeed; } }); +var json_wallets_1 = require("@ethersproject/json-wallets"); +Object.defineProperty(exports, "getJsonWalletAddress", { enumerable: true, get: function () { return json_wallets_1.getJsonWalletAddress; } }); +var keccak256_1 = require("@ethersproject/keccak256"); +Object.defineProperty(exports, "keccak256", { enumerable: true, get: function () { return keccak256_1.keccak256; } }); +var logger_1 = require("@ethersproject/logger"); +Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } }); +var sha2_1 = require("@ethersproject/sha2"); +Object.defineProperty(exports, "computeHmac", { enumerable: true, get: function () { return sha2_1.computeHmac; } }); +Object.defineProperty(exports, "ripemd160", { enumerable: true, get: function () { return sha2_1.ripemd160; } }); +Object.defineProperty(exports, "sha256", { enumerable: true, get: function () { return sha2_1.sha256; } }); +Object.defineProperty(exports, "sha512", { enumerable: true, get: function () { return sha2_1.sha512; } }); +var solidity_1 = require("@ethersproject/solidity"); +Object.defineProperty(exports, "solidityKeccak256", { enumerable: true, get: function () { return solidity_1.keccak256; } }); +Object.defineProperty(exports, "solidityPack", { enumerable: true, get: function () { return solidity_1.pack; } }); +Object.defineProperty(exports, "soliditySha256", { enumerable: true, get: function () { return solidity_1.sha256; } }); +var random_1 = require("@ethersproject/random"); +Object.defineProperty(exports, "randomBytes", { enumerable: true, get: function () { return random_1.randomBytes; } }); +Object.defineProperty(exports, "shuffled", { enumerable: true, get: function () { return random_1.shuffled; } }); +var properties_1 = require("@ethersproject/properties"); +Object.defineProperty(exports, "checkProperties", { enumerable: true, get: function () { return properties_1.checkProperties; } }); +Object.defineProperty(exports, "deepCopy", { enumerable: true, get: function () { return properties_1.deepCopy; } }); +Object.defineProperty(exports, "defineReadOnly", { enumerable: true, get: function () { return properties_1.defineReadOnly; } }); +Object.defineProperty(exports, "getStatic", { enumerable: true, get: function () { return properties_1.getStatic; } }); +Object.defineProperty(exports, "resolveProperties", { enumerable: true, get: function () { return properties_1.resolveProperties; } }); +Object.defineProperty(exports, "shallowCopy", { enumerable: true, get: function () { return properties_1.shallowCopy; } }); +var RLP = __importStar(require("@ethersproject/rlp")); +exports.RLP = RLP; +var signing_key_1 = require("@ethersproject/signing-key"); +Object.defineProperty(exports, "computePublicKey", { enumerable: true, get: function () { return signing_key_1.computePublicKey; } }); +Object.defineProperty(exports, "recoverPublicKey", { enumerable: true, get: function () { return signing_key_1.recoverPublicKey; } }); +Object.defineProperty(exports, "SigningKey", { enumerable: true, get: function () { return signing_key_1.SigningKey; } }); +var strings_1 = require("@ethersproject/strings"); +Object.defineProperty(exports, "formatBytes32String", { enumerable: true, get: function () { return strings_1.formatBytes32String; } }); +Object.defineProperty(exports, "nameprep", { enumerable: true, get: function () { return strings_1.nameprep; } }); +Object.defineProperty(exports, "parseBytes32String", { enumerable: true, get: function () { return strings_1.parseBytes32String; } }); +Object.defineProperty(exports, "_toEscapedUtf8String", { enumerable: true, get: function () { return strings_1._toEscapedUtf8String; } }); +Object.defineProperty(exports, "toUtf8Bytes", { enumerable: true, get: function () { return strings_1.toUtf8Bytes; } }); +Object.defineProperty(exports, "toUtf8CodePoints", { enumerable: true, get: function () { return strings_1.toUtf8CodePoints; } }); +Object.defineProperty(exports, "toUtf8String", { enumerable: true, get: function () { return strings_1.toUtf8String; } }); +Object.defineProperty(exports, "Utf8ErrorFuncs", { enumerable: true, get: function () { return strings_1.Utf8ErrorFuncs; } }); +var transactions_1 = require("@ethersproject/transactions"); +Object.defineProperty(exports, "accessListify", { enumerable: true, get: function () { return transactions_1.accessListify; } }); +Object.defineProperty(exports, "computeAddress", { enumerable: true, get: function () { return transactions_1.computeAddress; } }); +Object.defineProperty(exports, "parseTransaction", { enumerable: true, get: function () { return transactions_1.parse; } }); +Object.defineProperty(exports, "recoverAddress", { enumerable: true, get: function () { return transactions_1.recoverAddress; } }); +Object.defineProperty(exports, "serializeTransaction", { enumerable: true, get: function () { return transactions_1.serialize; } }); +Object.defineProperty(exports, "TransactionTypes", { enumerable: true, get: function () { return transactions_1.TransactionTypes; } }); +var units_1 = require("@ethersproject/units"); +Object.defineProperty(exports, "commify", { enumerable: true, get: function () { return units_1.commify; } }); +Object.defineProperty(exports, "formatEther", { enumerable: true, get: function () { return units_1.formatEther; } }); +Object.defineProperty(exports, "parseEther", { enumerable: true, get: function () { return units_1.parseEther; } }); +Object.defineProperty(exports, "formatUnits", { enumerable: true, get: function () { return units_1.formatUnits; } }); +Object.defineProperty(exports, "parseUnits", { enumerable: true, get: function () { return units_1.parseUnits; } }); +var wallet_1 = require("@ethersproject/wallet"); +Object.defineProperty(exports, "verifyMessage", { enumerable: true, get: function () { return wallet_1.verifyMessage; } }); +Object.defineProperty(exports, "verifyTypedData", { enumerable: true, get: function () { return wallet_1.verifyTypedData; } }); +var web_1 = require("@ethersproject/web"); +Object.defineProperty(exports, "_fetchData", { enumerable: true, get: function () { return web_1._fetchData; } }); +Object.defineProperty(exports, "fetchJson", { enumerable: true, get: function () { return web_1.fetchJson; } }); +Object.defineProperty(exports, "poll", { enumerable: true, get: function () { return web_1.poll; } }); +//////////////////////// +// Enums +var sha2_2 = require("@ethersproject/sha2"); +Object.defineProperty(exports, "SupportedAlgorithm", { enumerable: true, get: function () { return sha2_2.SupportedAlgorithm; } }); +var strings_2 = require("@ethersproject/strings"); +Object.defineProperty(exports, "UnicodeNormalizationForm", { enumerable: true, get: function () { return strings_2.UnicodeNormalizationForm; } }); +Object.defineProperty(exports, "Utf8ErrorReason", { enumerable: true, get: function () { return strings_2.Utf8ErrorReason; } }); + +},{"@ethersproject/abi":17,"@ethersproject/address":24,"@ethersproject/base64":26,"@ethersproject/basex":27,"@ethersproject/bytes":33,"@ethersproject/hash":43,"@ethersproject/hdnode":48,"@ethersproject/json-wallets":51,"@ethersproject/keccak256":55,"@ethersproject/logger":57,"@ethersproject/properties":63,"@ethersproject/random":84,"@ethersproject/rlp":87,"@ethersproject/sha2":90,"@ethersproject/signing-key":94,"@ethersproject/solidity":95,"@ethersproject/strings":99,"@ethersproject/transactions":102,"@ethersproject/units":104,"@ethersproject/wallet":106,"@ethersproject/web":109}],194:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) +var objectCreate = Object.create || objectCreatePolyfill +var objectKeys = Object.keys || objectKeysPolyfill +var bind = Function.prototype.bind || functionBindPolyfill - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul +function EventEmitter() { + if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { + this._events = objectCreate(null); + this._eventsCount = 0; } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - return val + this._maxListeners = this._maxListeners || undefined; } +module.exports = EventEmitter; -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +var hasDefineProperty; +try { + var o = {}; + if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); + hasDefineProperty = o.x === 0; +} catch (err) { hasDefineProperty = false } +if (hasDefineProperty) { + Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + // check whether the input is a positive number (whose value is zero or + // greater and not a NaN). + if (typeof arg !== 'number' || arg < 0 || arg !== arg) + throw new TypeError('"defaultMaxListeners" must be a positive number'); + defaultMaxListeners = arg; + } + }); +} else { + EventEmitter.defaultMaxListeners = defaultMaxListeners; } -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || isNaN(n)) + throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; +}; - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) +function $getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; } -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); +}; - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) +// These standalone emit* functions are used to optimize calling of event +// handlers for fast cases because emit() itself often has a variable number of +// arguments and can be deoptimized because of that. These functions always have +// the same number of arguments and thus do not get deoptimized, so the code +// inside them can execute faster. +function emitNone(handler, isFn, self) { + if (isFn) + handler.call(self); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self); + } } - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) +function emitOne(handler, isFn, self, arg1) { + if (isFn) + handler.call(self, arg1); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1); + } } - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) +function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) + handler.call(self, arg1, arg2); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2); + } } - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) +function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) + handler.call(self, arg1, arg2, arg3); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2, arg3); + } } -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) +function emitMany(handler, isFn, self, args) { + if (isFn) + handler.apply(self, args); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].apply(self, args); + } } -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} +EventEmitter.prototype.emit = function emit(type) { + var er, handler, len, args, i, events; + var doError = (type === 'error'); -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } + events = this._events; + if (events) + doError = (doError && events.error == null); + else if (!doError) + return false; - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF + // If there is no 'error' event listener then throw. + if (doError) { + if (arguments.length > 1) + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Unhandled "error" event. (' + er + ')'); + err.context = er; + throw err; + } + return false; } - return offset + byteLength -} + handler = events[type]; -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } + if (!handler) + return false; - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF + var isFn = typeof handler === 'function'; + len = arguments.length; + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + case 4: + emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); + break; + // slower + default: + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + emitMany(handler, isFn, this, args); } - return offset + byteLength -} + return true; +}; -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - this[offset] = (value & 0xff) - return offset + 1 -} +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - return offset + 2 -} + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - return offset + 2 -} + events = target._events; + if (!events) { + events = target._events = objectCreate(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = (value & 0xff) - return offset + 4 + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + } + + // Check for listener leak + if (!existing.warned) { + m = $getMaxListeners(target); + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' "' + String(type) + '" listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit.'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + if (typeof console === 'object' && console.warn) { + console.warn('%s: %s', w.name, w.message); + } + } + } + } + + return target; } -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - return offset + 4 -} +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - var limit = Math.pow(2, (8 * byteLength) - 1) +EventEmitter.prototype.on = EventEmitter.prototype.addListener; - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; - var i = 0 - var mul = 1 - var sub = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1 +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + switch (arguments.length) { + case 0: + return this.listener.call(this.target); + case 1: + return this.listener.call(this.target, arguments[0]); + case 2: + return this.listener.call(this.target, arguments[0], arguments[1]); + case 3: + return this.listener.call(this.target, arguments[0], arguments[1], + arguments[2]); + default: + var args = new Array(arguments.length); + for (var i = 0; i < args.length; ++i) + args[i] = arguments[i]; + this.listener.apply(this.target, args); } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } +} - return offset + byteLength +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = bind.call(onceWrapper, state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; } -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - var limit = Math.pow(2, (8 * byteLength) - 1) +EventEmitter.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; - var i = byteLength - 1 - var mul = 1 - var sub = 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1 - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; - return offset + byteLength -} + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (value < 0) value = 0xff + value + 1 - this[offset] = (value & 0xff) - return offset + 1 -} + events = this._events; + if (!events) + return this; -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - return offset + 2 -} + list = events[type]; + if (!list) + return this; -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - return offset + 2 -} + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = objectCreate(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - return offset + 4 -} + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - return offset + 4 -} + if (position < 0) + return this; -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} + if (position === 0) + list.shift(); + else + spliceOne(list, position); -function writeFloat (buf, value, offset, littleEndian, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} + if (list.length === 1) + events[type] = list[0]; -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} + if (events.removeListener) + this.emit('removeListener', type, originalListener || listener); + } -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} + return this; + }; -function writeDouble (buf, value, offset, littleEndian, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} + events = this._events; + if (!events) + return this; -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} + // not listening for removeListener, no need to emit + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = objectCreate(null); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) + this._events = objectCreate(null); + else + delete events[type]; + } + return this; + } -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (targetStart >= target.length) targetStart = target.length - if (!targetStart) targetStart = 0 - if (end > 0 && end < start) end = start + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = objectKeys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = objectCreate(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('Index out of range') - if (end < 0) throw new RangeError('sourceEnd out of bounds') + return this; + }; - // Are we oob? - if (end > this.length) end = this.length - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start - } +function _listeners(target, type, unwrap) { + var events = target._events; - var len = end - start + if (!events) + return []; - if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { - // Use built-in when available, missing from IE11 - this.copyWithin(targetStart, start, end) - } else if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (var i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start] - } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, end), - targetStart - ) - } + var evlistener = events[type]; + if (!evlistener) + return []; - return len + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); } -// Usage: -// buffer.fill(number[, offset[, end]]) -// buffer.fill(buffer[, offset[, end]]) -// buffer.fill(string[, offset[, end]][, encoding]) -Buffer.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start - start = 0 - end = this.length - } else if (typeof end === 'string') { - encoding = end - end = this.length - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - if (val.length === 1) { - var code = val.charCodeAt(0) - if ((encoding === 'utf8' && code < 128) || - encoding === 'latin1') { - // Fast path: If `val` fits into a single byte, use that numeric value. - val = code - } - } - } else if (typeof val === 'number') { - val = val & 255 - } +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; - if (end <= start) { - return this +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); } +}; - start = start >>> 0 - end = end === undefined ? this.length : end >>> 0 +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; - if (!val) val = 0 + if (events) { + var evlistener = events[type]; - var i - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val - } - } else { - var bytes = Buffer.isBuffer(val) - ? val - : Buffer.from(val, encoding) - var len = bytes.length - if (len === 0) { - throw new TypeError('The value "' + val + - '" is invalid for argument "value"') - } - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len] + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener) { + return evlistener.length; } } - return this + return 0; } -// HELPER FUNCTIONS -// ================ - -var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; +}; -function base64clean (str) { - // Node takes equal signs as end of the Base64 encoding - str = str.split('=')[0] - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = str.trim().replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' - } - return str +// About 1.5x faster than the two-arg version of Array#splice(). +function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) + list[i] = list[k]; + list.pop(); } -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; } -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] - - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i) - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } - - // valid lead - leadSurrogate = codePoint - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } - - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - } - - leadSurrogate = null - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; } - - return bytes + return ret; } -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) +function objectCreatePolyfill(proto) { + var F = function() {}; + F.prototype = proto; + return new F; +} +function objectKeysPolyfill(obj) { + var keys = []; + for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { + keys.push(k); } - return byteArray + return k; +} +function functionBindPolyfill(context) { + var fn = this; + return function () { + return fn.apply(context, arguments); + }; } -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break +},{}],195:[function(require,module,exports){ +var hash = exports; - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } +hash.utils = require('./hash/utils'); +hash.common = require('./hash/common'); +hash.sha = require('./hash/sha'); +hash.ripemd = require('./hash/ripemd'); +hash.hmac = require('./hash/hmac'); - return byteArray -} +// Proxy hash functions to the main object +hash.sha1 = hash.sha.sha1; +hash.sha256 = hash.sha.sha256; +hash.sha224 = hash.sha.sha224; +hash.sha384 = hash.sha.sha384; +hash.sha512 = hash.sha.sha512; +hash.ripemd160 = hash.ripemd.ripemd160; -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} +},{"./hash/common":196,"./hash/hmac":197,"./hash/ripemd":198,"./hash/sha":199,"./hash/utils":206}],196:[function(require,module,exports){ +'use strict'; -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] - } - return i -} +var utils = require('./utils'); +var assert = require('minimalistic-assert'); -// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass -// the `instanceof` check but they should be treated as of that type. -// See: https://github.com/feross/buffer/issues/166 -function isInstance (obj, type) { - return obj instanceof type || - (obj != null && obj.constructor != null && obj.constructor.name != null && - obj.constructor.name === type.name) -} -function numberIsNaN (obj) { - // For IE11 support - return obj !== obj // eslint-disable-line no-self-compare +function BlockHash() { + this.pending = null; + this.pendingTotal = 0; + this.blockSize = this.constructor.blockSize; + this.outSize = this.constructor.outSize; + this.hmacStrength = this.constructor.hmacStrength; + this.padLength = this.constructor.padLength / 8; + this.endian = 'big'; + + this._delta8 = this.blockSize / 8; + this._delta32 = this.blockSize / 32; } +exports.BlockHash = BlockHash; + +BlockHash.prototype.update = function update(msg, enc) { + // Convert message to array, pad it, and join into 32bit blocks + msg = utils.toArray(msg, enc); + if (!this.pending) + this.pending = msg; + else + this.pending = this.pending.concat(msg); + this.pendingTotal += msg.length; + + // Enough data, try updating + if (this.pending.length >= this._delta8) { + msg = this.pending; + + // Process pending data in blocks + var r = msg.length % this._delta8; + this.pending = msg.slice(msg.length - r, msg.length); + if (this.pending.length === 0) + this.pending = null; + + msg = utils.join32(msg, 0, msg.length - r, this.endian); + for (var i = 0; i < msg.length; i += this._delta32) + this._update(msg, i, i + this._delta32); + } -}).call(this,require("buffer").Buffer) -},{"base64-js":16,"buffer":20,"ieee754":22}],21:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. + return this; +}; -var objectCreate = Object.create || objectCreatePolyfill -var objectKeys = Object.keys || objectKeysPolyfill -var bind = Function.prototype.bind || functionBindPolyfill +BlockHash.prototype.digest = function digest(enc) { + this.update(this._pad()); + assert(this.pending === null); -function EventEmitter() { - if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { - this._events = objectCreate(null); - this._eventsCount = 0; + return this._digest(enc); +}; + +BlockHash.prototype._pad = function pad() { + var len = this.pendingTotal; + var bytes = this._delta8; + var k = bytes - ((len + this.padLength) % bytes); + var res = new Array(k + this.padLength); + res[0] = 0x80; + for (var i = 1; i < k; i++) + res[i] = 0; + + // Append length + len <<= 3; + if (this.endian === 'big') { + for (var t = 8; t < this.padLength; t++) + res[i++] = 0; + + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = (len >>> 24) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = len & 0xff; + } else { + res[i++] = len & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 24) & 0xff; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + + for (t = 8; t < this.padLength; t++) + res[i++] = 0; } - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; + return res; +}; -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; +},{"./utils":206,"minimalistic-assert":211}],197:[function(require,module,exports){ +'use strict'; -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; +var utils = require('./utils'); +var assert = require('minimalistic-assert'); -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; +function Hmac(hash, key, enc) { + if (!(this instanceof Hmac)) + return new Hmac(hash, key, enc); + this.Hash = hash; + this.blockSize = hash.blockSize / 8; + this.outSize = hash.outSize / 8; + this.inner = null; + this.outer = null; -var hasDefineProperty; -try { - var o = {}; - if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); - hasDefineProperty = o.x === 0; -} catch (err) { hasDefineProperty = false } -if (hasDefineProperty) { - Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - // check whether the input is a positive number (whose value is zero or - // greater and not a NaN). - if (typeof arg !== 'number' || arg < 0 || arg !== arg) - throw new TypeError('"defaultMaxListeners" must be a positive number'); - defaultMaxListeners = arg; - } - }); -} else { - EventEmitter.defaultMaxListeners = defaultMaxListeners; + this._init(utils.toArray(key, enc)); } +module.exports = Hmac; + +Hmac.prototype._init = function init(key) { + // Shorten key, if needed + if (key.length > this.blockSize) + key = new this.Hash().update(key).digest(); + assert(key.length <= this.blockSize); + + // Add padding to key + for (var i = key.length; i < this.blockSize; i++) + key.push(0); + + for (i = 0; i < key.length; i++) + key[i] ^= 0x36; + this.inner = new this.Hash().update(key); + + // 0x36 ^ 0x5c = 0x6a + for (i = 0; i < key.length; i++) + key[i] ^= 0x6a; + this.outer = new this.Hash().update(key); +}; -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || isNaN(n)) - throw new TypeError('"n" argument must be a positive number'); - this._maxListeners = n; +Hmac.prototype.update = function update(msg, enc) { + this.inner.update(msg, enc); return this; }; -function $getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; +Hmac.prototype.digest = function digest(enc) { + this.outer.update(this.inner.digest()); + return this.outer.digest(enc); +}; + +},{"./utils":206,"minimalistic-assert":211}],198:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var common = require('./common'); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_3 = utils.sum32_3; +var sum32_4 = utils.sum32_4; +var BlockHash = common.BlockHash; + +function RIPEMD160() { + if (!(this instanceof RIPEMD160)) + return new RIPEMD160(); + + BlockHash.call(this); + + this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; + this.endian = 'little'; } +utils.inherits(RIPEMD160, BlockHash); +exports.ripemd160 = RIPEMD160; + +RIPEMD160.blockSize = 512; +RIPEMD160.outSize = 160; +RIPEMD160.hmacStrength = 192; +RIPEMD160.padLength = 64; + +RIPEMD160.prototype._update = function update(msg, start) { + var A = this.h[0]; + var B = this.h[1]; + var C = this.h[2]; + var D = this.h[3]; + var E = this.h[4]; + var Ah = A; + var Bh = B; + var Ch = C; + var Dh = D; + var Eh = E; + for (var j = 0; j < 80; j++) { + var T = sum32( + rotl32( + sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), + s[j]), + E); + A = E; + E = D; + D = rotl32(C, 10); + C = B; + B = T; + T = sum32( + rotl32( + sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), + sh[j]), + Eh); + Ah = Eh; + Eh = Dh; + Dh = rotl32(Ch, 10); + Ch = Bh; + Bh = T; + } + T = sum32_3(this.h[1], C, Dh); + this.h[1] = sum32_3(this.h[2], D, Eh); + this.h[2] = sum32_3(this.h[3], E, Ah); + this.h[3] = sum32_3(this.h[4], A, Bh); + this.h[4] = sum32_3(this.h[0], B, Ch); + this.h[0] = T; +}; -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return $getMaxListeners(this); +RIPEMD160.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'little'); + else + return utils.split32(this.h, 'little'); }; -// These standalone emit* functions are used to optimize calling of event -// handlers for fast cases because emit() itself often has a variable number of -// arguments and can be deoptimized because of that. These functions always have -// the same number of arguments and thus do not get deoptimized, so the code -// inside them can execute faster. -function emitNone(handler, isFn, self) { - if (isFn) - handler.call(self); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self); - } +function f(j, x, y, z) { + if (j <= 15) + return x ^ y ^ z; + else if (j <= 31) + return (x & y) | ((~x) & z); + else if (j <= 47) + return (x | (~y)) ^ z; + else if (j <= 63) + return (x & z) | (y & (~z)); + else + return x ^ (y | (~z)); } -function emitOne(handler, isFn, self, arg1) { - if (isFn) - handler.call(self, arg1); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1); - } + +function K(j) { + if (j <= 15) + return 0x00000000; + else if (j <= 31) + return 0x5a827999; + else if (j <= 47) + return 0x6ed9eba1; + else if (j <= 63) + return 0x8f1bbcdc; + else + return 0xa953fd4e; } -function emitTwo(handler, isFn, self, arg1, arg2) { - if (isFn) - handler.call(self, arg1, arg2); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2); - } + +function Kh(j) { + if (j <= 15) + return 0x50a28be6; + else if (j <= 31) + return 0x5c4dd124; + else if (j <= 47) + return 0x6d703ef3; + else if (j <= 63) + return 0x7a6d76e9; + else + return 0x00000000; } -function emitThree(handler, isFn, self, arg1, arg2, arg3) { - if (isFn) - handler.call(self, arg1, arg2, arg3); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2, arg3); - } + +var r = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +]; + +var rh = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +]; + +var s = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +]; + +var sh = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +]; + +},{"./common":196,"./utils":206}],199:[function(require,module,exports){ +'use strict'; + +exports.sha1 = require('./sha/1'); +exports.sha224 = require('./sha/224'); +exports.sha256 = require('./sha/256'); +exports.sha384 = require('./sha/384'); +exports.sha512 = require('./sha/512'); + +},{"./sha/1":200,"./sha/224":201,"./sha/256":202,"./sha/384":203,"./sha/512":204}],200:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var common = require('../common'); +var shaCommon = require('./common'); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_5 = utils.sum32_5; +var ft_1 = shaCommon.ft_1; +var BlockHash = common.BlockHash; + +var sha1_K = [ + 0x5A827999, 0x6ED9EBA1, + 0x8F1BBCDC, 0xCA62C1D6 +]; + +function SHA1() { + if (!(this instanceof SHA1)) + return new SHA1(); + + BlockHash.call(this); + this.h = [ + 0x67452301, 0xefcdab89, 0x98badcfe, + 0x10325476, 0xc3d2e1f0 ]; + this.W = new Array(80); } -function emitMany(handler, isFn, self, args) { - if (isFn) - handler.apply(self, args); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].apply(self, args); +utils.inherits(SHA1, BlockHash); +module.exports = SHA1; + +SHA1.blockSize = 512; +SHA1.outSize = 160; +SHA1.hmacStrength = 80; +SHA1.padLength = 64; + +SHA1.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + + for(; i < W.length; i++) + W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + + for (i = 0; i < W.length; i++) { + var s = ~~(i / 20); + var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); + e = d; + d = c; + c = rotl32(b, 30); + b = a; + a = t; } -} -EventEmitter.prototype.emit = function emit(type) { - var er, handler, len, args, i, events; - var doError = (type === 'error'); + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); +}; - events = this._events; - if (events) - doError = (doError && events.error == null); - else if (!doError) - return false; +SHA1.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; - // If there is no 'error' event listener then throw. - if (doError) { - if (arguments.length > 1) - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Unhandled "error" event. (' + er + ')'); - err.context = er; - throw err; - } - return false; - } +},{"../common":196,"../utils":206,"./common":205}],201:[function(require,module,exports){ +'use strict'; - handler = events[type]; +var utils = require('../utils'); +var SHA256 = require('./256'); - if (!handler) - return false; +function SHA224() { + if (!(this instanceof SHA224)) + return new SHA224(); - var isFn = typeof handler === 'function'; - len = arguments.length; - switch (len) { - // fast cases - case 1: - emitNone(handler, isFn, this); - break; - case 2: - emitOne(handler, isFn, this, arguments[1]); - break; - case 3: - emitTwo(handler, isFn, this, arguments[1], arguments[2]); - break; - case 4: - emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); - break; - // slower - default: - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - emitMany(handler, isFn, this, args); + SHA256.call(this); + this.h = [ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]; +} +utils.inherits(SHA224, SHA256); +module.exports = SHA224; + +SHA224.blockSize = 512; +SHA224.outSize = 224; +SHA224.hmacStrength = 192; +SHA224.padLength = 64; + +SHA224.prototype._digest = function digest(enc) { + // Just truncate output + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 7), 'big'); + else + return utils.split32(this.h.slice(0, 7), 'big'); +}; + + +},{"../utils":206,"./256":202}],202:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var common = require('../common'); +var shaCommon = require('./common'); +var assert = require('minimalistic-assert'); + +var sum32 = utils.sum32; +var sum32_4 = utils.sum32_4; +var sum32_5 = utils.sum32_5; +var ch32 = shaCommon.ch32; +var maj32 = shaCommon.maj32; +var s0_256 = shaCommon.s0_256; +var s1_256 = shaCommon.s1_256; +var g0_256 = shaCommon.g0_256; +var g1_256 = shaCommon.g1_256; + +var BlockHash = common.BlockHash; + +var sha256_K = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +]; + +function SHA256() { + if (!(this instanceof SHA256)) + return new SHA256(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + ]; + this.k = sha256_K; + this.W = new Array(64); +} +utils.inherits(SHA256, BlockHash); +module.exports = SHA256; + +SHA256.blockSize = 512; +SHA256.outSize = 256; +SHA256.hmacStrength = 192; +SHA256.padLength = 64; + +SHA256.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + for (; i < W.length; i++) + W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + var f = this.h[5]; + var g = this.h[6]; + var h = this.h[7]; + + assert(this.k.length === W.length); + for (i = 0; i < W.length; i++) { + var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); + var T2 = sum32(s0_256(a), maj32(a, b, c)); + h = g; + g = f; + f = e; + e = sum32(d, T1); + d = c; + c = b; + b = a; + a = sum32(T1, T2); } - return true; + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); + this.h[5] = sum32(this.h[5], f); + this.h[6] = sum32(this.h[6], g); + this.h[7] = sum32(this.h[7], h); +}; + +SHA256.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); }; -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; +},{"../common":196,"../utils":206,"./common":205,"minimalistic-assert":211}],203:[function(require,module,exports){ +'use strict'; - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); +var utils = require('../utils'); - events = target._events; - if (!events) { - events = target._events = objectCreate(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); +var SHA512 = require('./512'); - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } +function SHA384() { + if (!(this instanceof SHA384)) + return new SHA384(); - if (!existing) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - } else { - // If we've already got an array, just append. - if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - } + SHA512.call(this); + this.h = [ + 0xcbbb9d5d, 0xc1059ed8, + 0x629a292a, 0x367cd507, + 0x9159015a, 0x3070dd17, + 0x152fecd8, 0xf70e5939, + 0x67332667, 0xffc00b31, + 0x8eb44a87, 0x68581511, + 0xdb0c2e0d, 0x64f98fa7, + 0x47b5481d, 0xbefa4fa4 ]; +} +utils.inherits(SHA384, SHA512); +module.exports = SHA384; + +SHA384.blockSize = 1024; +SHA384.outSize = 384; +SHA384.hmacStrength = 192; +SHA384.padLength = 128; + +SHA384.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 12), 'big'); + else + return utils.split32(this.h.slice(0, 12), 'big'); +}; - // Check for listener leak - if (!existing.warned) { - m = $getMaxListeners(target); - if (m && m > 0 && existing.length > m) { - existing.warned = true; - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' "' + String(type) + '" listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit.'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - if (typeof console === 'object' && console.warn) { - console.warn('%s: %s', w.name, w.message); - } - } - } - } +},{"../utils":206,"./512":204}],204:[function(require,module,exports){ +'use strict'; - return target; +var utils = require('../utils'); +var common = require('../common'); +var assert = require('minimalistic-assert'); + +var rotr64_hi = utils.rotr64_hi; +var rotr64_lo = utils.rotr64_lo; +var shr64_hi = utils.shr64_hi; +var shr64_lo = utils.shr64_lo; +var sum64 = utils.sum64; +var sum64_hi = utils.sum64_hi; +var sum64_lo = utils.sum64_lo; +var sum64_4_hi = utils.sum64_4_hi; +var sum64_4_lo = utils.sum64_4_lo; +var sum64_5_hi = utils.sum64_5_hi; +var sum64_5_lo = utils.sum64_5_lo; + +var BlockHash = common.BlockHash; + +var sha512_K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +]; + +function SHA512() { + if (!(this instanceof SHA512)) + return new SHA512(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xf3bcc908, + 0xbb67ae85, 0x84caa73b, + 0x3c6ef372, 0xfe94f82b, + 0xa54ff53a, 0x5f1d36f1, + 0x510e527f, 0xade682d1, + 0x9b05688c, 0x2b3e6c1f, + 0x1f83d9ab, 0xfb41bd6b, + 0x5be0cd19, 0x137e2179 ]; + this.k = sha512_K; + this.W = new Array(160); } +utils.inherits(SHA512, BlockHash); +module.exports = SHA512; + +SHA512.blockSize = 1024; +SHA512.outSize = 512; +SHA512.hmacStrength = 192; +SHA512.padLength = 128; + +SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { + var W = this.W; + + // 32 x 32bit words + for (var i = 0; i < 32; i++) + W[i] = msg[start + i]; + for (; i < W.length; i += 2) { + var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2 + var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); + var c1_hi = W[i - 14]; // i - 7 + var c1_lo = W[i - 13]; + var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15 + var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); + var c3_hi = W[i - 32]; // i - 16 + var c3_lo = W[i - 31]; + + W[i] = sum64_4_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + W[i + 1] = sum64_4_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + } +}; -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); +SHA512.prototype._update = function _update(msg, start) { + this._prepareBlock(msg, start); + + var W = this.W; + + var ah = this.h[0]; + var al = this.h[1]; + var bh = this.h[2]; + var bl = this.h[3]; + var ch = this.h[4]; + var cl = this.h[5]; + var dh = this.h[6]; + var dl = this.h[7]; + var eh = this.h[8]; + var el = this.h[9]; + var fh = this.h[10]; + var fl = this.h[11]; + var gh = this.h[12]; + var gl = this.h[13]; + var hh = this.h[14]; + var hl = this.h[15]; + + assert(this.k.length === W.length); + for (var i = 0; i < W.length; i += 2) { + var c0_hi = hh; + var c0_lo = hl; + var c1_hi = s1_512_hi(eh, el); + var c1_lo = s1_512_lo(eh, el); + var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); + var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); + var c3_hi = this.k[i]; + var c3_lo = this.k[i + 1]; + var c4_hi = W[i]; + var c4_lo = W[i + 1]; + + var T1_hi = sum64_5_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + var T1_lo = sum64_5_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + + c0_hi = s0_512_hi(ah, al); + c0_lo = s0_512_lo(ah, al); + c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); + c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); + + var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); + var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); + + hh = gh; + hl = gl; + + gh = fh; + gl = fl; + + fh = eh; + fl = el; + + eh = sum64_hi(dh, dl, T1_hi, T1_lo); + el = sum64_lo(dl, dl, T1_hi, T1_lo); + + dh = ch; + dl = cl; + + ch = bh; + cl = bl; + + bh = ah; + bl = al; + + ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); + al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); + } + + sum64(this.h, 0, ah, al); + sum64(this.h, 2, bh, bl); + sum64(this.h, 4, ch, cl); + sum64(this.h, 6, dh, dl); + sum64(this.h, 8, eh, el); + sum64(this.h, 10, fh, fl); + sum64(this.h, 12, gh, gl); + sum64(this.h, 14, hh, hl); }; -EventEmitter.prototype.on = EventEmitter.prototype.addListener; +SHA512.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; +function ch64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ ((~xh) & zh); + if (r < 0) + r += 0x100000000; + return r; +} -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - switch (arguments.length) { - case 0: - return this.listener.call(this.target); - case 1: - return this.listener.call(this.target, arguments[0]); - case 2: - return this.listener.call(this.target, arguments[0], arguments[1]); - case 3: - return this.listener.call(this.target, arguments[0], arguments[1], - arguments[2]); - default: - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) - args[i] = arguments[i]; - this.listener.apply(this.target, args); - } - } +function ch64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ ((~xl) & zl); + if (r < 0) + r += 0x100000000; + return r; } -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = bind.call(onceWrapper, state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; +function maj64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); + if (r < 0) + r += 0x100000000; + return r; } -EventEmitter.prototype.once = function once(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; +function maj64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); + if (r < 0) + r += 0x100000000; + return r; +} -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; +function s0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 28); + var c1_hi = rotr64_hi(xl, xh, 2); // 34 + var c2_hi = rotr64_hi(xl, xh, 7); // 39 -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); +function s0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 28); + var c1_lo = rotr64_lo(xl, xh, 2); // 34 + var c2_lo = rotr64_lo(xl, xh, 7); // 39 - events = this._events; - if (!events) - return this; + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} - list = events[type]; - if (!list) - return this; +function s1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 14); + var c1_hi = rotr64_hi(xh, xl, 18); + var c2_hi = rotr64_hi(xl, xh, 9); // 41 - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = objectCreate(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } +function s1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 14); + var c1_lo = rotr64_lo(xh, xl, 18); + var c2_lo = rotr64_lo(xl, xh, 9); // 41 - if (position < 0) - return this; + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} - if (position === 0) - list.shift(); - else - spliceOne(list, position); +function g0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 1); + var c1_hi = rotr64_hi(xh, xl, 8); + var c2_hi = shr64_hi(xh, xl, 7); - if (list.length === 1) - events[type] = list[0]; + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} - if (events.removeListener) - this.emit('removeListener', type, originalListener || listener); - } +function g0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 1); + var c1_lo = rotr64_lo(xh, xl, 8); + var c2_lo = shr64_lo(xh, xl, 7); - return this; - }; + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; +function g1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 19); + var c1_hi = rotr64_hi(xl, xh, 29); // 61 + var c2_hi = shr64_hi(xh, xl, 6); - events = this._events; - if (!events) - return this; + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} - // not listening for removeListener, no need to emit - if (!events.removeListener) { - if (arguments.length === 0) { - this._events = objectCreate(null); - this._eventsCount = 0; - } else if (events[type]) { - if (--this._eventsCount === 0) - this._events = objectCreate(null); - else - delete events[type]; +function g1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 19); + var c1_lo = rotr64_lo(xl, xh, 29); // 61 + var c2_lo = shr64_lo(xh, xl, 6); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +},{"../common":196,"../utils":206,"minimalistic-assert":211}],205:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var rotr32 = utils.rotr32; + +function ft_1(s, x, y, z) { + if (s === 0) + return ch32(x, y, z); + if (s === 1 || s === 3) + return p32(x, y, z); + if (s === 2) + return maj32(x, y, z); +} +exports.ft_1 = ft_1; + +function ch32(x, y, z) { + return (x & y) ^ ((~x) & z); +} +exports.ch32 = ch32; + +function maj32(x, y, z) { + return (x & y) ^ (x & z) ^ (y & z); +} +exports.maj32 = maj32; + +function p32(x, y, z) { + return x ^ y ^ z; +} +exports.p32 = p32; + +function s0_256(x) { + return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); +} +exports.s0_256 = s0_256; + +function s1_256(x) { + return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); +} +exports.s1_256 = s1_256; + +function g0_256(x) { + return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); +} +exports.g0_256 = g0_256; + +function g1_256(x) { + return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); +} +exports.g1_256 = g1_256; + +},{"../utils":206}],206:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +exports.inherits = inherits; + +function isSurrogatePair(msg, i) { + if ((msg.charCodeAt(i) & 0xFC00) !== 0xD800) { + return false; + } + if (i < 0 || i + 1 >= msg.length) { + return false; + } + return (msg.charCodeAt(i + 1) & 0xFC00) === 0xDC00; +} + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg === 'string') { + if (!enc) { + // Inspired by stringToUtf8ByteArray() in closure-library by Google + // https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js#L117-L143 + // Apache License 2.0 + // https://github.com/google/closure-library/blob/master/LICENSE + var p = 0; + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + if (c < 128) { + res[p++] = c; + } else if (c < 2048) { + res[p++] = (c >> 6) | 192; + res[p++] = (c & 63) | 128; + } else if (isSurrogatePair(msg, i)) { + c = 0x10000 + ((c & 0x03FF) << 10) + (msg.charCodeAt(++i) & 0x03FF); + res[p++] = (c >> 18) | 240; + res[p++] = ((c >> 12) & 63) | 128; + res[p++] = ((c >> 6) & 63) | 128; + res[p++] = (c & 63) | 128; + } else { + res[p++] = (c >> 12) | 224; + res[p++] = ((c >> 6) & 63) | 128; + res[p++] = (c & 63) | 128; } - return this; } + } else if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } + } else { + for (i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + } + return res; +} +exports.toArray = toArray; + +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +exports.toHex = toHex; + +function htonl(w) { + var res = (w >>> 24) | + ((w >>> 8) & 0xff00) | + ((w << 8) & 0xff0000) | + ((w & 0xff) << 24); + return res >>> 0; +} +exports.htonl = htonl; + +function toHex32(msg, endian) { + var res = ''; + for (var i = 0; i < msg.length; i++) { + var w = msg[i]; + if (endian === 'little') + w = htonl(w); + res += zero8(w.toString(16)); + } + return res; +} +exports.toHex32 = toHex32; + +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +exports.zero2 = zero2; + +function zero8(word) { + if (word.length === 7) + return '0' + word; + else if (word.length === 6) + return '00' + word; + else if (word.length === 5) + return '000' + word; + else if (word.length === 4) + return '0000' + word; + else if (word.length === 3) + return '00000' + word; + else if (word.length === 2) + return '000000' + word; + else if (word.length === 1) + return '0000000' + word; + else + return word; +} +exports.zero8 = zero8; + +function join32(msg, start, end, endian) { + var len = end - start; + assert(len % 4 === 0); + var res = new Array(len / 4); + for (var i = 0, k = start; i < res.length; i++, k += 4) { + var w; + if (endian === 'big') + w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; + else + w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; + res[i] = w >>> 0; + } + return res; +} +exports.join32 = join32; + +function split32(msg, endian) { + var res = new Array(msg.length * 4); + for (var i = 0, k = 0; i < msg.length; i++, k += 4) { + var m = msg[i]; + if (endian === 'big') { + res[k] = m >>> 24; + res[k + 1] = (m >>> 16) & 0xff; + res[k + 2] = (m >>> 8) & 0xff; + res[k + 3] = m & 0xff; + } else { + res[k + 3] = m >>> 24; + res[k + 2] = (m >>> 16) & 0xff; + res[k + 1] = (m >>> 8) & 0xff; + res[k] = m & 0xff; + } + } + return res; +} +exports.split32 = split32; + +function rotr32(w, b) { + return (w >>> b) | (w << (32 - b)); +} +exports.rotr32 = rotr32; + +function rotl32(w, b) { + return (w << b) | (w >>> (32 - b)); +} +exports.rotl32 = rotl32; + +function sum32(a, b) { + return (a + b) >>> 0; +} +exports.sum32 = sum32; + +function sum32_3(a, b, c) { + return (a + b + c) >>> 0; +} +exports.sum32_3 = sum32_3; + +function sum32_4(a, b, c, d) { + return (a + b + c + d) >>> 0; +} +exports.sum32_4 = sum32_4; + +function sum32_5(a, b, c, d, e) { + return (a + b + c + d + e) >>> 0; +} +exports.sum32_5 = sum32_5; + +function sum64(buf, pos, ah, al) { + var bh = buf[pos]; + var bl = buf[pos + 1]; + + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + buf[pos] = hi >>> 0; + buf[pos + 1] = lo; +} +exports.sum64 = sum64; + +function sum64_hi(ah, al, bh, bl) { + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + return hi >>> 0; +} +exports.sum64_hi = sum64_hi; - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = objectKeys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = objectCreate(null); - this._eventsCount = 0; - return this; - } +function sum64_lo(ah, al, bh, bl) { + var lo = al + bl; + return lo >>> 0; +} +exports.sum64_lo = sum64_lo; + +function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + + var hi = ah + bh + ch + dh + carry; + return hi >>> 0; +} +exports.sum64_4_hi = sum64_4_hi; - listeners = events[type]; +function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { + var lo = al + bl + cl + dl; + return lo >>> 0; +} +exports.sum64_4_lo = sum64_4_lo; + +function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + lo = (lo + el) >>> 0; + carry += lo < el ? 1 : 0; + + var hi = ah + bh + ch + dh + eh + carry; + return hi >>> 0; +} +exports.sum64_5_hi = sum64_5_hi; - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } +function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var lo = al + bl + cl + dl + el; - return this; - }; + return lo >>> 0; +} +exports.sum64_5_lo = sum64_5_lo; -function _listeners(target, type, unwrap) { - var events = target._events; +function rotr64_hi(ah, al, num) { + var r = (al << (32 - num)) | (ah >>> num); + return r >>> 0; +} +exports.rotr64_hi = rotr64_hi; - if (!events) - return []; +function rotr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.rotr64_lo = rotr64_lo; - var evlistener = events[type]; - if (!evlistener) - return []; +function shr64_hi(ah, al, num) { + return ah >>> num; +} +exports.shr64_hi = shr64_hi; - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; +function shr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.shr64_lo = shr64_lo; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +},{"inherits":209,"minimalistic-assert":211}],207:[function(require,module,exports){ +'use strict'; + +var hash = require('hash.js'); +var utils = require('minimalistic-crypto-utils'); +var assert = require('minimalistic-assert'); + +function HmacDRBG(options) { + if (!(this instanceof HmacDRBG)) + return new HmacDRBG(options); + this.hash = options.hash; + this.predResist = !!options.predResist; + + this.outLen = this.hash.outSize; + this.minEntropy = options.minEntropy || this.hash.hmacStrength; + + this._reseed = null; + this.reseedInterval = null; + this.K = null; + this.V = null; + + var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex'); + var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex'); + var pers = utils.toArray(options.pers, options.persEnc || 'hex'); + assert(entropy.length >= (this.minEntropy / 8), + 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); + this._init(entropy, nonce, pers); } +module.exports = HmacDRBG; -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; +HmacDRBG.prototype._init = function init(entropy, nonce, pers) { + var seed = entropy.concat(nonce).concat(pers); -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); + this.K = new Array(this.outLen / 8); + this.V = new Array(this.outLen / 8); + for (var i = 0; i < this.V.length; i++) { + this.K[i] = 0x00; + this.V[i] = 0x01; + } + + this._update(seed); + this._reseed = 1; + this.reseedInterval = 0x1000000000000; // 2^48 }; -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } +HmacDRBG.prototype._hmac = function hmac() { + return new hash.hmac(this.hash, this.K); }; -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; +HmacDRBG.prototype._update = function update(seed) { + var kmac = this._hmac() + .update(this.V) + .update([ 0x00 ]); + if (seed) + kmac = kmac.update(seed); + this.K = kmac.digest(); + this.V = this._hmac().update(this.V).digest(); + if (!seed) + return; - if (events) { - var evlistener = events[type]; + this.K = this._hmac() + .update(this.V) + .update([ 0x01 ]) + .update(seed) + .digest(); + this.V = this._hmac().update(this.V).digest(); +}; - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener) { - return evlistener.length; - } +HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { + // Optional entropy enc + if (typeof entropyEnc !== 'string') { + addEnc = add; + add = entropyEnc; + entropyEnc = null; } - return 0; -} + entropy = utils.toArray(entropy, entropyEnc); + add = utils.toArray(add, addEnc); -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; + assert(entropy.length >= (this.minEntropy / 8), + 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); + + this._update(entropy.concat(add || [])); + this._reseed = 1; }; -// About 1.5x faster than the two-arg version of Array#splice(). -function spliceOne(list, index) { - for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) - list[i] = list[k]; - list.pop(); -} +HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { + if (this._reseed > this.reseedInterval) + throw new Error('Reseed is required'); -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} + // Optional encoding + if (typeof enc !== 'string') { + addEnc = add; + add = enc; + enc = null; + } -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; + // Optional additional data + if (add) { + add = utils.toArray(add, addEnc || 'hex'); + this._update(add); } - return ret; -} -function objectCreatePolyfill(proto) { - var F = function() {}; - F.prototype = proto; - return new F; -} -function objectKeysPolyfill(obj) { - var keys = []; - for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { - keys.push(k); + var temp = []; + while (temp.length < len) { + this.V = this._hmac().update(this.V).digest(); + temp = temp.concat(this.V); } - return k; -} -function functionBindPolyfill(context) { - var fn = this; - return function () { - return fn.apply(context, arguments); - }; -} -},{}],22:[function(require,module,exports){ + var res = temp.slice(0, len); + this._update(add); + this._reseed++; + return utils.encode(res, enc); +}; + +},{"hash.js":195,"minimalistic-assert":211,"minimalistic-crypto-utils":212}],208:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = (nBytes * 8) - mLen - 1 @@ -11187,325 +37313,1407 @@ exports.read = function (buffer, offset, isLE, mLen, nBytes) { nBits += mLen for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = ((value * c) - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],209:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],210:[function(require,module,exports){ +(function (process,global){ +/** + * [js-sha3]{@link https://github.com/emn178/js-sha3} + * + * @version 0.5.7 + * @author Chen, Yi-Cyuan [emn178@gmail.com] + * @copyright Chen, Yi-Cyuan 2015-2016 + * @license MIT + */ +/*jslint bitwise: true */ +(function () { + 'use strict'; + + var root = typeof window === 'object' ? window : {}; + var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; + if (NODE_JS) { + root = global; + } + var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module === 'object' && module.exports; + var HEX_CHARS = '0123456789abcdef'.split(''); + var SHAKE_PADDING = [31, 7936, 2031616, 520093696]; + var KECCAK_PADDING = [1, 256, 65536, 16777216]; + var PADDING = [6, 1536, 393216, 100663296]; + var SHIFT = [0, 8, 16, 24]; + var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, + 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, + 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, + 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, + 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648]; + var BITS = [224, 256, 384, 512]; + var SHAKE_BITS = [128, 256]; + var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array']; + + var createOutputMethod = function (bits, padding, outputType) { + return function (message) { + return new Keccak(bits, padding, bits).update(message)[outputType](); + }; + }; + + var createShakeOutputMethod = function (bits, padding, outputType) { + return function (message, outputBits) { + return new Keccak(bits, padding, outputBits).update(message)[outputType](); + }; + }; + + var createMethod = function (bits, padding) { + var method = createOutputMethod(bits, padding, 'hex'); + method.create = function () { + return new Keccak(bits, padding, bits); + }; + method.update = function (message) { + return method.create().update(message); + }; + for (var i = 0; i < OUTPUT_TYPES.length; ++i) { + var type = OUTPUT_TYPES[i]; + method[type] = createOutputMethod(bits, padding, type); + } + return method; + }; + + var createShakeMethod = function (bits, padding) { + var method = createShakeOutputMethod(bits, padding, 'hex'); + method.create = function (outputBits) { + return new Keccak(bits, padding, outputBits); + }; + method.update = function (message, outputBits) { + return method.create(outputBits).update(message); + }; + for (var i = 0; i < OUTPUT_TYPES.length; ++i) { + var type = OUTPUT_TYPES[i]; + method[type] = createShakeOutputMethod(bits, padding, type); + } + return method; + }; + + var algorithms = [ + {name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod}, + {name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod}, + {name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod} + ]; + + var methods = {}, methodNames = []; + + for (var i = 0; i < algorithms.length; ++i) { + var algorithm = algorithms[i]; + var bits = algorithm.bits; + for (var j = 0; j < bits.length; ++j) { + var methodName = algorithm.name +'_' + bits[j]; + methodNames.push(methodName); + methods[methodName] = algorithm.createMethod(bits[j], algorithm.padding); + } + } + + function Keccak(bits, padding, outputBits) { + this.blocks = []; + this.s = []; + this.padding = padding; + this.outputBits = outputBits; + this.reset = true; + this.block = 0; + this.start = 0; + this.blockCount = (1600 - (bits << 1)) >> 5; + this.byteCount = this.blockCount << 2; + this.outputBlocks = outputBits >> 5; + this.extraBytes = (outputBits & 31) >> 3; + + for (var i = 0; i < 50; ++i) { + this.s[i] = 0; + } + } + + Keccak.prototype.update = function (message) { + var notString = typeof message !== 'string'; + if (notString && message.constructor === ArrayBuffer) { + message = new Uint8Array(message); + } + var length = message.length, blocks = this.blocks, byteCount = this.byteCount, + blockCount = this.blockCount, index = 0, s = this.s, i, code; + + while (index < length) { + if (this.reset) { + this.reset = false; + blocks[0] = this.block; + for (i = 1; i < blockCount + 1; ++i) { + blocks[i] = 0; + } + } + if (notString) { + for (i = this.start; index < length && i < byteCount; ++index) { + blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; + } + } else { + for (i = this.start; index < length && i < byteCount; ++index) { + code = message.charCodeAt(index); + if (code < 0x80) { + blocks[i >> 2] |= code << SHIFT[i++ & 3]; + } else if (code < 0x800) { + blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else if (code < 0xd800 || code >= 0xe000) { + blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else { + code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); + blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } + } + } + this.lastByteIndex = i; + if (i >= byteCount) { + this.start = i - byteCount; + this.block = blocks[blockCount]; + for (i = 0; i < blockCount; ++i) { + s[i] ^= blocks[i]; + } + f(s); + this.reset = true; + } else { + this.start = i; + } + } + return this; + }; + + Keccak.prototype.finalize = function () { + var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s; + blocks[i >> 2] |= this.padding[i & 3]; + if (this.lastByteIndex === this.byteCount) { + blocks[0] = blocks[blockCount]; + for (i = 1; i < blockCount + 1; ++i) { + blocks[i] = 0; + } + } + blocks[blockCount - 1] |= 0x80000000; + for (i = 0; i < blockCount; ++i) { + s[i] ^= blocks[i]; + } + f(s); + }; + + Keccak.prototype.toString = Keccak.prototype.hex = function () { + this.finalize(); + + var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, + extraBytes = this.extraBytes, i = 0, j = 0; + var hex = '', block; + while (j < outputBlocks) { + for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { + block = s[i]; + hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] + + HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] + + HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] + + HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F]; + } + if (j % blockCount === 0) { + f(s); + i = 0; + } + } + if (extraBytes) { + block = s[i]; + if (extraBytes > 0) { + hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F]; + } + if (extraBytes > 1) { + hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F]; + } + if (extraBytes > 2) { + hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F]; + } + } + return hex; + }; + + Keccak.prototype.arrayBuffer = function () { + this.finalize(); + + var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, + extraBytes = this.extraBytes, i = 0, j = 0; + var bytes = this.outputBits >> 3; + var buffer; + if (extraBytes) { + buffer = new ArrayBuffer((outputBlocks + 1) << 2); + } else { + buffer = new ArrayBuffer(bytes); + } + var array = new Uint32Array(buffer); + while (j < outputBlocks) { + for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { + array[j] = s[i]; + } + if (j % blockCount === 0) { + f(s); + } + } + if (extraBytes) { + array[i] = s[i]; + buffer = buffer.slice(0, bytes); + } + return buffer; + }; + + Keccak.prototype.buffer = Keccak.prototype.arrayBuffer; + + Keccak.prototype.digest = Keccak.prototype.array = function () { + this.finalize(); + + var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, + extraBytes = this.extraBytes, i = 0, j = 0; + var array = [], offset, block; + while (j < outputBlocks) { + for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { + offset = j << 2; + block = s[i]; + array[offset] = block & 0xFF; + array[offset + 1] = (block >> 8) & 0xFF; + array[offset + 2] = (block >> 16) & 0xFF; + array[offset + 3] = (block >> 24) & 0xFF; + } + if (j % blockCount === 0) { + f(s); + } + } + if (extraBytes) { + offset = j << 2; + block = s[i]; + if (extraBytes > 0) { + array[offset] = block & 0xFF; + } + if (extraBytes > 1) { + array[offset + 1] = (block >> 8) & 0xFF; + } + if (extraBytes > 2) { + array[offset + 2] = (block >> 16) & 0xFF; + } + } + return array; + }; + + var f = function (s) { + var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, + b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, + b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, + b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49; + for (n = 0; n < 48; n += 2) { + c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; + c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; + c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; + c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; + c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; + c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; + c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; + c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; + c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; + c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49]; + + h = c8 ^ ((c2 << 1) | (c3 >>> 31)); + l = c9 ^ ((c3 << 1) | (c2 >>> 31)); + s[0] ^= h; + s[1] ^= l; + s[10] ^= h; + s[11] ^= l; + s[20] ^= h; + s[21] ^= l; + s[30] ^= h; + s[31] ^= l; + s[40] ^= h; + s[41] ^= l; + h = c0 ^ ((c4 << 1) | (c5 >>> 31)); + l = c1 ^ ((c5 << 1) | (c4 >>> 31)); + s[2] ^= h; + s[3] ^= l; + s[12] ^= h; + s[13] ^= l; + s[22] ^= h; + s[23] ^= l; + s[32] ^= h; + s[33] ^= l; + s[42] ^= h; + s[43] ^= l; + h = c2 ^ ((c6 << 1) | (c7 >>> 31)); + l = c3 ^ ((c7 << 1) | (c6 >>> 31)); + s[4] ^= h; + s[5] ^= l; + s[14] ^= h; + s[15] ^= l; + s[24] ^= h; + s[25] ^= l; + s[34] ^= h; + s[35] ^= l; + s[44] ^= h; + s[45] ^= l; + h = c4 ^ ((c8 << 1) | (c9 >>> 31)); + l = c5 ^ ((c9 << 1) | (c8 >>> 31)); + s[6] ^= h; + s[7] ^= l; + s[16] ^= h; + s[17] ^= l; + s[26] ^= h; + s[27] ^= l; + s[36] ^= h; + s[37] ^= l; + s[46] ^= h; + s[47] ^= l; + h = c6 ^ ((c0 << 1) | (c1 >>> 31)); + l = c7 ^ ((c1 << 1) | (c0 >>> 31)); + s[8] ^= h; + s[9] ^= l; + s[18] ^= h; + s[19] ^= l; + s[28] ^= h; + s[29] ^= l; + s[38] ^= h; + s[39] ^= l; + s[48] ^= h; + s[49] ^= l; + + b0 = s[0]; + b1 = s[1]; + b32 = (s[11] << 4) | (s[10] >>> 28); + b33 = (s[10] << 4) | (s[11] >>> 28); + b14 = (s[20] << 3) | (s[21] >>> 29); + b15 = (s[21] << 3) | (s[20] >>> 29); + b46 = (s[31] << 9) | (s[30] >>> 23); + b47 = (s[30] << 9) | (s[31] >>> 23); + b28 = (s[40] << 18) | (s[41] >>> 14); + b29 = (s[41] << 18) | (s[40] >>> 14); + b20 = (s[2] << 1) | (s[3] >>> 31); + b21 = (s[3] << 1) | (s[2] >>> 31); + b2 = (s[13] << 12) | (s[12] >>> 20); + b3 = (s[12] << 12) | (s[13] >>> 20); + b34 = (s[22] << 10) | (s[23] >>> 22); + b35 = (s[23] << 10) | (s[22] >>> 22); + b16 = (s[33] << 13) | (s[32] >>> 19); + b17 = (s[32] << 13) | (s[33] >>> 19); + b48 = (s[42] << 2) | (s[43] >>> 30); + b49 = (s[43] << 2) | (s[42] >>> 30); + b40 = (s[5] << 30) | (s[4] >>> 2); + b41 = (s[4] << 30) | (s[5] >>> 2); + b22 = (s[14] << 6) | (s[15] >>> 26); + b23 = (s[15] << 6) | (s[14] >>> 26); + b4 = (s[25] << 11) | (s[24] >>> 21); + b5 = (s[24] << 11) | (s[25] >>> 21); + b36 = (s[34] << 15) | (s[35] >>> 17); + b37 = (s[35] << 15) | (s[34] >>> 17); + b18 = (s[45] << 29) | (s[44] >>> 3); + b19 = (s[44] << 29) | (s[45] >>> 3); + b10 = (s[6] << 28) | (s[7] >>> 4); + b11 = (s[7] << 28) | (s[6] >>> 4); + b42 = (s[17] << 23) | (s[16] >>> 9); + b43 = (s[16] << 23) | (s[17] >>> 9); + b24 = (s[26] << 25) | (s[27] >>> 7); + b25 = (s[27] << 25) | (s[26] >>> 7); + b6 = (s[36] << 21) | (s[37] >>> 11); + b7 = (s[37] << 21) | (s[36] >>> 11); + b38 = (s[47] << 24) | (s[46] >>> 8); + b39 = (s[46] << 24) | (s[47] >>> 8); + b30 = (s[8] << 27) | (s[9] >>> 5); + b31 = (s[9] << 27) | (s[8] >>> 5); + b12 = (s[18] << 20) | (s[19] >>> 12); + b13 = (s[19] << 20) | (s[18] >>> 12); + b44 = (s[29] << 7) | (s[28] >>> 25); + b45 = (s[28] << 7) | (s[29] >>> 25); + b26 = (s[38] << 8) | (s[39] >>> 24); + b27 = (s[39] << 8) | (s[38] >>> 24); + b8 = (s[48] << 14) | (s[49] >>> 18); + b9 = (s[49] << 14) | (s[48] >>> 18); + + s[0] = b0 ^ (~b2 & b4); + s[1] = b1 ^ (~b3 & b5); + s[10] = b10 ^ (~b12 & b14); + s[11] = b11 ^ (~b13 & b15); + s[20] = b20 ^ (~b22 & b24); + s[21] = b21 ^ (~b23 & b25); + s[30] = b30 ^ (~b32 & b34); + s[31] = b31 ^ (~b33 & b35); + s[40] = b40 ^ (~b42 & b44); + s[41] = b41 ^ (~b43 & b45); + s[2] = b2 ^ (~b4 & b6); + s[3] = b3 ^ (~b5 & b7); + s[12] = b12 ^ (~b14 & b16); + s[13] = b13 ^ (~b15 & b17); + s[22] = b22 ^ (~b24 & b26); + s[23] = b23 ^ (~b25 & b27); + s[32] = b32 ^ (~b34 & b36); + s[33] = b33 ^ (~b35 & b37); + s[42] = b42 ^ (~b44 & b46); + s[43] = b43 ^ (~b45 & b47); + s[4] = b4 ^ (~b6 & b8); + s[5] = b5 ^ (~b7 & b9); + s[14] = b14 ^ (~b16 & b18); + s[15] = b15 ^ (~b17 & b19); + s[24] = b24 ^ (~b26 & b28); + s[25] = b25 ^ (~b27 & b29); + s[34] = b34 ^ (~b36 & b38); + s[35] = b35 ^ (~b37 & b39); + s[44] = b44 ^ (~b46 & b48); + s[45] = b45 ^ (~b47 & b49); + s[6] = b6 ^ (~b8 & b0); + s[7] = b7 ^ (~b9 & b1); + s[16] = b16 ^ (~b18 & b10); + s[17] = b17 ^ (~b19 & b11); + s[26] = b26 ^ (~b28 & b20); + s[27] = b27 ^ (~b29 & b21); + s[36] = b36 ^ (~b38 & b30); + s[37] = b37 ^ (~b39 & b31); + s[46] = b46 ^ (~b48 & b40); + s[47] = b47 ^ (~b49 & b41); + s[8] = b8 ^ (~b0 & b2); + s[9] = b9 ^ (~b1 & b3); + s[18] = b18 ^ (~b10 & b12); + s[19] = b19 ^ (~b11 & b13); + s[28] = b28 ^ (~b20 & b22); + s[29] = b29 ^ (~b21 & b23); + s[38] = b38 ^ (~b30 & b32); + s[39] = b39 ^ (~b31 & b33); + s[48] = b48 ^ (~b40 & b42); + s[49] = b49 ^ (~b41 & b43); + + s[0] ^= RC[n]; + s[1] ^= RC[n + 1]; + } + }; + + if (COMMON_JS) { + module.exports = methods; + } else { + for (var i = 0; i < methodNames.length; ++i) { + root[methodNames[i]] = methods[methodNames[i]]; + } + } +})(); + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"_process":213}],211:[function(require,module,exports){ +module.exports = assert; + +function assert(val, msg) { + if (!val) + throw new Error(msg || 'Assertion failed'); +} + +assert.equal = function assertEqual(l, r, msg) { + if (l != r) + throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); +}; + +},{}],212:[function(require,module,exports){ +'use strict'; + +var utils = exports; + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg !== 'string') { + for (var i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + return res; + } + if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (var i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); } else { - m = m + Math.pow(2, mLen) - e = e - eBias + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + var hi = c >> 8; + var lo = c & 0xff; + if (hi) + res.push(hi, lo); + else + res.push(lo); + } } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) + return res; } +utils.toArray = toArray; -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = (nBytes * 8) - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +utils.zero2 = zero2; - value = Math.abs(value) +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +utils.toHex = toHex; - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } +utils.encode = function encode(arr, enc) { + if (enc === 'hex') + return toHex(arr); + else + return arr; +}; - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = ((value * c) - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } +},{}],213:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} +var cachedSetTimeout; +var cachedClearTimeout; - buffer[offset + i - d] |= s * 128 +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); } - -},{}],23:[function(require,module,exports){ -(function (Buffer){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getLength = exports.decode = exports.encode = void 0; -var BN = require("bn.js"); -/** - * RLP Encoding based on: https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-RLP - * This function takes in a data, convert it to buffer if not, and a length for recursion - * @param input - will be converted to buffer - * @returns returns buffer of encoded data - **/ -function encode(input) { - if (Array.isArray(input)) { - var output = []; - for (var i = 0; i < input.length; i++) { - output.push(encode(input[i])); +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; } - var buf = Buffer.concat(output); - return Buffer.concat([encodeLength(buf.length, 192), buf]); + } catch (e) { + cachedSetTimeout = defaultSetTimout; } - else { - var inputBuf = toBuffer(input); - return inputBuf.length === 1 && inputBuf[0] < 128 - ? inputBuf - : Buffer.concat([encodeLength(inputBuf.length, 128), inputBuf]); + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; } -} -exports.encode = encode; -/** - * Parse integers. Check if there is no leading zeros - * @param v The value to parse - * @param base The base to parse the integer into - */ -function safeParseInt(v, base) { - if (v.slice(0, 2) === '00') { - throw new Error('invalid RLP: extra zeros'); +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); } - return parseInt(v, base); -} -function encodeLength(len, offset) { - if (len < 56) { - return Buffer.from([len + offset]); + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); } - else { - var hexLength = intToHex(len); - var lLength = hexLength.length / 2; - var firstByte = intToHex(offset + 55 + lLength); - return Buffer.from(firstByte + hexLength, 'hex'); + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } } + + } -function decode(input, stream) { - if (stream === void 0) { stream = false; } - if (!input || input.length === 0) { - return Buffer.from([]); +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); } - var inputBuffer = toBuffer(input); - var decoded = _decode(inputBuffer); - if (stream) { - return decoded; + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); } - if (decoded.remainder.length !== 0) { - throw new Error('invalid remainder'); + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } } - return decoded.data; + + + } -exports.decode = decode; -/** - * Get the length of the RLP input - * @param input - * @returns The length of the input or an empty Buffer if no input - */ -function getLength(input) { - if (!input || input.length === 0) { - return Buffer.from([]); +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; } - var inputBuffer = toBuffer(input); - var firstByte = inputBuffer[0]; - if (firstByte <= 0x7f) { - return inputBuffer.length; + if (queue.length) { + drainQueue(); } - else if (firstByte <= 0xb7) { - return firstByte - 0x7f; +} + +function drainQueue() { + if (draining) { + return; } - else if (firstByte <= 0xbf) { - return firstByte - 0xb6; + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; } - else if (firstByte <= 0xf7) { - // a list between 0-55 bytes long - return firstByte - 0xbf; + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } } - else { - // a list over 55 bytes long - var llength = firstByte - 0xf6; - var length = safeParseInt(inputBuffer.slice(1, llength).toString('hex'), 16); - return llength + length; - } -} -exports.getLength = getLength; -/** Decode an input with RLP */ -function _decode(input) { - var length, llength, data, innerRemainder, d; - var decoded = []; - var firstByte = input[0]; - if (firstByte <= 0x7f) { - // a single byte whose value is in the [0x00, 0x7f] range, that byte is its own RLP encoding. - return { - data: input.slice(0, 1), - remainder: input.slice(1), - }; + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); } - else if (firstByte <= 0xb7) { - // string is 0-55 bytes long. A single byte with value 0x80 plus the length of the string followed by the string - // The range of the first byte is [0x80, 0xb7] - length = firstByte - 0x7f; - // set 0x80 null to 0 - if (firstByte === 0x80) { - data = Buffer.from([]); +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],214:[function(require,module,exports){ +(function (setImmediate){ +"use strict"; + +(function(root) { + const MAX_VALUE = 0x7fffffff; + + // The SHA256 and PBKDF2 implementation are from scrypt-async-js: + // See: https://github.com/dchest/scrypt-async-js + function SHA256(m) { + const K = new Uint32Array([ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, + 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, + 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, + 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, + 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, + 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, + 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, + 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + ]); + + let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a; + let h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19; + const w = new Uint32Array(64); + + function blocks(p) { + let off = 0, len = p.length; + while (len >= 64) { + let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, u, i, j, t1, t2; + + for (i = 0; i < 16; i++) { + j = off + i*4; + w[i] = ((p[j] & 0xff)<<24) | ((p[j+1] & 0xff)<<16) | + ((p[j+2] & 0xff)<<8) | (p[j+3] & 0xff); + } + + for (i = 16; i < 64; i++) { + u = w[i-2]; + t1 = ((u>>>17) | (u<<(32-17))) ^ ((u>>>19) | (u<<(32-19))) ^ (u>>>10); + + u = w[i-15]; + t2 = ((u>>>7) | (u<<(32-7))) ^ ((u>>>18) | (u<<(32-18))) ^ (u>>>3); + + w[i] = (((t1 + w[i-7]) | 0) + ((t2 + w[i-16]) | 0)) | 0; + } + + for (i = 0; i < 64; i++) { + t1 = ((((((e>>>6) | (e<<(32-6))) ^ ((e>>>11) | (e<<(32-11))) ^ + ((e>>>25) | (e<<(32-25)))) + ((e & f) ^ (~e & g))) | 0) + + ((h + ((K[i] + w[i]) | 0)) | 0)) | 0; + + t2 = ((((a>>>2) | (a<<(32-2))) ^ ((a>>>13) | (a<<(32-13))) ^ + ((a>>>22) | (a<<(32-22)))) + ((a & b) ^ (a & c) ^ (b & c))) | 0; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + h0 = (h0 + a) | 0; + h1 = (h1 + b) | 0; + h2 = (h2 + c) | 0; + h3 = (h3 + d) | 0; + h4 = (h4 + e) | 0; + h5 = (h5 + f) | 0; + h6 = (h6 + g) | 0; + h7 = (h7 + h) | 0; + + off += 64; + len -= 64; + } } - else { - data = input.slice(1, length); + + blocks(m); + + let i, bytesLeft = m.length % 64, + bitLenHi = (m.length / 0x20000000) | 0, + bitLenLo = m.length << 3, + numZeros = (bytesLeft < 56) ? 56 : 120, + p = m.slice(m.length - bytesLeft, m.length); + + p.push(0x80); + for (i = bytesLeft + 1; i < numZeros; i++) { p.push(0); } + p.push((bitLenHi >>> 24) & 0xff); + p.push((bitLenHi >>> 16) & 0xff); + p.push((bitLenHi >>> 8) & 0xff); + p.push((bitLenHi >>> 0) & 0xff); + p.push((bitLenLo >>> 24) & 0xff); + p.push((bitLenLo >>> 16) & 0xff); + p.push((bitLenLo >>> 8) & 0xff); + p.push((bitLenLo >>> 0) & 0xff); + + blocks(p); + + return [ + (h0 >>> 24) & 0xff, (h0 >>> 16) & 0xff, (h0 >>> 8) & 0xff, (h0 >>> 0) & 0xff, + (h1 >>> 24) & 0xff, (h1 >>> 16) & 0xff, (h1 >>> 8) & 0xff, (h1 >>> 0) & 0xff, + (h2 >>> 24) & 0xff, (h2 >>> 16) & 0xff, (h2 >>> 8) & 0xff, (h2 >>> 0) & 0xff, + (h3 >>> 24) & 0xff, (h3 >>> 16) & 0xff, (h3 >>> 8) & 0xff, (h3 >>> 0) & 0xff, + (h4 >>> 24) & 0xff, (h4 >>> 16) & 0xff, (h4 >>> 8) & 0xff, (h4 >>> 0) & 0xff, + (h5 >>> 24) & 0xff, (h5 >>> 16) & 0xff, (h5 >>> 8) & 0xff, (h5 >>> 0) & 0xff, + (h6 >>> 24) & 0xff, (h6 >>> 16) & 0xff, (h6 >>> 8) & 0xff, (h6 >>> 0) & 0xff, + (h7 >>> 24) & 0xff, (h7 >>> 16) & 0xff, (h7 >>> 8) & 0xff, (h7 >>> 0) & 0xff + ]; + } + + function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) { + // compress password if it's longer than hash block length + password = (password.length <= 64) ? password : SHA256(password); + + const innerLen = 64 + salt.length + 4; + const inner = new Array(innerLen); + const outerKey = new Array(64); + + let i; + let dk = []; + + // inner = (password ^ ipad) || salt || counter + for (i = 0; i < 64; i++) { inner[i] = 0x36; } + for (i = 0; i < password.length; i++) { inner[i] ^= password[i]; } + for (i = 0; i < salt.length; i++) { inner[64 + i] = salt[i]; } + for (i = innerLen - 4; i < innerLen; i++) { inner[i] = 0; } + + // outerKey = password ^ opad + for (i = 0; i < 64; i++) outerKey[i] = 0x5c; + for (i = 0; i < password.length; i++) outerKey[i] ^= password[i]; + + // increments counter inside inner + function incrementCounter() { + for (let i = innerLen - 1; i >= innerLen - 4; i--) { + inner[i]++; + if (inner[i] <= 0xff) return; + inner[i] = 0; + } + } + + // output blocks = SHA256(outerKey || SHA256(inner)) ... + while (dkLen >= 32) { + incrementCounter(); + dk = dk.concat(SHA256(outerKey.concat(SHA256(inner)))); + dkLen -= 32; } - if (length === 2 && data[0] < 0x80) { - throw new Error('invalid rlp encoding: byte must be less 0x80'); + if (dkLen > 0) { + incrementCounter(); + dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen)); } - return { - data: data, - remainder: input.slice(length), - }; + + return dk; } - else if (firstByte <= 0xbf) { - // string is greater than 55 bytes long. A single byte with the value (0xb7 plus the length of the length), - // followed by the length, followed by the string - llength = firstByte - 0xb6; - if (input.length - 1 < llength) { - throw new Error('invalid RLP: not enough bytes for string length'); + + // The following is an adaptation of scryptsy + // See: https://www.npmjs.com/package/scryptsy + function blockmix_salsa8(BY, Yi, r, x, _X) { + let i; + + arraycopy(BY, (2 * r - 1) * 16, _X, 0, 16); + for (i = 0; i < 2 * r; i++) { + blockxor(BY, i * 16, _X, 16); + salsa20_8(_X, x); + arraycopy(_X, 0, BY, Yi + (i * 16), 16); } - length = safeParseInt(input.slice(1, llength).toString('hex'), 16); - if (length <= 55) { - throw new Error('invalid RLP: expected string length to be greater than 55'); + + for (i = 0; i < r; i++) { + arraycopy(BY, Yi + (i * 2) * 16, BY, (i * 16), 16); } - data = input.slice(llength, length + llength); - if (data.length < length) { - throw new Error('invalid RLP: not enough bytes for string'); + + for (i = 0; i < r; i++) { + arraycopy(BY, Yi + (i * 2 + 1) * 16, BY, (i + r) * 16, 16); } - return { - data: data, - remainder: input.slice(length + llength), - }; } - else if (firstByte <= 0xf7) { - // a list between 0-55 bytes long - length = firstByte - 0xbf; - innerRemainder = input.slice(1, length); - while (innerRemainder.length) { - d = _decode(innerRemainder); - decoded.push(d.data); - innerRemainder = d.remainder; + + function R(a, b) { + return (a << b) | (a >>> (32 - b)); + } + + function salsa20_8(B, x) { + arraycopy(B, 0, x, 0, 16); + + for (let i = 8; i > 0; i -= 2) { + x[ 4] ^= R(x[ 0] + x[12], 7); + x[ 8] ^= R(x[ 4] + x[ 0], 9); + x[12] ^= R(x[ 8] + x[ 4], 13); + x[ 0] ^= R(x[12] + x[ 8], 18); + x[ 9] ^= R(x[ 5] + x[ 1], 7); + x[13] ^= R(x[ 9] + x[ 5], 9); + x[ 1] ^= R(x[13] + x[ 9], 13); + x[ 5] ^= R(x[ 1] + x[13], 18); + x[14] ^= R(x[10] + x[ 6], 7); + x[ 2] ^= R(x[14] + x[10], 9); + x[ 6] ^= R(x[ 2] + x[14], 13); + x[10] ^= R(x[ 6] + x[ 2], 18); + x[ 3] ^= R(x[15] + x[11], 7); + x[ 7] ^= R(x[ 3] + x[15], 9); + x[11] ^= R(x[ 7] + x[ 3], 13); + x[15] ^= R(x[11] + x[ 7], 18); + x[ 1] ^= R(x[ 0] + x[ 3], 7); + x[ 2] ^= R(x[ 1] + x[ 0], 9); + x[ 3] ^= R(x[ 2] + x[ 1], 13); + x[ 0] ^= R(x[ 3] + x[ 2], 18); + x[ 6] ^= R(x[ 5] + x[ 4], 7); + x[ 7] ^= R(x[ 6] + x[ 5], 9); + x[ 4] ^= R(x[ 7] + x[ 6], 13); + x[ 5] ^= R(x[ 4] + x[ 7], 18); + x[11] ^= R(x[10] + x[ 9], 7); + x[ 8] ^= R(x[11] + x[10], 9); + x[ 9] ^= R(x[ 8] + x[11], 13); + x[10] ^= R(x[ 9] + x[ 8], 18); + x[12] ^= R(x[15] + x[14], 7); + x[13] ^= R(x[12] + x[15], 9); + x[14] ^= R(x[13] + x[12], 13); + x[15] ^= R(x[14] + x[13], 18); } - return { - data: decoded, - remainder: input.slice(length), - }; - } - else { - // a list over 55 bytes long - llength = firstByte - 0xf6; - length = safeParseInt(input.slice(1, llength).toString('hex'), 16); - var totalLength = llength + length; - if (totalLength > input.length) { - throw new Error('invalid rlp: total length is larger than the data'); - } - innerRemainder = input.slice(llength, totalLength); - if (innerRemainder.length === 0) { - throw new Error('invalid rlp, List has a invalid length'); - } - while (innerRemainder.length) { - d = _decode(innerRemainder); - decoded.push(d.data); - innerRemainder = d.remainder; + + for (let i = 0; i < 16; ++i) { + B[i] += x[i]; } - return { - data: decoded, - remainder: input.slice(totalLength), - }; } -} -/** Check if a string is prefixed by 0x */ -function isHexPrefixed(str) { - return str.slice(0, 2) === '0x'; -} -/** Removes 0x from a given String */ -function stripHexPrefix(str) { - if (typeof str !== 'string') { - return str; + + // naive approach... going back to loop unrolling may yield additional performance + function blockxor(S, Si, D, len) { + for (let i = 0; i < len; i++) { + D[i] ^= S[Si + i] + } } - return isHexPrefixed(str) ? str.slice(2) : str; -} -/** Transform an integer into its hexadecimal value */ -function intToHex(integer) { - if (integer < 0) { - throw new Error('Invalid integer as argument, must be unsigned!'); + + function arraycopy(src, srcPos, dest, destPos, length) { + while (length--) { + dest[destPos++] = src[srcPos++]; + } } - var hex = integer.toString(16); - return hex.length % 2 ? "0" + hex : hex; -} -/** Pad a string to be even */ -function padToEven(a) { - return a.length % 2 ? "0" + a : a; -} -/** Transform an integer into a Buffer */ -function intToBuffer(integer) { - var hex = intToHex(integer); - return Buffer.from(hex, 'hex'); -} -/** Transform anything into a Buffer */ -function toBuffer(v) { - if (!Buffer.isBuffer(v)) { - if (typeof v === 'string') { - if (isHexPrefixed(v)) { - return Buffer.from(padToEven(stripHexPrefix(v)), 'hex'); - } - else { - return Buffer.from(v); + + function checkBufferish(o) { + if (!o || typeof(o.length) !== 'number') { return false; } + + for (let i = 0; i < o.length; i++) { + const v = o[i]; + if (typeof(v) !== 'number' || v % 1 || v < 0 || v >= 256) { + return false; } } - else if (typeof v === 'number' || typeof v === 'bigint') { - if (!v) { - return Buffer.from([]); + + return true; + } + + function ensureInteger(value, name) { + if (typeof(value) !== "number" || (value % 1)) { throw new Error('invalid ' + name); } + return value; + } + + // N = Cpu cost, r = Memory cost, p = parallelization cost + // callback(error, progress, key) + function _scrypt(password, salt, N, r, p, dkLen, callback) { + + N = ensureInteger(N, 'N'); + r = ensureInteger(r, 'r'); + p = ensureInteger(p, 'p'); + + dkLen = ensureInteger(dkLen, 'dkLen'); + + if (N === 0 || (N & (N - 1)) !== 0) { throw new Error('N must be power of 2'); } + + if (N > MAX_VALUE / 128 / r) { throw new Error('N too large'); } + if (r > MAX_VALUE / 128 / p) { throw new Error('r too large'); } + + if (!checkBufferish(password)) { + throw new Error('password must be an array or buffer'); + } + password = Array.prototype.slice.call(password); + + if (!checkBufferish(salt)) { + throw new Error('salt must be an array or buffer'); + } + salt = Array.prototype.slice.call(salt); + + let b = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r); + const B = new Uint32Array(p * 32 * r) + for (let i = 0; i < B.length; i++) { + const j = i * 4; + B[i] = ((b[j + 3] & 0xff) << 24) | + ((b[j + 2] & 0xff) << 16) | + ((b[j + 1] & 0xff) << 8) | + ((b[j + 0] & 0xff) << 0); + } + + const XY = new Uint32Array(64 * r); + const V = new Uint32Array(32 * r * N); + + const Yi = 32 * r; + + // scratch space + const x = new Uint32Array(16); // salsa20_8 + const _X = new Uint32Array(16); // blockmix_salsa8 + + const totalOps = p * N * 2; + let currentOp = 0; + let lastPercent10 = null; + + // Set this to true to abandon the scrypt on the next step + let stop = false; + + // State information + let state = 0; + let i0 = 0, i1; + let Bi; + + // How many blockmix_salsa8 can we do per step? + const limit = callback ? parseInt(1000 / r): 0xffffffff; + + // Trick from scrypt-async; if there is a setImmediate shim in place, use it + const nextTick = (typeof(setImmediate) !== 'undefined') ? setImmediate : setTimeout; + + // This is really all I changed; making scryptsy a state machine so we occasionally + // stop and give other evnts on the evnt loop a chance to run. ~RicMoo + const incrementalSMix = function() { + if (stop) { + return callback(new Error('cancelled'), currentOp / totalOps); } - else { - return intToBuffer(v); + + let steps; + + switch (state) { + case 0: + // for (var i = 0; i < p; i++)... + Bi = i0 * 32 * r; + + arraycopy(B, Bi, XY, 0, Yi); // ROMix - 1 + + state = 1; // Move to ROMix 2 + i1 = 0; + + // Fall through + + case 1: + + // Run up to 1000 steps of the first inner smix loop + steps = N - i1; + if (steps > limit) { steps = limit; } + for (let i = 0; i < steps; i++) { // ROMix - 2 + arraycopy(XY, 0, V, (i1 + i) * Yi, Yi) // ROMix - 3 + blockmix_salsa8(XY, Yi, r, x, _X); // ROMix - 4 + } + + // for (var i = 0; i < N; i++) + i1 += steps; + currentOp += steps; + + if (callback) { + // Call the callback with the progress (optionally stopping us) + const percent10 = parseInt(1000 * currentOp / totalOps); + if (percent10 !== lastPercent10) { + stop = callback(null, currentOp / totalOps); + if (stop) { break; } + lastPercent10 = percent10; + } + } + + if (i1 < N) { break; } + + i1 = 0; // Move to ROMix 6 + state = 2; + + // Fall through + + case 2: + + // Run up to 1000 steps of the second inner smix loop + steps = N - i1; + if (steps > limit) { steps = limit; } + for (let i = 0; i < steps; i++) { // ROMix - 6 + const offset = (2 * r - 1) * 16; // ROMix - 7 + const j = XY[offset] & (N - 1); + blockxor(V, j * Yi, XY, Yi); // ROMix - 8 (inner) + blockmix_salsa8(XY, Yi, r, x, _X); // ROMix - 9 (outer) + } + + // for (var i = 0; i < N; i++)... + i1 += steps; + currentOp += steps; + + // Call the callback with the progress (optionally stopping us) + if (callback) { + const percent10 = parseInt(1000 * currentOp / totalOps); + if (percent10 !== lastPercent10) { + stop = callback(null, currentOp / totalOps); + if (stop) { break; } + lastPercent10 = percent10; + } + } + + if (i1 < N) { break; } + + arraycopy(XY, 0, B, Bi, Yi); // ROMix - 10 + + // for (var i = 0; i < p; i++)... + i0++; + if (i0 < p) { + state = 0; + break; + } + + b = []; + for (let i = 0; i < B.length; i++) { + b.push((B[i] >> 0) & 0xff); + b.push((B[i] >> 8) & 0xff); + b.push((B[i] >> 16) & 0xff); + b.push((B[i] >> 24) & 0xff); + } + + const derivedKey = PBKDF2_HMAC_SHA256_OneIter(password, b, dkLen); + + // Send the result to the callback + if (callback) { callback(null, 1.0, derivedKey); } + + // Done; don't break (which would reschedule) + return derivedKey; } + + // Schedule the next steps + if (callback) { nextTick(incrementalSMix); } } - else if (v === null || v === undefined) { - return Buffer.from([]); - } - else if (v instanceof Uint8Array) { - return Buffer.from(v); + + // Run the smix state machine until completion + if (!callback) { + while (true) { + const derivedKey = incrementalSMix(); + if (derivedKey != undefined) { return derivedKey; } + } } - else if (BN.isBN(v)) { - // converts a BN to a Buffer - return Buffer.from(v.toArray()); + + // Bootstrap the async incremental smix + incrementalSMix(); + } + + const lib = { + scrypt: function(password, salt, N, r, p, dkLen, progressCallback) { + return new Promise(function(resolve, reject) { + let lastProgress = 0; + if (progressCallback) { progressCallback(0); } + _scrypt(password, salt, N, r, p, dkLen, function(error, progress, key) { + if (error) { + reject(error); + } else if (key) { + if (progressCallback && lastProgress !== 1) { + progressCallback(1); + } + resolve(new Uint8Array(key)); + } else if (progressCallback && progress !== lastProgress) { + lastProgress = progress; + return progressCallback(progress); + } + }); + }); + }, + syncScrypt: function(password, salt, N, r, p, dkLen) { + return new Uint8Array(_scrypt(password, salt, N, r, p, dkLen)); } - else { - throw new Error('invalid type'); + }; + + // node.js + if (typeof(exports) !== 'undefined') { + module.exports = lib; + + // RequireJS/AMD + // http://www.requirejs.org/docs/api.html + // https://github.com/amdjs/amdjs-api/wiki/AMD + } else if (typeof(define) === 'function' && define.amd) { + define(lib); + + // Web Browsers + } else if (root) { + + // If there was an existing library "scrypt", make sure it is still available + if (root.scrypt) { + root._scrypt = root.scrypt; } + + root.scrypt = lib; } - return v; + +})(this); + +}).call(this,require("timers").setImmediate) +},{"timers":215}],215:[function(require,module,exports){ +(function (setImmediate,clearImmediate){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; } +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; -}).call(this,require("buffer").Buffer) -},{"bn.js":18,"buffer":20}],24:[function(require,module,exports){ +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +}).call(this,require("timers").setImmediate,require("timers").clearImmediate) +},{"process/browser.js":213,"timers":215}],216:[function(require,module,exports){ 'use strict'; module.exports = require( './lib/u2f-api' ); -},{"./lib/u2f-api":26}],25:[function(require,module,exports){ +},{"./lib/u2f-api":218}],217:[function(require,module,exports){ // Copyright 2014 Google Inc. All rights reserved // // Use of this source code is governed by a BSD-style @@ -11913,7 +39121,7 @@ u2f.register = function(registerRequests, signRequests, }); }; -},{}],26:[function(require,module,exports){ +},{}],218:[function(require,module,exports){ (function (global){ 'use strict'; @@ -12232,7 +39440,7 @@ makeDefault( 'register' ); makeDefault( 'sign' ); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./google-u2f-api":25}],27:[function(require,module,exports){ +},{"./google-u2f-api":217}],219:[function(require,module,exports){ 'use strict'; module.exports = function() { diff --git a/ledger-bridge.js b/ledger-bridge.js index 35c58ddc..c4203ee8 100644 --- a/ledger-bridge.js +++ b/ledger-bridge.js @@ -3,7 +3,6 @@ require('buffer') import TransportU2F from '@ledgerhq/hw-transport-u2f' import LedgerEth from '@ledgerhq/hw-app-eth' -import { byContractAddress } from '@ledgerhq/hw-app-eth/erc20' import WebSocketTransport from '@ledgerhq/hw-transport-http/lib/WebSocketTransport' // URL which triggers Ledger Live app to open and handle communication @@ -30,7 +29,7 @@ export default class LedgerBridge { this.unlock(replyAction, params.hdPath) break case 'ledger-sign-transaction': - this.signTransaction(replyAction, params.hdPath, params.tx, params.to) + this.signTransaction(replyAction, params.hdPath, params.tx) break case 'ledger-sign-personal-message': this.signPersonalMessage(replyAction, params.hdPath, params.message) @@ -140,13 +139,9 @@ export default class LedgerBridge { } } - async signTransaction (replyAction, hdPath, tx, to) { + async signTransaction (replyAction, hdPath, tx) { try { await this.makeApp() - if (to) { - const isKnownERC20Token = byContractAddress(to) - if (isKnownERC20Token) await this.app.provideERC20TokenInformation(isKnownERC20Token) - } const res = await this.app.signTransaction(hdPath, tx) this.sendMessageToExtension({ action: replyAction, diff --git a/package-lock.json b/package-lock.json index dec6d35b..bb9d24f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,11352 @@ { "name": "gupltest", "version": "0.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "gupltest", + "version": "0.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "@ledgerhq/hw-app-eth": "^6.5.0", + "@ledgerhq/hw-transport-http": "^5.45.0", + "@ledgerhq/hw-transport-u2f": "^5.36.0-deprecated", + "babel-runtime": "^6.26.0", + "babelify": "^8.0.0", + "browserify": "^16.2.2", + "buffer": "^5.2.0" + }, + "devDependencies": { + "babel-core": "^6.26.3", + "babel-preset-es2015": "^6.24.1", + "babel-register": "^6.26.0", + "browser-sync": "^2.26.3", + "gulp": "^4.0.0", + "source": "0.0.3", + "vinyl-source-stream": "^2.0.0" + }, + "engines": { + "npm": "^7.6.0" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.4.0.tgz", + "integrity": "sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/hash": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz", + "integrity": "sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/networks": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/web": "^5.4.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz", + "integrity": "sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz", + "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/rlp": "^5.4.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz", + "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.4.0.tgz", + "integrity": "sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/properties": "^5.4.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.1.tgz", + "integrity": "sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "bn.js": "^4.11.9" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz", + "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz", + "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.4.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.4.1.tgz", + "integrity": "sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "^5.4.0", + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/transactions": "^5.4.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz", + "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.4.0.tgz", + "integrity": "sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/basex": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/pbkdf2": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/sha2": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0", + "@ethersproject/strings": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/wordlists": "^5.4.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz", + "integrity": "sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/hdnode": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/pbkdf2": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/random": "^5.4.0", + "@ethersproject/strings": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz", + "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "js-sha3": "0.5.7" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz", + "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.2.tgz", + "integrity": "sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz", + "integrity": "sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/sha2": "^5.4.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz", + "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.4.3.tgz", + "integrity": "sha512-VURwkaWPoUj7jq9NheNDT5Iyy64Qcyf6BOFDwVdHsmLmX/5prNjFrgSX3GHPE4z1BRrVerDxe2yayvXKFm/NNg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/basex": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/hash": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/networks": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/random": "^5.4.0", + "@ethersproject/rlp": "^5.4.0", + "@ethersproject/sha2": "^5.4.0", + "@ethersproject/strings": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/web": "^5.4.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ethersproject/random": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.4.0.tgz", + "integrity": "sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz", + "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.4.0.tgz", + "integrity": "sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz", + "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.4.0.tgz", + "integrity": "sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/sha2": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz", + "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz", + "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/rlp": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.4.0.tgz", + "integrity": "sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.4.0.tgz", + "integrity": "sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/hash": "^5.4.0", + "@ethersproject/hdnode": "^5.4.0", + "@ethersproject/json-wallets": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/random": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/wordlists": "^5.4.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz", + "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.4.0.tgz", + "integrity": "sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/hash": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "node_modules/@ledgerhq/cryptoassets": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-6.5.0.tgz", + "integrity": "sha512-HBmcfb9WTlcsqlzlHfd7nZr49on7ftpWmKXvxZu9DinLS7EZ5ZjgSvmxrx39YCS5yONILBJoA/BSpg1RcCbSjQ==", + "dependencies": { + "invariant": "2" + } + }, + "node_modules/@ledgerhq/devices": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.43.0.tgz", + "integrity": "sha512-/M5ZLUBdBK7Vl2T4yNJbES3Z4w55LbPdxD9rcOBAKH/5V3V0obQv6MUasP9b7DSkwGSSLCOGZLohoT2NxK2D2A==", + "dependencies": { + "@ledgerhq/errors": "^5.43.0", + "@ledgerhq/logs": "^5.43.0", + "rxjs": "^6.6.3", + "semver": "^7.3.4" + } + }, + "node_modules/@ledgerhq/devices/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ledgerhq/errors": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.43.0.tgz", + "integrity": "sha512-ZjKlUQbIn/DHXAefW3Y1VyDrlVhVqqGnXzrqbOXuDbZ2OAIfSe/A1mrlCbWt98jP/8EJQBuCzBOtnmpXIL/nYg==" + }, + "node_modules/@ledgerhq/hw-app-eth": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-6.5.0.tgz", + "integrity": "sha512-2M43aXxVX3xPwmluG/7zXRljSWSMdifi19V2JR5ezjBhpNg+fgrg6cYOkl7nhyrelsCCaRhWmn3+KCNrkFYLOQ==", + "dependencies": { + "@ledgerhq/cryptoassets": "^6.5.0", + "@ledgerhq/errors": "^6.2.0", + "@ledgerhq/hw-transport": "^6.3.0", + "@ledgerhq/logs": "^6.2.0", + "axios": "^0.21.1", + "bignumber.js": "^9.0.1", + "ethers": "^5.4.4" + } + }, + "node_modules/@ledgerhq/hw-app-eth/node_modules/@ledgerhq/devices": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-6.3.0.tgz", + "integrity": "sha512-DmVxqMAf3FhkpKjkbBCFVJ5DmesfplujeCLzFwO/zF5VGuwY7xxPqeSxlpusXJkqhEq+DbFzIDRWJYDf7rtXqg==", + "dependencies": { + "@ledgerhq/errors": "^6.2.0", + "@ledgerhq/logs": "^6.2.0", + "rxjs": "6", + "semver": "^7.3.5" + } + }, + "node_modules/@ledgerhq/hw-app-eth/node_modules/@ledgerhq/errors": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.2.0.tgz", + "integrity": "sha512-eO03x8HJmG60WtlrMuahigW/rwywFdcGzCnihta/MjkM8BD9A660cKVkyIuheCcpaB7UV/r+QsRl9abHbjjaag==" + }, + "node_modules/@ledgerhq/hw-app-eth/node_modules/@ledgerhq/hw-transport": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.3.0.tgz", + "integrity": "sha512-kdnVrgmxrFtKaRdkoaQBEa02RXgLzEBiooYbxA65BGSJig3PGWDS9LrqNpzLTZM1RQlivd9NLBmfwU2ze4chWA==", + "dependencies": { + "@ledgerhq/devices": "^6.3.0", + "@ledgerhq/errors": "^6.2.0", + "events": "^3.3.0" + } + }, + "node_modules/@ledgerhq/hw-app-eth/node_modules/@ledgerhq/logs": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.2.0.tgz", + "integrity": "sha512-SLyFyD7ElMhgKWPYedFGCT/ilcbGPgL5hXXYHxOM79Fs5fWi0zaUpt5oGqGMsOAAFaMa9/rbun0pokzPhEFz8A==" + }, + "node_modules/@ledgerhq/hw-app-eth/node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/@ledgerhq/hw-app-eth/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/@ledgerhq/hw-app-eth/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ledgerhq/hw-transport": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.43.0.tgz", + "integrity": "sha512-0S+TGmiEJOqgM2MWnolZQPVKU3oRtoDj4yUFUZts9Owbgby+hmo4dIKTvv0vs8mwknQbOZByUgh3MQOQiK70MQ==", + "dependencies": { + "@ledgerhq/devices": "^5.43.0", + "@ledgerhq/errors": "^5.43.0", + "events": "^3.2.0" + } + }, + "node_modules/@ledgerhq/hw-transport-http": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-http/-/hw-transport-http-5.49.0.tgz", + "integrity": "sha512-f3vUD6LMg2hmZwG/81TqvoMp9yI2/qFrd4f5JmLMniLRztkA4Rlt4C+E+1N7WXU8Iuaj9jXyK6NY7uTuprEbvg==", + "dependencies": { + "@ledgerhq/errors": "^5.49.0", + "@ledgerhq/hw-transport": "^5.49.0", + "@ledgerhq/logs": "^5.49.0", + "axios": "^0.21.1", + "ws": "6" + } + }, + "node_modules/@ledgerhq/hw-transport-http/node_modules/@ledgerhq/devices": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.49.0.tgz", + "integrity": "sha512-14VSO+NeR/O8VSXXnlBsA0DAluzanJVEjHLDJubU5NZjEttXVF9gdQh1j10+MKW0f8H23IkdqwswVQIB9ZPomQ==", + "dependencies": { + "@ledgerhq/errors": "^5.49.0", + "@ledgerhq/logs": "^5.49.0", + "rxjs": "^6.6.7", + "semver": "^7.3.5" + } + }, + "node_modules/@ledgerhq/hw-transport-http/node_modules/@ledgerhq/errors": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.49.0.tgz", + "integrity": "sha512-+uhoSsAnzZiZ2CUk/dv4Uo8lrl0jn2izYJATSbC5aZFd0Yl7PWZ1SMHMkvPVEgQvWZcu4iQZ67rlKOtj5tUFWA==" + }, + "node_modules/@ledgerhq/hw-transport-http/node_modules/@ledgerhq/hw-transport": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.49.0.tgz", + "integrity": "sha512-mfQNSxZ3cTXo+l6SEM+D92YaW46GkP1IiWo9OkHPnsq8y8IxSD6QJOEiAAZtvpGvV1eRqqrVyanoFRTuHcZjZA==", + "dependencies": { + "@ledgerhq/devices": "^5.49.0", + "@ledgerhq/errors": "^5.49.0", + "events": "^3.3.0" + } + }, + "node_modules/@ledgerhq/hw-transport-http/node_modules/@ledgerhq/logs": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.49.0.tgz", + "integrity": "sha512-Ynl2JzRwh8l9PoXrDNihXEicpVo6Ra2lYZoqSYfVH/v/2/TSa/JB9Qll8P85XFYkS3ouDTTbp1S5KViaTkqD5g==" + }, + "node_modules/@ledgerhq/hw-transport-http/node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/@ledgerhq/hw-transport-http/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/@ledgerhq/hw-transport-http/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@ledgerhq/hw-transport-http/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ledgerhq/hw-transport-u2f": { + "version": "5.36.0-deprecated", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.36.0-deprecated.tgz", + "integrity": "sha512-T/+mGHIiUK/ZQATad6DMDmobCMZ1mVST952009jKzhaE1Et2Uy2secU+QhRkx3BfEAkvwa0zSRSYCL9d20Iqjg==", + "dependencies": { + "@ledgerhq/errors": "^5.34.0", + "@ledgerhq/hw-transport": "^5.34.0", + "@ledgerhq/logs": "^5.30.0", + "u2f-api": "0.2.7" + } + }, + "node_modules/@ledgerhq/hw-transport/node_modules/events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/@ledgerhq/logs": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.43.0.tgz", + "integrity": "sha512-QWfQjea3ekh9ZU+JeL2tJC9cTKLZ/JrcS0JGatLejpRYxQajvnHvHfh0dbHOKXEaXfCskEPTZ3f1kzuts742GA==" + }, + "node_modules/accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "dependencies": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + }, + "node_modules/acorn-node": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", + "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", + "dependencies": { + "acorn": "^6.0.2", + "acorn-dynamic-import": "^4.0.0", + "acorn-walk": "^6.1.0", + "xtend": "^4.0.1" + } + }, + "node_modules/acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + }, + "node_modules/after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "node_modules/array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dependencies": { + "util": "0.10.3" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "node_modules/async-done": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", + "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^1.0.7", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-done/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "node_modules/async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/axios": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", + "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=", + "dev": true, + "dependencies": { + "follow-redirects": "^1.2.5", + "is-buffer": "^1.1.5" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-core/node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/babel-core/node_modules/convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/babel-core/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-core/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "node_modules/babel-generator/node_modules/jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "dependencies": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "dependencies": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "dependencies": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "dependencies": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "dependencies": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "dependencies": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.10.0" + } + }, + "node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "dependencies": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "node_modules/babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "dependencies": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-template/node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse/node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/babel-traverse/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babelify": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz", + "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw==" + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "node_modules/base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "dependencies": { + "callsite": "1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + }, + "node_modules/browser-sync": { + "version": "2.26.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.3.tgz", + "integrity": "sha512-VLzpjCA4uXqfzkwqWtMM6hvPm2PNHp2RcmzBXcbi6C9WpkUhhFb8SVAr4CFrCsFxDg+oY6HalOjn8F+egyvhag==", + "dev": true, + "dependencies": { + "browser-sync-client": "^2.26.2", + "browser-sync-ui": "^2.26.2", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^2.0.4", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "1.15.2", + "immutable": "^3", + "localtunnel": "1.9.1", + "micromatch": "2.3.11", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.1.1", + "ua-parser-js": "0.7.17", + "yargs": "6.4.0" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.2.tgz", + "integrity": "sha512-FEuVJD41fI24HJ30XOT2RyF5WcnEtdJhhTqeyDlnMk/8Ox9MZw109rvk9pdfRWye4soZLe+xcAo9tHSMxvgAdw==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/browser-sync-client/node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.2.tgz", + "integrity": "sha512-LF7GMWo8ELOE0eAlxuRCfnGQT1ZxKP9flCfGgZdXFc6BwmoqaJHlYe7MmVvykKkXjolRXTz8ztXAKGVqNwJ3EQ==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.0.4", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/browser-sync/node_modules/anymatch/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/chokidar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", + "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/browser-sync/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/browser-sync/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/browser-sync/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/browser-sync/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/browser-sync/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dependencies": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dependencies": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserify/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "node_modules/bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map/node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "node_modules/component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "dependencies": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "node_modules/core-js": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.9" + } + }, + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "dependencies": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/detective/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "dependencies": { + "tfunk": "^3.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + } + }, + "node_modules/engine.io-client": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz", + "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==", + "dev": true, + "dependencies": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "dependencies": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/engine.io/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.48", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.48.tgz", + "integrity": "sha512-CdRvPlX/24Mj5L4NVxTs4804sxiS2CjVprgCmrgoDkdmjdY4D+ySHa7K3jJf8R40dFg0tIm3z/dk326LrnuSGw==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ethers": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.4.4.tgz", + "integrity": "sha512-zaTs8yaDjfb0Zyj8tT6a+/hEkC+kWAA350MWRp6yP5W7NdGcURRPMOpOU+6GtkfxV9wyJEShWesqhE/TjdqpMA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.4.0", + "@ethersproject/abstract-provider": "5.4.1", + "@ethersproject/abstract-signer": "5.4.1", + "@ethersproject/address": "5.4.0", + "@ethersproject/base64": "5.4.0", + "@ethersproject/basex": "5.4.0", + "@ethersproject/bignumber": "5.4.1", + "@ethersproject/bytes": "5.4.0", + "@ethersproject/constants": "5.4.0", + "@ethersproject/contracts": "5.4.1", + "@ethersproject/hash": "5.4.0", + "@ethersproject/hdnode": "5.4.0", + "@ethersproject/json-wallets": "5.4.0", + "@ethersproject/keccak256": "5.4.0", + "@ethersproject/logger": "5.4.0", + "@ethersproject/networks": "5.4.2", + "@ethersproject/pbkdf2": "5.4.0", + "@ethersproject/properties": "5.4.0", + "@ethersproject/providers": "5.4.3", + "@ethersproject/random": "5.4.0", + "@ethersproject/rlp": "5.4.0", + "@ethersproject/sha2": "5.4.0", + "@ethersproject/signing-key": "5.4.0", + "@ethersproject/solidity": "5.4.0", + "@ethersproject/strings": "5.4.0", + "@ethersproject/transactions": "5.4.0", + "@ethersproject/units": "5.4.0", + "@ethersproject/wallet": "5.4.0", + "@ethersproject/web": "5.4.0", + "@ethersproject/wordlists": "5.4.0" + } + }, + "node_modules/eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "node_modules/events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", + "integrity": "sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=", + "dev": true + }, + "node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/fined": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", + "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/fsevents/node_modules/abbrev": { + "version": "1.1.1", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/aproba": { + "version": "1.2.0", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/are-we-there-yet": { + "version": "1.1.5", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/fsevents/node_modules/balanced-match": { + "version": "1.0.0", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/brace-expansion": { + "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fsevents/node_modules/chownr": { + "version": "1.1.1", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/code-point-at": { + "version": "1.1.0", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/console-control-strings": { + "version": "1.1.0", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/core-util-is": { + "version": "1.0.2", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/debug": { + "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/fsevents/node_modules/deep-extend": { + "version": "0.6.0", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fsevents/node_modules/delegates": { + "version": "1.0.0", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/detect-libc": { + "version": "1.0.3", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/fsevents/node_modules/fs-minipass": { + "version": "1.2.5", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "optional": true, + "dependencies": { + "minipass": "^2.2.1" + } + }, + "node_modules/fsevents/node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/gauge": { + "version": "2.7.4", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/fsevents/node_modules/glob": { + "version": "7.1.3", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/has-unicode": { + "version": "2.0.1", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/iconv-lite": { + "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/ignore-walk": { + "version": "3.0.1", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "optional": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fsevents/node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/inherits": { + "version": "2.0.3", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/ini": { + "version": "1.3.5", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/isarray": { + "version": "1.0.0", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/minimatch": { + "version": "3.0.4", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/minimist": { + "version": "0.0.8", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/minipass": { + "version": "2.3.5", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/fsevents/node_modules/minizlib": { + "version": "1.2.1", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "optional": true, + "dependencies": { + "minipass": "^2.2.1" + } + }, + "node_modules/fsevents/node_modules/mkdirp": { + "version": "0.5.1", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fsevents/node_modules/ms": { + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/needle": { + "version": "2.2.4", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/fsevents/node_modules/node-pre-gyp": { + "version": "0.10.3", + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/fsevents/node_modules/nopt": { + "version": "4.0.1", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/fsevents/node_modules/npm-bundled": { + "version": "1.0.5", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/npm-packlist": { + "version": "1.2.0", + "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", + "dev": true, + "optional": true, + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "node_modules/fsevents/node_modules/npmlog": { + "version": "4.1.2", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/fsevents/node_modules/number-is-nan": { + "version": "1.0.1", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/object-assign": { + "version": "4.1.1", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/once": { + "version": "1.4.0", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/os-homedir": { + "version": "1.0.2", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/os-tmpdir": { + "version": "1.0.2", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/osenv": { + "version": "0.1.5", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/fsevents/node_modules/path-is-absolute": { + "version": "1.0.1", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/process-nextick-args": { + "version": "2.0.0", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/rc": { + "version": "1.2.8", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/fsevents/node_modules/rc/node_modules/minimist": { + "version": "1.2.0", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/readable-stream": { + "version": "2.3.6", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fsevents/node_modules/rimraf": { + "version": "2.6.3", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/fsevents/node_modules/safe-buffer": { + "version": "5.1.2", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/safer-buffer": { + "version": "2.1.2", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/sax": { + "version": "1.2.4", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/semver": { + "version": "5.6.0", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fsevents/node_modules/set-blocking": { + "version": "2.0.0", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/signal-exit": { + "version": "3.0.2", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/string_decoder": { + "version": "1.1.1", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fsevents/node_modules/string-width": { + "version": "1.0.2", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-ansi": { + "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-json-comments": { + "version": "2.0.1", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/tar": { + "version": "4.4.8", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/fsevents/node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/wide-align": { + "version": "1.1.3", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/fsevents/node_modules/wrappy": { + "version": "1.0.2", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/yallist": { + "version": "3.0.3", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true, + "optional": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-watcher/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/glob-watcher/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/chokidar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", + "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/glob-watcher/node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "node_modules/gulp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz", + "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=", + "dev": true, + "dependencies": { + "glob-watcher": "^5.0.0", + "gulp-cli": "^2.0.0", + "undertaker": "^1.0.0", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp/node_modules/gulp-cli": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz", + "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^2.5.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "node_modules/gulp/node_modules/yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "dependencies": { + "isarray": "2.0.1" + } + }, + "node_modules/has-binary2/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "node_modules/has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "dev": true, + "dependencies": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + }, + "node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "node_modules/json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", + "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", + "dependencies": { + "inherits": "^2.0.1", + "isarray": "^2.0.4", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/labeled-stream-splicer/node_modules/isarray": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", + "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==" + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/limiter": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz", + "integrity": "sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/localtunnel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.1.tgz", + "integrity": "sha512-HWrhOslklDvxgOGFLxi6fQVnvpl6XdX4sPscfqMZkzi3gtt9V7LKBWYvNUcpHSVvjwCQ6xzXacVvICNbNcyPnQ==", + "dev": true, + "dependencies": { + "axios": "0.17.1", + "debug": "2.6.9", + "openurl": "1.1.1", + "yargs": "6.6.0" + }, + "bin": { + "lt": "bin/client" + } + }, + "node_modules/localtunnel/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/localtunnel/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/localtunnel/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/localtunnel/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/localtunnel/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/localtunnel/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "node_modules/lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-iterator/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, + "dependencies": { + "mime-db": "~1.38.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "node_modules/mitt": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.3.tgz", + "integrity": "sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-deps": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", + "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", + "dependencies": { + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", + "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults/node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map/node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce/node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.9.tgz", + "integrity": "sha512-tPjtE6dq+dOSg8NMkqRmFjUYH9fect1zmYgB0g6ztQMaVNI7N1CEvLZud2bPHhg7PRgfKEeTshSPiqXb1F7A+A==" + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dependencies": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "dependencies": { + "better-assert": "~1.0.0" + } + }, + "node_modules/parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "dependencies": { + "better-assert": "~1.0.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "dependencies": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "dependencies": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "node_modules/regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "node_modules/rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dependencies": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "node_modules/shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dependencies": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "node_modules/simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "dependencies": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "node_modules/socket.io-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", + "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", + "dev": true, + "dependencies": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.3.1", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "dependencies": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/socket.io/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/socket.io/node_modules/engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "dependencies": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "node_modules/socket.io/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/socket.io/node_modules/socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "dependencies": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + } + }, + "node_modules/socket.io/node_modules/socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "dependencies": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/source": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/source/-/source-0.0.3.tgz", + "integrity": "sha1-BA8AoKPiY4FHwB0/KLf+sSbS6uk=", + "dev": true, + "dependencies": { + "findit": ">=0.0.2" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "dependencies": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "node_modules/stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/subarg/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "dev": true, + "dependencies": { + "chalk": "^1.1.1", + "object-path": "^0.9.0" + } + }, + "node_modules/tfunk/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/u2f-api": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/u2f-api/-/u2f-api-0.2.7.tgz", + "integrity": "sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg==" + }, + "node_modules/ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, + "node_modules/undertaker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.0.tgz", + "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8flags": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", + "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-source-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz", + "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=", + "dev": true, + "dependencies": { + "through2": "^2.0.3", + "vinyl": "^2.1.0" + } + }, + "node_modules/vinyl-source-stream/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/vinyl-source-stream/node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/vinyl-source-stream/node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-source-stream/node_modules/vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.1.0" + } + }, + "node_modules/yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + }, "dependencies": { + "@ethersproject/abi": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.4.0.tgz", + "integrity": "sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==", + "requires": { + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/hash": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz", + "integrity": "sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ==", + "requires": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/networks": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/web": "^5.4.0" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz", + "integrity": "sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA==", + "requires": { + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0" + } + }, + "@ethersproject/address": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz", + "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==", + "requires": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/rlp": "^5.4.0" + } + }, + "@ethersproject/base64": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz", + "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==", + "requires": { + "@ethersproject/bytes": "^5.4.0" + } + }, + "@ethersproject/basex": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.4.0.tgz", + "integrity": "sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/properties": "^5.4.0" + } + }, + "@ethersproject/bignumber": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.1.tgz", + "integrity": "sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "bn.js": "^4.11.9" + } + }, + "@ethersproject/bytes": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz", + "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==", + "requires": { + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/constants": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz", + "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==", + "requires": { + "@ethersproject/bignumber": "^5.4.0" + } + }, + "@ethersproject/contracts": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.4.1.tgz", + "integrity": "sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w==", + "requires": { + "@ethersproject/abi": "^5.4.0", + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/transactions": "^5.4.0" + } + }, + "@ethersproject/hash": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz", + "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==", + "requires": { + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.4.0.tgz", + "integrity": "sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==", + "requires": { + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/basex": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/pbkdf2": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/sha2": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0", + "@ethersproject/strings": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/wordlists": "^5.4.0" + } + }, + "@ethersproject/json-wallets": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz", + "integrity": "sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==", + "requires": { + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/hdnode": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/pbkdf2": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/random": "^5.4.0", + "@ethersproject/strings": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "@ethersproject/keccak256": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz", + "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "js-sha3": "0.5.7" + } + }, + "@ethersproject/logger": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz", + "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==" + }, + "@ethersproject/networks": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.2.tgz", + "integrity": "sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw==", + "requires": { + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/pbkdf2": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz", + "integrity": "sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/sha2": "^5.4.0" + } + }, + "@ethersproject/properties": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz", + "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==", + "requires": { + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/providers": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.4.3.tgz", + "integrity": "sha512-VURwkaWPoUj7jq9NheNDT5Iyy64Qcyf6BOFDwVdHsmLmX/5prNjFrgSX3GHPE4z1BRrVerDxe2yayvXKFm/NNg==", + "requires": { + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/basex": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/hash": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/networks": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/random": "^5.4.0", + "@ethersproject/rlp": "^5.4.0", + "@ethersproject/sha2": "^5.4.0", + "@ethersproject/strings": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/web": "^5.4.0", + "bech32": "1.1.4", + "ws": "7.4.6" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} + } + } + }, + "@ethersproject/random": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.4.0.tgz", + "integrity": "sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/rlp": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz", + "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/sha2": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.4.0.tgz", + "integrity": "sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "hash.js": "1.1.7" + } + }, + "@ethersproject/signing-key": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz", + "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "@ethersproject/solidity": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.4.0.tgz", + "integrity": "sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==", + "requires": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/sha2": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "@ethersproject/strings": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz", + "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/transactions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz", + "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==", + "requires": { + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/rlp": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0" + } + }, + "@ethersproject/units": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.4.0.tgz", + "integrity": "sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==", + "requires": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/wallet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.4.0.tgz", + "integrity": "sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==", + "requires": { + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/hash": "^5.4.0", + "@ethersproject/hdnode": "^5.4.0", + "@ethersproject/json-wallets": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/random": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/wordlists": "^5.4.0" + } + }, + "@ethersproject/web": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz", + "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==", + "requires": { + "@ethersproject/base64": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "@ethersproject/wordlists": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.4.0.tgz", + "integrity": "sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/hash": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, "@ledgerhq/cryptoassets": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-5.45.0.tgz", - "integrity": "sha512-9whshwJscKjey5Ynnd2Q/9guzfSsFB6BftN2dlpDfDv30tnJtHZhWbdUNdpTVGs9I/7F88lDwBzaj7KecE1LPg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-6.5.0.tgz", + "integrity": "sha512-HBmcfb9WTlcsqlzlHfd7nZr49on7ftpWmKXvxZu9DinLS7EZ5ZjgSvmxrx39YCS5yONILBJoA/BSpg1RcCbSjQ==", "requires": { "invariant": "2" } @@ -39,55 +11378,67 @@ "integrity": "sha512-ZjKlUQbIn/DHXAefW3Y1VyDrlVhVqqGnXzrqbOXuDbZ2OAIfSe/A1mrlCbWt98jP/8EJQBuCzBOtnmpXIL/nYg==" }, "@ledgerhq/hw-app-eth": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-5.45.0.tgz", - "integrity": "sha512-19o1P5bEXd8fPvEuYqWihDIuGNBSOFs+FwtA76xbuC1djnwj+MLyDi95i3kAyPOASoYnx/YzfRmRzewb4F4gNA==", - "requires": { - "@ledgerhq/cryptoassets": "^5.45.0", - "@ledgerhq/errors": "^5.43.0", - "@ledgerhq/hw-transport": "^5.45.0", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-6.5.0.tgz", + "integrity": "sha512-2M43aXxVX3xPwmluG/7zXRljSWSMdifi19V2JR5ezjBhpNg+fgrg6cYOkl7nhyrelsCCaRhWmn3+KCNrkFYLOQ==", + "requires": { + "@ledgerhq/cryptoassets": "^6.5.0", + "@ledgerhq/errors": "^6.2.0", + "@ledgerhq/hw-transport": "^6.3.0", + "@ledgerhq/logs": "^6.2.0", + "axios": "^0.21.1", "bignumber.js": "^9.0.1", - "rlp": "^2.2.6" + "ethers": "^5.4.4" }, "dependencies": { "@ledgerhq/devices": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.45.0.tgz", - "integrity": "sha512-wAtm4kvQ8pAdqdIpDa/OqU9rhtqI0sTdwDGGp4vthHiWNdBwqwPFcKmEki+mUgPCfRqn3SifyqaPqvFpvu+oWw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-6.3.0.tgz", + "integrity": "sha512-DmVxqMAf3FhkpKjkbBCFVJ5DmesfplujeCLzFwO/zF5VGuwY7xxPqeSxlpusXJkqhEq+DbFzIDRWJYDf7rtXqg==", "requires": { - "@ledgerhq/errors": "^5.43.0", - "@ledgerhq/logs": "^5.43.0", - "rxjs": "^6.6.6", - "semver": "^7.3.4" + "@ledgerhq/errors": "^6.2.0", + "@ledgerhq/logs": "^6.2.0", + "rxjs": "6", + "semver": "^7.3.5" } }, + "@ledgerhq/errors": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.2.0.tgz", + "integrity": "sha512-eO03x8HJmG60WtlrMuahigW/rwywFdcGzCnihta/MjkM8BD9A660cKVkyIuheCcpaB7UV/r+QsRl9abHbjjaag==" + }, "@ledgerhq/hw-transport": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.45.0.tgz", - "integrity": "sha512-YDkPQ2u5BJaMk2rJ8jcSucCv1JRUhmlaWUOvZ+Q7I8VNnvBM+N5yc9nqRX8TuHRlbPyiFm8xjEkPktVejuTAvQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.3.0.tgz", + "integrity": "sha512-kdnVrgmxrFtKaRdkoaQBEa02RXgLzEBiooYbxA65BGSJig3PGWDS9LrqNpzLTZM1RQlivd9NLBmfwU2ze4chWA==", "requires": { - "@ledgerhq/devices": "^5.45.0", - "@ledgerhq/errors": "^5.43.0", + "@ledgerhq/devices": "^6.3.0", + "@ledgerhq/errors": "^6.2.0", "events": "^3.3.0" } }, + "@ledgerhq/logs": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.2.0.tgz", + "integrity": "sha512-SLyFyD7ElMhgKWPYedFGCT/ilcbGPgL5hXXYHxOM79Fs5fWi0zaUpt5oGqGMsOAAFaMa9/rbun0pokzPhEFz8A==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, - "rxjs": { - "version": "6.6.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz", - "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==", - "requires": { - "tslib": "^1.9.0" - } - }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } @@ -167,11 +11518,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, - "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" - }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -206,15 +11552,6 @@ "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.43.0.tgz", "integrity": "sha512-QWfQjea3ekh9ZU+JeL2tJC9cTKLZ/JrcS0JGatLejpRYxQajvnHvHfh0dbHOKXEaXfCskEPTZ3f1kzuts742GA==" }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -251,6 +11588,11 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -1301,6 +12643,11 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1328,9 +12675,9 @@ "dev": true }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "brace-expansion": { "version": "1.1.11", @@ -1351,9 +12698,9 @@ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", "requires": { - "JSONStream": "^1.0.3", "combine-source-map": "~0.8.0", "defined": "^1.0.0", + "JSONStream": "^1.0.3", "safe-buffer": "^5.1.1", "through2": "^2.0.0", "umd": "^3.0.0" @@ -1848,7 +13195,6 @@ "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", "requires": { - "JSONStream": "^1.0.3", "assert": "^1.4.0", "browser-pack": "^6.0.1", "browser-resolve": "^1.11.0", @@ -1870,6 +13216,7 @@ "https-browserify": "^1.0.0", "inherits": "~2.0.1", "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", "labeled-stream-splicer": "^2.0.0", "mkdirp": "^0.5.0", "module-deps": "^6.0.0", @@ -2426,15 +13773,6 @@ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -2677,17 +14015,24 @@ "dev": true }, "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } } }, "encodeurl": { @@ -2873,6 +14218,43 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "ethers": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.4.4.tgz", + "integrity": "sha512-zaTs8yaDjfb0Zyj8tT6a+/hEkC+kWAA350MWRp6yP5W7NdGcURRPMOpOU+6GtkfxV9wyJEShWesqhE/TjdqpMA==", + "requires": { + "@ethersproject/abi": "5.4.0", + "@ethersproject/abstract-provider": "5.4.1", + "@ethersproject/abstract-signer": "5.4.1", + "@ethersproject/address": "5.4.0", + "@ethersproject/base64": "5.4.0", + "@ethersproject/basex": "5.4.0", + "@ethersproject/bignumber": "5.4.1", + "@ethersproject/bytes": "5.4.0", + "@ethersproject/constants": "5.4.0", + "@ethersproject/contracts": "5.4.1", + "@ethersproject/hash": "5.4.0", + "@ethersproject/hdnode": "5.4.0", + "@ethersproject/json-wallets": "5.4.0", + "@ethersproject/keccak256": "5.4.0", + "@ethersproject/logger": "5.4.0", + "@ethersproject/networks": "5.4.2", + "@ethersproject/pbkdf2": "5.4.0", + "@ethersproject/properties": "5.4.0", + "@ethersproject/providers": "5.4.3", + "@ethersproject/random": "5.4.0", + "@ethersproject/rlp": "5.4.0", + "@ethersproject/sha2": "5.4.0", + "@ethersproject/signing-key": "5.4.0", + "@ethersproject/solidity": "5.4.0", + "@ethersproject/strings": "5.4.0", + "@ethersproject/transactions": "5.4.0", + "@ethersproject/units": "5.4.0", + "@ethersproject/wallet": "5.4.0", + "@ethersproject/web": "5.4.0", + "@ethersproject/wordlists": "5.4.0" + } + }, "eventemitter3": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", @@ -3383,13 +14765,9 @@ } }, "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", - "dev": true, - "requires": { - "debug": "^3.2.6" - } + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" }, "for-in": { "version": "1.0.2", @@ -3449,28 +14827,24 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -3481,14 +14855,12 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -3499,42 +14871,36 @@ }, "chownr": { "version": "1.1.1", - "resolved": false, "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "2.6.9", - "resolved": false, "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "optional": true, @@ -3544,28 +14910,24 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", - "resolved": false, "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "optional": true, @@ -3575,14 +14937,12 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -3599,7 +14959,6 @@ }, "glob": { "version": "7.1.3", - "resolved": false, "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "optional": true, @@ -3614,14 +14973,12 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -3631,7 +14988,6 @@ }, "ignore-walk": { "version": "3.0.1", - "resolved": false, "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "optional": true, @@ -3641,7 +14997,6 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -3652,21 +15007,18 @@ }, "inherits": { "version": "2.0.3", - "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -3676,14 +15028,12 @@ }, "isarray": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -3693,14 +15043,12 @@ }, "minimist": { "version": "0.0.8", - "resolved": false, "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true, "optional": true }, "minipass": { "version": "2.3.5", - "resolved": false, "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, "optional": true, @@ -3711,7 +15059,6 @@ }, "minizlib": { "version": "1.2.1", - "resolved": false, "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "optional": true, @@ -3721,7 +15068,6 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": false, "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "optional": true, @@ -3731,14 +15077,12 @@ }, "ms": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true, "optional": true }, "needle": { "version": "2.2.4", - "resolved": false, "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", "dev": true, "optional": true, @@ -3750,7 +15094,6 @@ }, "node-pre-gyp": { "version": "0.10.3", - "resolved": false, "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", "dev": true, "optional": true, @@ -3769,7 +15112,6 @@ }, "nopt": { "version": "4.0.1", - "resolved": false, "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, @@ -3780,14 +15122,12 @@ }, "npm-bundled": { "version": "1.0.5", - "resolved": false, "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.2.0", - "resolved": false, "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", "dev": true, "optional": true, @@ -3798,7 +15138,6 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -3811,21 +15150,18 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -3835,21 +15171,18 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -3860,21 +15193,18 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", - "resolved": false, "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -3887,7 +15217,6 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true @@ -3896,7 +15225,6 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": false, "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "optional": true, @@ -3912,7 +15240,6 @@ }, "rimraf": { "version": "2.6.3", - "resolved": false, "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "optional": true, @@ -3922,49 +15249,51 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.6.0", - "resolved": false, "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, + "string_decoder": { + "version": "1.1.1", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -3974,19 +15303,8 @@ "strip-ansi": "^3.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -3996,14 +15314,12 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.8", - "resolved": false, "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "optional": true, @@ -4019,14 +15335,12 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -4036,14 +15350,12 @@ }, "wrappy": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.0.3", - "resolved": false, "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true, "optional": true @@ -4909,11 +16221,11 @@ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", "requires": { - "JSONStream": "^1.0.3", "acorn-node": "^1.5.2", "combine-source-map": "^0.8.0", "concat-stream": "^1.6.1", "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", "path-is-absolute": "^1.0.1", "process": "~0.11.0", "through2": "^2.0.0", @@ -5177,6 +16489,11 @@ "isarray": "1.0.0" } }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -5212,6 +16529,15 @@ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "just-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", @@ -5912,7 +17238,6 @@ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", "requires": { - "JSONStream": "^1.0.3", "browser-resolve": "^1.7.0", "cached-path-relative": "^1.0.0", "concat-stream": "~1.6.0", @@ -5920,6 +17245,7 @@ "detective": "^5.0.2", "duplexer2": "^0.1.2", "inherits": "^2.0.1", + "JSONStream": "^1.0.3", "parents": "^1.0.0", "readable-stream": "^2.0.2", "resolve": "^1.4.0", @@ -5929,12 +17255,6 @@ "xtend": "^4.0.0" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -7225,14 +18545,6 @@ "inherits": "^2.0.1" } }, - "rlp": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", - "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", - "requires": { - "bn.js": "^4.11.1" - } - }, "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", @@ -7267,6 +18579,11 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", @@ -7936,6 +19253,14 @@ "limiter": "^1.0.5" } }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -7947,14 +19272,6 @@ "strip-ansi": "^3.0.0" } }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", diff --git a/package.json b/package.json index de2499aa..886a7f12 100644 --- a/package.json +++ b/package.json @@ -12,20 +12,23 @@ "license": "BSD-2-Clause", "devDependencies": { "babel-core": "^6.26.3", - "babel-register": "^6.26.0", "babel-preset-es2015": "^6.24.1", + "babel-register": "^6.26.0", "browser-sync": "^2.26.3", "gulp": "^4.0.0", "source": "0.0.3", "vinyl-source-stream": "^2.0.0" }, "dependencies": { - "@ledgerhq/hw-app-eth": "^5.45.0", - "@ledgerhq/hw-transport-u2f": "^5.36.0-deprecated", + "@ledgerhq/hw-app-eth": "^6.5.0", "@ledgerhq/hw-transport-http": "^5.45.0", + "@ledgerhq/hw-transport-u2f": "^5.36.0-deprecated", "babel-runtime": "^6.26.0", "babelify": "^8.0.0", "browserify": "^16.2.2", "buffer": "^5.2.0" + }, + "engines": { + "npm": "^7.6.0" } }