text: webpackJsonp([0],{
  
  /***/ 888:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddressPageModule", function() { return AddressPageModule; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_angular2_qrcode__ = __webpack_require__(900);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__components_coin_list_coin_list_module__ = __webpack_require__(902);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__components_error_error_module__ = __webpack_require__(103);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__components_footer_footer_module__ = __webpack_require__(76);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__components_head_nav_head_nav_module__ = __webpack_require__(77);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__components_loader_loader_module__ = __webpack_require__(102);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__components_transaction_list_transaction_list_module__ = __webpack_require__(898);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__directives_copy_to_clipboard_copy_to_clipboard_module__ = __webpack_require__(896);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__address__ = __webpack_require__(521);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  
  
  
  
  
  
  
  
  
  
  
  var AddressPageModule = /** @class */ (function () {
      function AddressPageModule() {
      }
      AddressPageModule = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"])({
              declarations: [__WEBPACK_IMPORTED_MODULE_10__address__["a" /* AddressPage */]],
              imports: [
                  __WEBPACK_IMPORTED_MODULE_2_ionic_angular__["f" /* IonicPageModule */].forChild(__WEBPACK_IMPORTED_MODULE_10__address__["a" /* AddressPage */]),
                  __WEBPACK_IMPORTED_MODULE_3__components_coin_list_coin_list_module__["a" /* CoinListComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_8__components_transaction_list_transaction_list_module__["a" /* TransactionListComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_5__components_footer_footer_module__["a" /* FooterComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_6__components_head_nav_head_nav_module__["a" /* HeadNavComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_1_angular2_qrcode__["a" /* QRCodeModule */],
                  __WEBPACK_IMPORTED_MODULE_7__components_loader_loader_module__["a" /* LoaderComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_4__components_error_error_module__["a" /* ErrorComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_9__directives_copy_to_clipboard_copy_to_clipboard_module__["a" /* CopyToClipboardModule */]
              ],
              exports: [__WEBPACK_IMPORTED_MODULE_10__address__["a" /* AddressPage */]]
          })
      ], AddressPageModule);
      return AddressPageModule;
  }());
  
  //# sourceMappingURL=address.module.js.map
  
  /***/ }),
  
  /***/ 892:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TransactionDetailsEthComponentModule; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__transaction_details_eth__ = __webpack_require__(893);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  
  
  
  var TransactionDetailsEthComponentModule = /** @class */ (function () {
      function TransactionDetailsEthComponentModule() {
      }
      TransactionDetailsEthComponentModule = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"])({
              declarations: [__WEBPACK_IMPORTED_MODULE_2__transaction_details_eth__["a" /* TransactionDetailsEthComponent */]],
              imports: [__WEBPACK_IMPORTED_MODULE_1_ionic_angular__["e" /* IonicModule */]],
              exports: [__WEBPACK_IMPORTED_MODULE_2__transaction_details_eth__["a" /* TransactionDetailsEthComponent */]]
          })
      ], TransactionDetailsEthComponentModule);
      return TransactionDetailsEthComponentModule;
  }());
  
  //# sourceMappingURL=transaction-details-eth.module.js.map
  
  /***/ }),
  
  /***/ 893:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TransactionDetailsEthComponent; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__providers_api_api__ = __webpack_require__(19);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__providers_blocks_blocks__ = __webpack_require__(50);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__providers_currency_currency__ = __webpack_require__(24);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__providers_redir_redir__ = __webpack_require__(55);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__providers_transactions_transactions__ = __webpack_require__(54);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  var __metadata = (this && this.__metadata) || function (k, v) {
      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  };
  
  
  
  
  
  
  /**
   * Generated class for the TransactionDetailsEthComponent component.
   *
   * See https://angular.io/docs/ts/latest/api/core/index/ComponentMetadata-class.html
   * for more info on Angular Components.
   */
  var TransactionDetailsEthComponent = /** @class */ (function () {
      function TransactionDetailsEthComponent(currencyProvider, apiProvider, txProvider, redirProvider, blocksProvider) {
          this.currencyProvider = currencyProvider;
          this.apiProvider = apiProvider;
          this.txProvider = txProvider;
          this.redirProvider = redirProvider;
          this.blocksProvider = blocksProvider;
          this.tx = {};
          this.showCoins = false;
      }
      TransactionDetailsEthComponent.prototype.ngOnInit = function () {
          var _this = this;
          this.txProvider
              .getConfirmations(this.tx.blockheight)
              .subscribe(function (confirmations) {
              _this.tx.confirmations = confirmations;
          });
      };
      TransactionDetailsEthComponent.prototype.goToTx = function (txId, vout, fromVout) {
          this.redirProvider.redir('transaction', {
              txId: txId,
              chain: this.chainNetwork.chain,
              network: this.chainNetwork.network,
              vout: vout,
              fromVout: fromVout
          });
      };
      TransactionDetailsEthComponent.prototype.goToAddress = function (addrStr) {
          this.redirProvider.redir('address', {
              addrStr: addrStr,
              chain: this.chainNetwork.chain,
              network: this.chainNetwork.network
          });
      };
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionDetailsEthComponent.prototype, "tx", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionDetailsEthComponent.prototype, "showCoins", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionDetailsEthComponent.prototype, "chainNetwork", void 0);
      TransactionDetailsEthComponent = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"])({
              selector: 'transaction-details-eth',template:/*ion-inline-start:"/home/enrique/smart/sapi-insight/src/components/transaction-details-eth/transaction-details-eth.html"*/'<ion-grid>\n  <ion-row>\n    <ion-col col-7>\n      <div class="ellipsis">\n        <span>\n          <a (click)="goToTx(tx.txid)">{{ tx.txid }}</a>\n        </span>\n      </div>\n    </ion-col>\n    <ion-col col-5 text-right>\n      <ion-note *ngIf="tx.time">\n        <span translate>mined on</span>\n        <time>{{ tx.time * 1000 | date:\'medium\' }}</time>\n      </ion-note>\n    </ion-col>\n  </ion-row>\n\n  <ion-row align-items-end class="small" *ngIf="!showCoins">\n    <ion-col col-12 text-right text-uppercase>\n      <ion-chip item-end color="danger" *ngIf="tx.confirmations === -3">\n        <ion-label>\n          Invalid\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="warning" *ngIf="tx.confirmations === -1">\n        <ion-label>\n          Unconfirmed\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="primary" *ngIf="tx.confirmations === 1">\n        <ion-label>\n          1 Confirmation\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="primary" *ngIf="tx.confirmations > 1">\n        <ion-label>\n          {{ tx.confirmations }} Confirmations\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="default">\n        <ion-label>\n          {{ currencyProvider.getConvertedNumber(tx.valueOut, chainNetwork.chain) | number:\'1.0-8\' }} {{ currencyProvider.currencySymbol }}\n        </ion-label>\n      </ion-chip>\n    </ion-col>\n  </ion-row>\n\n  <ion-row *ngIf="showCoins" align-items-start>\n    <ion-col col-12 col-md-5>\n\n      <ion-list [hidden]="!tx.isCoinBase">\n        <ion-item>\n          No Inputs (Newly Generated Coins)\n        </ion-item>\n      </ion-list>\n\n      <ion-list [hidden]="tx.isCoinBase">\n        <ion-item *ngIf="tx.from">\n          <div class="ellipsis">\n            <p>\n              <a (click)="goToAddress(tx.from)">{{ tx.from }}</a>\n            </p>\n          </div>\n        </ion-item>\n      </ion-list>\n\n    </ion-col>\n\n    <ion-col col-12 col-md-1 text-center class="arrow-forward">\n      <ion-icon name="arrow-forward"></ion-icon>\n    </ion-col>\n\n    <ion-col col-12 col-md-6>\n      <ion-list>\n        <ion-item *ngIf="tx.to">\n          <div>\n            <div class="ellipsis">\n              <p>\n                <a (click)="goToAddress(tx.to)">{{ tx.to }}</a>\n              </p>\n            </div>\n          </div>\n        </ion-item>\n      </ion-list>\n    </ion-col>\n  </ion-row>\n\n  <ion-row align-items-start text-uppercase class="small" *ngIf="showCoins">\n    <ion-col col-6>\n      <div *ngIf="!tx.isCoinBase && currencyProvider.getConvertedNumber(tx.fee) >= 0">\n        <ion-chip>\n          <ion-label>Fee\n            <span text-nowrap>{{ currencyProvider.getConvertedNumber(tx.fee, chainNetwork.chain) | number:\'1.0-8\' }}\n              {{ currencyProvider.currencySymbol }}</span>\n          </ion-label>\n        </ion-chip>\n      </div>\n    </ion-col>\n    <ion-col col-6 text-right>\n      <ion-chip color="danger" *ngIf="tx.confirmations === -3">\n        <ion-label>Invalid</ion-label>\n      </ion-chip>\n      <ion-chip color="warning" *ngIf="tx.confirmations === -1">\n        <ion-label>Unconfirmed</ion-label>\n      </ion-chip>\n      <ion-chip color="primary" *ngIf="tx.confirmations === 1">\n        <ion-label>1 Confirmation</ion-label>\n      </ion-chip>\n      <ion-chip color="primary" *ngIf="tx.confirmations > 1">\n        <ion-label>{{ tx.confirmations }} Confirmations\n        </ion-label>\n      </ion-chip>\n      <ion-chip color="default">\n        <ion-label>{{ currencyProvider.getConvertedNumber(tx.valueOut, chainNetwork.chain) | number:\'1.0-8\' }}\n          {{ currencyProvider.currencySymbol }}\n        </ion-label>\n      </ion-chip>\n    </ion-col>\n  </ion-row>\n</ion-grid>'/*ion-inline-end:"/home/enrique/smart/sapi-insight/src/components/transaction-details-eth/transaction-details-eth.html"*/
          }),
          __metadata("design:paramtypes", [__WEBPACK_IMPORTED_MODULE_3__providers_currency_currency__["a" /* CurrencyProvider */],
              __WEBPACK_IMPORTED_MODULE_1__providers_api_api__["a" /* ApiProvider */],
              __WEBPACK_IMPORTED_MODULE_5__providers_transactions_transactions__["a" /* TxsProvider */],
              __WEBPACK_IMPORTED_MODULE_4__providers_redir_redir__["a" /* RedirProvider */],
              __WEBPACK_IMPORTED_MODULE_2__providers_blocks_blocks__["a" /* BlocksProvider */]])
      ], TransactionDetailsEthComponent);
      return TransactionDetailsEthComponent;
  }());
  
  //# sourceMappingURL=transaction-details-eth.js.map
  
  /***/ }),
  
  /***/ 894:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TransactionDetailsComponentModule; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__transaction_details__ = __webpack_require__(895);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  
  
  
  var TransactionDetailsComponentModule = /** @class */ (function () {
      function TransactionDetailsComponentModule() {
      }
      TransactionDetailsComponentModule = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"])({
              declarations: [__WEBPACK_IMPORTED_MODULE_2__transaction_details__["a" /* TransactionDetailsComponent */]],
              imports: [__WEBPACK_IMPORTED_MODULE_1_ionic_angular__["e" /* IonicModule */]],
              exports: [__WEBPACK_IMPORTED_MODULE_2__transaction_details__["a" /* TransactionDetailsComponent */]]
          })
      ], TransactionDetailsComponentModule);
      return TransactionDetailsComponentModule;
  }());
  
  //# sourceMappingURL=transaction-details.module.js.map
  
  /***/ }),
  
  /***/ 895:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TransactionDetailsComponent; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__providers_api_api__ = __webpack_require__(19);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__providers_blocks_blocks__ = __webpack_require__(50);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__providers_currency_currency__ = __webpack_require__(24);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__providers_redir_redir__ = __webpack_require__(55);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__providers_transactions_transactions__ = __webpack_require__(54);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  var __metadata = (this && this.__metadata) || function (k, v) {
      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  };
  
  
  
  
  
  
  
  /**
   * Generated class for the TransactionDetailsComponent component.
   *
   * See https://angular.io/docs/ts/latest/api/core/index/ComponentMetadata-class.html
   * for more info on Angular Components.
   */
  var TransactionDetailsComponent = /** @class */ (function () {
      function TransactionDetailsComponent(currencyProvider, apiProvider, txProvider, redirProvider, blocksProvider, nav, navParams) {
          this.currencyProvider = currencyProvider;
          this.apiProvider = apiProvider;
          this.txProvider = txProvider;
          this.redirProvider = redirProvider;
          this.blocksProvider = blocksProvider;
          this.nav = nav;
          this.navParams = navParams;
          this.expanded = false;
          this.showCoins = true;
          this.COIN = 100000000;
          this.DEFAULT_RBF_SEQNUMBER = 0xffffffff;
      }
      TransactionDetailsComponent.prototype.ngOnInit = function () {
          // this.getConfirmations();    
      };
      TransactionDetailsComponent.prototype.getCoins = function () {
          // this.txProvider
          //   .getCoins(this.tx.txid, this.chainNetwork)
          //   .subscribe(data => {
          //       console.log('getCoins', data);
          //     this.tx.vin = data.inputs;
          //     this.tx.vout = data.outputs;
          //     this.tx.fee = this.txProvider.getFee(this.tx);
          //     this.tx.isRBF = _.some(data.inputs, input => {
          //       return (
          //         input.sequenceNumber &&
          //         input.sequenceNumber < this.DEFAULT_RBF_SEQNUMBER - 1
          //       );
          //     });
          //     this.tx.hasUnconfirmedInputs = _.some(data.inputs, input => {
          //       return input.mintHeight < 0;
          //     });
          //     this.tx.valueOut = data.outputs.reduce((a, b) => a + b.value, 0);
          //   });
      };
      TransactionDetailsComponent.prototype.getAddress = function (v) {
          if (v.address === '') {
              return 'Unparsed address';
          }
          return v.address;
      };
      // public getConfirmations() {
      //   this.txProvider
      //     .getConfirmations(this.tx.blockHeight)
      //     .subscribe(confirmations => {
      //       this.confirmations = confirmations;
      //     });
      // }
      TransactionDetailsComponent.prototype.goToTx = function (txId, vout, fromVout) {
          this.redirProvider.redir('transaction', {
              txId: txId,
              vout: vout,
              fromVout: fromVout,
              prevPage: 'transaction-details'
          });
      };
      TransactionDetailsComponent.prototype.goToAddress = function (addrStr) {
          this.redirProvider.redir('address', {
              addrStr: addrStr
          });
      };
      TransactionDetailsComponent.prototype.toggleExpanded = function () {
          this.expanded = !this.expanded;
      };
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionDetailsComponent.prototype, "tx", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionDetailsComponent.prototype, "showCoins", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionDetailsComponent.prototype, "chainNetwork", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", String)
      ], TransactionDetailsComponent.prototype, "page", void 0);
      TransactionDetailsComponent = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"])({
              selector: 'transaction-details',template:/*ion-inline-start:"/home/enrique/smart/sapi-insight/src/components/transaction-details/transaction-details.html"*/'<ion-grid>\n  <ion-row>\n    <ion-col col-7>\n      <div class="ellipsis">\n        <span *ngIf="showCoins">\n          <ion-icon name="add-circle" [hidden]="expanded" (click)="toggleExpanded()"></ion-icon>\n          <ion-icon name="remove-circle" [hidden]="!expanded" (click)="toggleExpanded()"></ion-icon>\n        </span>\n        <span>\n          <a (click)="goToTx(tx.txid)">{{ tx.txid }}</a>\n        </span>\n      </div>\n    </ion-col>\n    <ion-col col-5 text-right>\n      <ion-note *ngIf="tx.blockTime">\n        <span translate>mined on</span>\n        <time>{{ tx.blockTime * 1000 | date:\'medium\' }}</time>\n      </ion-note>\n    </ion-col>\n  </ion-row>\n\n  <ion-row align-items-end class="small" *ngIf="!showCoins">\n    <ion-col col-12 text-right text-uppercase>\n      <ion-chip item-end color="danger" *ngIf="tx.confirmations === -3">\n        <ion-label>\n          Invalid\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="warning" *ngIf="tx.confirmations === -1">\n        <ion-label>\n          Unconfirmed\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="primary" *ngIf="tx.confirmations === 1">\n        <ion-label>\n          1 Confirmation\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="primary" *ngIf="tx.confirmations > 1">\n        <ion-label>\n          {{ tx.confirmations }} Confirmations\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="default">\n        <ion-label>\n          <!-- {{ currencyProvider.getConvertedNumber(tx.valueOut, chainNetwork.chain) | number:\'1.0-8\' }} {{ currencyProvider.currencySymbol }} -->\n        </ion-label>\n      </ion-chip>\n    </ion-col>\n  </ion-row>\n\n  <ion-row *ngIf="showCoins" align-items-start>\n    <ion-col col-12 col-md-5>\n      <ion-list [hidden]="!tx.coinbase">\n        <ion-item>\n          No Inputs (Newly Generated Coins)\n        </ion-item>\n      </ion-list>\n\n      <ion-list [hidden]="tx.coinbase">\n        <ion-item *ngFor="let vin of tx.coins.inputs; let i = index ">\n          <button item-start ion-button *ngIf="expanded" (click)="goToTx(vin.items[i].mintTxid, i, false)" clear icon-only>\n            <ion-icon color="primary" name="ios-arrow-forward"></ion-icon>\n          </button>\n\n          <div class="ellipsis">\n            <p>\n              <a (click)="goToAddress(vin.address)"\n                [ngClass]="{\'disabled-link\': getAddress(vin) === \'Unparsed address\' }">{{ getAddress(vin) }}</a>\n            </p>\n          </div>\n          <div [hidden]="!expanded">\n            <p *ngIf="tx.confirmations > 0">\n              <b>Confirmations</b> {{ tx.confirmations }}</p>\n            <p>\n              <b>Unlocking Script</b>\n            </p>\n         \n              <div *ngIf="vin.script">\n                <div class="unlocking-script">\n                  <p>{{ vin.script.asm }}\n                </div>\n              </div>\n          </div>\n\n          <div item-end>\n            {{ vin.value }} {{ currencyProvider.currencySymbol }}             \n          </div>\n        </ion-item>\n\n        <ion-item *ngIf="tx.from">\n          <div class="ellipsis">\n            <p>\n              <a (click)="goToAddress(tx.from)">{{ tx.from }}</a>\n            </p>\n          </div>\n        </ion-item>\n      </ion-list>\n    </ion-col>\n\n    <ion-col col-12 col-md-1 text-center class="arrow-forward">\n      <ion-icon name="arrow-forward"></ion-icon>\n    </ion-col>\n\n    <ion-col col-12 col-md-6>\n      <ion-list>\n        <ion-item *ngFor="let vout of tx.coins.outputs; let i = index">         \n          <div>\n            <div class="ellipsis">\n              <p>\n                <a [ngClass]="{\'disabled-link\': getAddress(vout) === \'Unparsed address\' }"\n                  (click)="goToAddress(vout.address)">{{ getAddress(vout) }}</a>\n              </p>\n            </div>\n            <div *ngIf="expanded">\n              <p>\n                <b>Script Template</b>\n                <i>{{ vout.script.type }}</i>\n              </p>\n              <p>\n                <b>Locking Script</b>\n              </p>\n              <div class="locking-script">\n                <p>{{ vout.script.asm }}</p>\n              </div>\n            </div>\n          </div>\n\n          <div item-end>\n            {{ vout.value }} {{ currencyProvider.currencySymbol }}\n            <span [hidden]="!vout.spentTxid">(S)</span>\n            <span [hidden]="vout.spentTxid">(U)</span>\n          </div>\n\n          <button item-end ion-button *ngIf="expanded && vout.spentTxid && vout.spentTxid !== \'\' " (click)="\n            goToTx(vout.spentTxid, i, true)" clear icon-only>\n            <ion-icon color="primary" name="ios-arrow-forward"></ion-icon>\n          </button>\n        </ion-item>\n\n        <ion-item *ngIf="tx.to">\n          <div>\n            <div class="ellipsis">\n              <p>\n                <a (click)="goToAddress(tx.to)">{{ tx.to }}</a>\n              </p>\n            </div>\n          </div>\n        </ion-item>\n      </ion-list>\n    </ion-col>\n  </ion-row>\n\n  <ion-row align-items-start text-uppercase class="small" *ngIf="showCoins">\n    <ion-col col-6>\n      <div *ngIf="!tx.isCoinBase && currencyProvider.getConvertedNumber(tx.fee) >= 0">\n        <ion-chip>\n          <ion-label>Fee\n            <!-- <span text-nowrap>{{ currencyProvider.getConvertedNumber(tx.fee, chainNetwork.chain) | number:\'1.0-8\' }}\n              {{ currencyProvider.currencySymbol }}</span> -->\n          </ion-label>\n        </ion-chip>\n      </div>\n    </ion-col>\n    <ion-col col-6 text-right>\n      <ion-chip color="danger" *ngIf="tx.confirmations === -3">\n        <ion-label>Invalid</ion-label>\n      </ion-chip>\n      <ion-chip  color="warning" *ngIf="tx.confirmations === -1">\n        <ion-label>Unconfirmed</ion-label>\n      </ion-chip>\n      <ion-chip  color="primary" *ngIf="tx.confirmations === 1">\n        <ion-label>1 Confirmation</ion-label>\n      </ion-chip>\n      <ion-chip color="primary" *ngIf="tx.confirmations > 1">\n        <ion-label>{{ tx.confirmations }} Confirmations\n        </ion-label>\n      </ion-chip>\n      <ion-chip color="danger" *ngIf="tx.isRBF && tx.confirmations === -1">\n        <ion-label>Replace By Fee (RBF) enabled\n        </ion-label>\n      </ion-chip>\n      <ion-chip color="danger" *ngIf="tx.hasUnconfirmedInputs">\n        <ion-label>Tx has unconfirmed inputs\n        </ion-label>\n      </ion-chip>\n      <ion-chip color="default">\n        <ion-label>{{ tx.value }}\n          {{ currencyProvider.currencySymbol }}\n        </ion-label>\n      </ion-chip>\n    </ion-col>\n  </ion-row>\n</ion-grid>'/*ion-inline-end:"/home/enrique/smart/sapi-insight/src/components/transaction-details/transaction-details.html"*/
          }),
          __metadata("design:paramtypes", [__WEBPACK_IMPORTED_MODULE_4__providers_currency_currency__["a" /* CurrencyProvider */],
              __WEBPACK_IMPORTED_MODULE_2__providers_api_api__["a" /* ApiProvider */],
              __WEBPACK_IMPORTED_MODULE_6__providers_transactions_transactions__["a" /* TxsProvider */],
              __WEBPACK_IMPORTED_MODULE_5__providers_redir_redir__["a" /* RedirProvider */],
              __WEBPACK_IMPORTED_MODULE_3__providers_blocks_blocks__["a" /* BlocksProvider */],
              __WEBPACK_IMPORTED_MODULE_1_ionic_angular__["g" /* Nav */],
              __WEBPACK_IMPORTED_MODULE_1_ionic_angular__["i" /* NavParams */]])
      ], TransactionDetailsComponent);
      return TransactionDetailsComponent;
  }());
  
  //# sourceMappingURL=transaction-details.js.map
  
  /***/ }),
  
  /***/ 896:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CopyToClipboardModule; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__copy_to_clipboard_directive__ = __webpack_require__(897);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  
  
  var CopyToClipboardModule = /** @class */ (function () {
      function CopyToClipboardModule() {
      }
      CopyToClipboardModule = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"])({
              declarations: [__WEBPACK_IMPORTED_MODULE_1__copy_to_clipboard_directive__["a" /* CopyToClipboardDirective */]],
              exports: [__WEBPACK_IMPORTED_MODULE_1__copy_to_clipboard_directive__["a" /* CopyToClipboardDirective */]]
          })
      ], CopyToClipboardModule);
      return CopyToClipboardModule;
  }());
  
  //# sourceMappingURL=copy-to-clipboard.module.js.map
  
  /***/ }),
  
  /***/ 897:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CopyToClipboardDirective; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  var __metadata = (this && this.__metadata) || function (k, v) {
      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  };
  
  
  var CopyToClipboardDirective = /** @class */ (function () {
      function CopyToClipboardDirective(toastCtrl) {
          this.toastCtrl = toastCtrl;
      }
      CopyToClipboardDirective.prototype.copyText = function () {
          var textArea = document.createElement('textarea');
          textArea.style.position = 'fixed';
          textArea.style.top = '-999px';
          textArea.style.left = '-999px';
          textArea.style.width = '2em';
          textArea.style.height = '2em';
          textArea.style.padding = '0';
          textArea.style.border = 'none';
          textArea.style.outline = 'none';
          textArea.style.boxShadow = 'none';
          textArea.style.background = 'transparent';
          textArea.value = this.copyToClipboard;
          document.body.appendChild(textArea);
          textArea.select();
          try {
              var successful = document.execCommand('copy');
              var message = successful
                  ? 'Copied to Clipboard'
                  : 'Something went wrong, please try again';
              this.presentToast(message);
          }
          catch (err) {
              this.presentToast('Unable to copy');
          }
          document.body.removeChild(textArea);
      };
      CopyToClipboardDirective.prototype.presentToast = function (message) {
          var toast = this.toastCtrl.create({
              message: message,
              duration: 3000,
              position: 'top'
          });
          toast.present();
      };
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", String)
      ], CopyToClipboardDirective.prototype, "copyToClipboard", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["HostListener"])('click'),
          __metadata("design:type", Function),
          __metadata("design:paramtypes", []),
          __metadata("design:returntype", void 0)
      ], CopyToClipboardDirective.prototype, "copyText", null);
      CopyToClipboardDirective = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Directive"])({
              selector: '[copyToClipboard]'
          }),
          __metadata("design:paramtypes", [__WEBPACK_IMPORTED_MODULE_1_ionic_angular__["m" /* ToastController */]])
      ], CopyToClipboardDirective);
      return CopyToClipboardDirective;
  }());
  
  //# sourceMappingURL=copy-to-clipboard.directive.js.map
  
  /***/ }),
  
  /***/ 898:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TransactionListComponentModule; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__loader_loader_module__ = __webpack_require__(102);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__transaction_details_eth_transaction_details_eth_module__ = __webpack_require__(892);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__transaction_details_transaction_details_module__ = __webpack_require__(894);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__transaction_list__ = __webpack_require__(899);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  
  
  
  
  
  
  var TransactionListComponentModule = /** @class */ (function () {
      function TransactionListComponentModule() {
      }
      TransactionListComponentModule = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"])({
              declarations: [__WEBPACK_IMPORTED_MODULE_5__transaction_list__["a" /* TransactionListComponent */]],
              imports: [
                  __WEBPACK_IMPORTED_MODULE_1_ionic_angular__["e" /* IonicModule */],
                  __WEBPACK_IMPORTED_MODULE_3__transaction_details_eth_transaction_details_eth_module__["a" /* TransactionDetailsEthComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_4__transaction_details_transaction_details_module__["a" /* TransactionDetailsComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_2__loader_loader_module__["a" /* LoaderComponentModule */]
              ],
              exports: [__WEBPACK_IMPORTED_MODULE_5__transaction_list__["a" /* TransactionListComponent */]]
          })
      ], TransactionListComponentModule);
      return TransactionListComponentModule;
  }());
  
  //# sourceMappingURL=transaction-list.module.js.map
  
  /***/ }),
  
  /***/ 899:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TransactionListComponent; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_lodash__ = __webpack_require__(78);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_lodash___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash__);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__providers_address_address__ = __webpack_require__(173);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__providers_blocks_blocks__ = __webpack_require__(50);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__providers_transactions_transactions__ = __webpack_require__(54);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  var __metadata = (this && this.__metadata) || function (k, v) {
      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  };
  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 TransactionListComponent = /** @class */ (function () {
      function TransactionListComponent(txProvider, addrProvider, blocksProvider, events) {
          this.txProvider = txProvider;
          this.addrProvider = addrProvider;
          this.blocksProvider = blocksProvider;
          this.events = events;
          this.loading = true;
          this.transactions = [];
          this.blockPageNum = 1;
          this.limit = 10;
          this.chunkSize = 100;
      }
      TransactionListComponent.prototype.ngOnInit = function () {
          return __awaiter(this, void 0, void 0, function () {
              var _a, _b;
              return __generator(this, function (_c) {
                  switch (_c.label) {
                      case 0:
                          if (!(this.transactions && this.transactions.length === 0)) return [3 /*break*/, 5];
                          if (!(this.queryType === 'blockHash')) return [3 /*break*/, 2];
                          _a = this;
                          return [4 /*yield*/, this.txProvider.getTransactionsPerBlock(this.queryValue)];
                      case 1:
                          _a.transactions = _c.sent();
                          this.loading = false;
                          return [3 /*break*/, 4];
                      case 2:
                          if (!(this.queryType === 'address')) return [3 /*break*/, 4];
                          console.log(this.queryValue);
                          _b = this;
                          return [4 /*yield*/, this.txProvider.getTransactionsPerAddress(this.queryValue)];
                      case 3:
                          _b.transactions = _c.sent();
                          this.loading = false;
                          _c.label = 4;
                      case 4: return [3 /*break*/, 6];
                      case 5:
                          this.loading = false;
                          _c.label = 6;
                      case 6: return [2 /*return*/];
                  }
              });
          });
      };
      TransactionListComponent.prototype.populateTxsForAddress = function (txids, inputs, outputs) {
          var _this = this;
          __WEBPACK_IMPORTED_MODULE_2_lodash__["forEach"](txids, function (txid) {
              var tx = {};
              tx.txid = txid;
              tx.vin = inputs.filter(function (input) { return input.spentTxid === txid; });
              tx.vout = outputs.filter(function (output) { return output.mintTxid === txid; });
              tx.blockheight = tx.vout[0].mintHeight;
              tx.fee = _this.txProvider.getFee(tx);
              tx.valueOut = tx.vout
                  .filter(function (output) { return output.mintTxid === txid; })
                  .reduce(function (a, b) { return a + b.value; }, 0);
              tx.vin.length === 0 ? (tx.isCoinBase = true) : (tx.isCoinBase = false);
              _this.transactions.push(tx);
          });
      };
      TransactionListComponent.prototype.populateTxsForBlock = function (txidCoins) {
          var _this = this;
          __WEBPACK_IMPORTED_MODULE_2_lodash__["forEach"](txidCoins.txids, function (txid) {
              var tx = {};
              tx.txid = txid;
              tx.vin = txidCoins.inputs.filter(function (input) { return input.spentTxid === txid; });
              tx.vout = txidCoins.outputs.filter(function (output) { return output.mintTxid === txid; });
              tx.fee = _this.txProvider.getFee(tx);
              tx.blockheight = tx.vout[0].mintHeight;
              tx.blocktime = new Date(tx.blockTime).getTime() / 1000;
              tx.time = _this.blocktime
                  ? _this.blocktime
                  : new Date(tx.blockTime).getTime() / 1000;
              tx.valueOut = tx.vout
                  .filter(function (output) { return output.mintTxid === txid; })
                  .reduce(function (a, b) { return a + b.value; }, 0);
              tx.vin.length === 0 ? (tx.isCoinBase = true) : (tx.isCoinBase = false);
              _this.transactions.push(tx);
          });
      };
      TransactionListComponent.prototype.fetchBlockTxCoinInfo = function (pageNum) {
          // this.blocksProvider
          //   .getCoinsForBlockHash(this.queryValue, this.chainNetwork, 100, pageNum)
          //   .subscribe(txidCoins => {
          //     this.populateTxsForBlock(txidCoins);
          //     this.loading = false;
          //     if (txidCoins.next !== '') {
          //       this.blockPageNum = this.blockPageNum + 1;
          //     }
          //   });
      };
      TransactionListComponent.prototype.loadMore = function (infiniteScroll) {
          if ((this.queryType === 'blockHash' && this.chainNetwork.chain === 'BTC') ||
              this.chainNetwork.chain === 'BCH') {
              this.fetchBlockTxCoinInfo(this.blockPageNum);
              this.limit += this.chunkSize;
          }
          else {
              this.limit += this.chunkSize;
              this.chunkSize *= 2;
          }
          infiniteScroll.complete();
      };
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", String)
      ], TransactionListComponent.prototype, "queryType", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", String)
      ], TransactionListComponent.prototype, "queryValue", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionListComponent.prototype, "transactions", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionListComponent.prototype, "blocktime", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], TransactionListComponent.prototype, "chainNetwork", void 0);
      TransactionListComponent = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"])({
              selector: 'transaction-list',template:/*ion-inline-start:"/home/enrique/smart/sapi-insight/src/components/transaction-list/transaction-list.html"*/'<loader *ngIf="loading" [type]="\'tx-full-list\'"></loader>\n\n<div *ngIf="!loading">\n  <ion-grid>\n    <ion-row *ngFor="let tx of transactions; let i = index">\n      <ion-col col-12 *ngIf="i < limit">\n        <transaction-details [page]="tx-list" [showCoins]="true" [tx]="tx"></transaction-details>       \n      </ion-col>\n    </ion-row>\n    <ion-row *ngIf="limit < transactions.length">\n      <ion-infinite-scroll (ionInfinite)="loadMore($event)">\n        <loader [type]="\'tx-full-list\'"></loader>\n      </ion-infinite-scroll>\n    </ion-row>\n    <ion-row *ngIf="transactions.length === 0" class="no-txs">\n      <ion-col col-12>\n        There are no transactions involving this block.\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n</div>'/*ion-inline-end:"/home/enrique/smart/sapi-insight/src/components/transaction-list/transaction-list.html"*/
          }),
          __metadata("design:paramtypes", [__WEBPACK_IMPORTED_MODULE_5__providers_transactions_transactions__["a" /* TxsProvider */],
              __WEBPACK_IMPORTED_MODULE_3__providers_address_address__["a" /* AddressProvider */],
              __WEBPACK_IMPORTED_MODULE_4__providers_blocks_blocks__["a" /* BlocksProvider */],
              __WEBPACK_IMPORTED_MODULE_1_ionic_angular__["c" /* Events */]])
      ], TransactionListComponent);
      return TransactionListComponent;
  }());
  
  //# sourceMappingURL=transaction-list.js.map
  
  /***/ }),
  
  /***/ 900:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* unused harmony export QRCodeComponent */
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QRCodeModule; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_qrious__ = __webpack_require__(901);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_qrious___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_qrious__);
  
  
  
  var QRCodeComponent = (function () {
      /**
       * @param {?} elementRef
       */
      function QRCodeComponent(elementRef) {
          this.elementRef = elementRef;
          this.background = 'white';
          this.backgroundAlpha = 1.0;
          this.foreground = 'black';
          this.foregroundAlpha = 1.0;
          this.level = 'L';
          this.mime = 'image/png';
          this.padding = null;
          this.size = 100;
          this.value = '';
          this.canvas = false;
      }
      /**
       * @param {?} changes
       * @return {?}
       */
      QRCodeComponent.prototype.ngOnChanges = function (changes) {
          if ('background' in changes ||
              'backgroundAlpha' in changes ||
              'foreground' in changes ||
              'foregroundAlpha' in changes ||
              'level' in changes ||
              'mime' in changes ||
              'padding' in changes ||
              'size' in changes ||
              'value' in changes ||
              'canvas' in changes) {
              this.generate();
          }
      };
      /**
       * @return {?}
       */
      QRCodeComponent.prototype.generate = function () {
          try {
              var /** @type {?} */ el = this.elementRef.nativeElement;
              el.innerHTML = '';
              var /** @type {?} */ qr = new __WEBPACK_IMPORTED_MODULE_1_qrious___default.a({
                  background: this.background,
                  backgroundAlpha: this.backgroundAlpha,
                  foreground: this.foreground,
                  foregroundAlpha: this.foregroundAlpha,
                  level: this.level,
                  mime: this.mime,
                  padding: this.padding,
                  size: this.size,
                  value: this.value
              });
              if (this.canvas) {
                  el.appendChild(qr.canvas);
              }
              else {
                  el.appendChild(qr.image);
              }
          }
          catch (e) {
              console.error("Could not generate QR Code: " + e.message);
          }
      };
      return QRCodeComponent;
  }());
  QRCodeComponent.decorators = [
      { type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"], args: [{
                  moduleId: 'module.id',
                  selector: 'qr-code',
                  template: ""
              },] },
  ];
  /**
   * @nocollapse
   */
  QRCodeComponent.ctorParameters = function () { return [
      { type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["ElementRef"], },
  ]; };
  QRCodeComponent.propDecorators = {
      'background': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'backgroundAlpha': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'foreground': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'foregroundAlpha': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'level': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'mime': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'padding': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'size': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'value': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
      'canvas': [{ type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"] },],
  };
  var QRCodeModule = (function () {
      function QRCodeModule() {
      }
      return QRCodeModule;
  }());
  QRCodeModule.decorators = [
      { type: __WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"], args: [{
                  exports: [QRCodeComponent],
                  declarations: [QRCodeComponent]
              },] },
  ];
  /**
   * @nocollapse
   */
  QRCodeModule.ctorParameters = function () { return []; };
  
  /**
   * Generated bundle index. Do not edit.
   */
  
  
  
  
  /***/ }),
  
  /***/ 901:
  /***/ (function(module, exports, __webpack_require__) {
  
  /*
   * QRious v2.3.0
   * Copyright (C) 2017 Alasdair Mercer
   * Copyright (C) 2010 Tom Zerucha
   *
   * This program is free software: you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation, either version 3 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
  (function (global, factory) {
  	 true ? module.exports = factory() :
  	typeof define === 'function' && define.amd ? define('qrious', factory) :
  	(global.QRious = factory());
  }(this, (function () { 'use strict';
  
  	function unwrapExports (x) {
  		return x && x.__esModule ? x['default'] : x;
  	}
  
  	function createCommonjsModule(fn, module) {
  		return module = { exports: {} }, fn(module, module.exports), module.exports;
  	}
  
  	// 7.2.1 RequireObjectCoercible(argument)
  	var _defined = function(it){
  	  if(it == undefined)throw TypeError("Can't call method on  " + it);
  	  return it;
  	};
  
  	// 7.1.13 ToObject(argument)
  
  	var _toObject = function(it){
  	  return Object(_defined(it));
  	};
  
  	var hasOwnProperty = {}.hasOwnProperty;
  	var _has = function(it, key){
  	  return hasOwnProperty.call(it, key);
  	};
  
  	var _global = createCommonjsModule(function (module) {
  	// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
  	var global = module.exports = typeof window != 'undefined' && window.Math == Math
  	  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
  	if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
  	});
  
  	var SHARED = '__core-js_shared__';
  	var store  = _global[SHARED] || (_global[SHARED] = {});
  	var _shared = function(key){
  	  return store[key] || (store[key] = {});
  	};
  
  	var id = 0;
  	var px = Math.random();
  	var _uid = function(key){
  	  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
  	};
  
  	var shared = _shared('keys');
  	var _sharedKey = function(key){
  	  return shared[key] || (shared[key] = _uid(key));
  	};
  
  	// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
  	var IE_PROTO    = _sharedKey('IE_PROTO');
  	var ObjectProto = Object.prototype;
  
  	var _objectGpo = Object.getPrototypeOf || function(O){
  	  O = _toObject(O);
  	  if(_has(O, IE_PROTO))return O[IE_PROTO];
  	  if(typeof O.constructor == 'function' && O instanceof O.constructor){
  	    return O.constructor.prototype;
  	  } return O instanceof Object ? ObjectProto : null;
  	};
  
  	var _core = createCommonjsModule(function (module) {
  	var core = module.exports = {version: '2.4.0'};
  	if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
  	});
  
  	var _aFunction = function(it){
  	  if(typeof it != 'function')throw TypeError(it + ' is not a function!');
  	  return it;
  	};
  
  	// optional / simple context binding
  
  	var _ctx = function(fn, that, length){
  	  _aFunction(fn);
  	  if(that === undefined)return fn;
  	  switch(length){
  	    case 1: return function(a){
  	      return fn.call(that, a);
  	    };
  	    case 2: return function(a, b){
  	      return fn.call(that, a, b);
  	    };
  	    case 3: return function(a, b, c){
  	      return fn.call(that, a, b, c);
  	    };
  	  }
  	  return function(/* ...args */){
  	    return fn.apply(that, arguments);
  	  };
  	};
  
  	var _isObject = function(it){
  	  return typeof it === 'object' ? it !== null : typeof it === 'function';
  	};
  
  	var _anObject = function(it){
  	  if(!_isObject(it))throw TypeError(it + ' is not an object!');
  	  return it;
  	};
  
  	var _fails = function(exec){
  	  try {
  	    return !!exec();
  	  } catch(e){
  	    return true;
  	  }
  	};
  
  	// Thank's IE8 for his funny defineProperty
  	var _descriptors = !_fails(function(){
  	  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
  	});
  
  	var document$1 = _global.document;
  	var is = _isObject(document$1) && _isObject(document$1.createElement);
  	var _domCreate = function(it){
  	  return is ? document$1.createElement(it) : {};
  	};
  
  	var _ie8DomDefine = !_descriptors && !_fails(function(){
  	  return Object.defineProperty(_domCreate('div'), 'a', {get: function(){ return 7; }}).a != 7;
  	});
  
  	// 7.1.1 ToPrimitive(input [, PreferredType])
  
  	// instead of the ES6 spec version, we didn't implement @@toPrimitive case
  	// and the second argument - flag - preferred type is a string
  	var _toPrimitive = function(it, S){
  	  if(!_isObject(it))return it;
  	  var fn, val;
  	  if(S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it)))return val;
  	  if(typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it)))return val;
  	  if(!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it)))return val;
  	  throw TypeError("Can't convert object to primitive value");
  	};
  
  	var dP             = Object.defineProperty;
  
  	var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes){
  	  _anObject(O);
  	  P = _toPrimitive(P, true);
  	  _anObject(Attributes);
  	  if(_ie8DomDefine)try {
  	    return dP(O, P, Attributes);
  	  } catch(e){ /* empty */ }
  	  if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
  	  if('value' in Attributes)O[P] = Attributes.value;
  	  return O;
  	};
  
  	var _objectDp = {
  		f: f
  	};
  
  	var _propertyDesc = function(bitmap, value){
  	  return {
  	    enumerable  : !(bitmap & 1),
  	    configurable: !(bitmap & 2),
  	    writable    : !(bitmap & 4),
  	    value       : value
  	  };
  	};
  
  	var _hide = _descriptors ? function(object, key, value){
  	  return _objectDp.f(object, key, _propertyDesc(1, value));
  	} : function(object, key, value){
  	  object[key] = value;
  	  return object;
  	};
  
  	var PROTOTYPE = 'prototype';
  
  	var $export = function(type, name, source){
  	  var IS_FORCED = type & $export.F
  	    , IS_GLOBAL = type & $export.G
  	    , IS_STATIC = type & $export.S
  	    , IS_PROTO  = type & $export.P
  	    , IS_BIND   = type & $export.B
  	    , IS_WRAP   = type & $export.W
  	    , exports   = IS_GLOBAL ? _core : _core[name] || (_core[name] = {})
  	    , expProto  = exports[PROTOTYPE]
  	    , target    = IS_GLOBAL ? _global : IS_STATIC ? _global[name] : (_global[name] || {})[PROTOTYPE]
  	    , key, own, out;
  	  if(IS_GLOBAL)source = name;
  	  for(key in source){
  	    // contains in native
  	    own = !IS_FORCED && target && target[key] !== undefined;
  	    if(own && key in exports)continue;
  	    // export native or passed
  	    out = own ? target[key] : source[key];
  	    // prevent global pollution for namespaces
  	    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
  	    // bind timers to global for call from export context
  	    : IS_BIND && own ? _ctx(out, _global)
  	    // wrap global constructors for prevent change them in library
  	    : IS_WRAP && target[key] == out ? (function(C){
  	      var F = function(a, b, c){
  	        if(this instanceof C){
  	          switch(arguments.length){
  	            case 0: return new C;
  	            case 1: return new C(a);
  	            case 2: return new C(a, b);
  	          } return new C(a, b, c);
  	        } return C.apply(this, arguments);
  	      };
  	      F[PROTOTYPE] = C[PROTOTYPE];
  	      return F;
  	    // make static versions for prototype methods
  	    })(out) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
  	    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
  	    if(IS_PROTO){
  	      (exports.virtual || (exports.virtual = {}))[key] = out;
  	      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
  	      if(type & $export.R && expProto && !expProto[key])_hide(expProto, key, out);
  	    }
  	  }
  	};
  	// type bitmap
  	$export.F = 1;   // forced
  	$export.G = 2;   // global
  	$export.S = 4;   // static
  	$export.P = 8;   // proto
  	$export.B = 16;  // bind
  	$export.W = 32;  // wrap
  	$export.U = 64;  // safe
  	$export.R = 128; // real proto method for `library` 
  	var _export = $export;
  
  	// most Object methods by ES6 should accept primitives
  
  	var _objectSap = function(KEY, exec){
  	  var fn  = (_core.Object || {})[KEY] || Object[KEY]
  	    , exp = {};
  	  exp[KEY] = exec(fn);
  	  _export(_export.S + _export.F * _fails(function(){ fn(1); }), 'Object', exp);
  	};
  
  	// 19.1.2.9 Object.getPrototypeOf(O)
  
  
  	_objectSap('getPrototypeOf', function(){
  	  return function getPrototypeOf(it){
  	    return _objectGpo(_toObject(it));
  	  };
  	});
  
  	var getPrototypeOf$1 = _core.Object.getPrototypeOf;
  
  	var getPrototypeOf = createCommonjsModule(function (module) {
  	module.exports = { "default": getPrototypeOf$1, __esModule: true };
  	});
  
  	var _Object$getPrototypeOf = unwrapExports(getPrototypeOf);
  
  	var classCallCheck = createCommonjsModule(function (module, exports) {
  	"use strict";
  
  	exports.__esModule = true;
  
  	exports.default = function (instance, Constructor) {
  	  if (!(instance instanceof Constructor)) {
  	    throw new TypeError("Cannot call a class as a function");
  	  }
  	};
  	});
  
  	var _classCallCheck = unwrapExports(classCallCheck);
  
  	// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
  	_export(_export.S + _export.F * !_descriptors, 'Object', {defineProperty: _objectDp.f});
  
  	var $Object = _core.Object;
  	var defineProperty$2 = function defineProperty(it, key, desc){
  	  return $Object.defineProperty(it, key, desc);
  	};
  
  	var defineProperty = createCommonjsModule(function (module) {
  	module.exports = { "default": defineProperty$2, __esModule: true };
  	});
  
  	var createClass = createCommonjsModule(function (module, exports) {
  	"use strict";
  
  	exports.__esModule = true;
  
  
  
  	var _defineProperty2 = _interopRequireDefault(defineProperty);
  
  	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  
  	exports.default = function () {
  	  function defineProperties(target, props) {
  	    for (var i = 0; i < props.length; i++) {
  	      var descriptor = props[i];
  	      descriptor.enumerable = descriptor.enumerable || false;
  	      descriptor.configurable = true;
  	      if ("value" in descriptor) descriptor.writable = true;
  	      (0, _defineProperty2.default)(target, descriptor.key, descriptor);
  	    }
  	  }
  
  	  return function (Constructor, protoProps, staticProps) {
  	    if (protoProps) defineProperties(Constructor.prototype, protoProps);
  	    if (staticProps) defineProperties(Constructor, staticProps);
  	    return Constructor;
  	  };
  	}();
  	});
  
  	var _createClass = unwrapExports(createClass);
  
  	// 7.1.4 ToInteger
  	var ceil  = Math.ceil;
  	var floor = Math.floor;
  	var _toInteger = function(it){
  	  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
  	};
  
  	// true  -> String#at
  	// false -> String#codePointAt
  	var _stringAt = function(TO_STRING){
  	  return function(that, pos){
  	    var s = String(_defined(that))
  	      , i = _toInteger(pos)
  	      , l = s.length
  	      , a, b;
  	    if(i < 0 || i >= l)return TO_STRING ? '' : undefined;
  	    a = s.charCodeAt(i);
  	    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
  	      ? TO_STRING ? s.charAt(i) : a
  	      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
  	  };
  	};
  
  	var _library = true;
  
  	var _redefine = _hide;
  
  	var _iterators = {};
  
  	var toString = {}.toString;
  
  	var _cof = function(it){
  	  return toString.call(it).slice(8, -1);
  	};
  
  	// fallback for non-array-like ES3 and non-enumerable old V8 strings
  
  	var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function(it){
  	  return _cof(it) == 'String' ? it.split('') : Object(it);
  	};
  
  	// to indexed object, toObject with fallback for non-array-like ES3 strings
  
  	var _toIobject = function(it){
  	  return _iobject(_defined(it));
  	};
  
  	// 7.1.15 ToLength
  	var min       = Math.min;
  	var _toLength = function(it){
  	  return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
  	};
  
  	var max       = Math.max;
  	var min$1       = Math.min;
  	var _toIndex = function(index, length){
  	  index = _toInteger(index);
  	  return index < 0 ? max(index + length, 0) : min$1(index, length);
  	};
  
  	// false -> Array#indexOf
  	// true  -> Array#includes
  
  	var _arrayIncludes = function(IS_INCLUDES){
  	  return function($this, el, fromIndex){
  	    var O      = _toIobject($this)
  	      , length = _toLength(O.length)
  	      , index  = _toIndex(fromIndex, length)
  	      , value;
  	    // Array#includes uses SameValueZero equality algorithm
  	    if(IS_INCLUDES && el != el)while(length > index){
  	      value = O[index++];
  	      if(value != value)return true;
  	    // Array#toIndex ignores holes, Array#includes - not
  	    } else for(;length > index; index++)if(IS_INCLUDES || index in O){
  	      if(O[index] === el)return IS_INCLUDES || index || 0;
  	    } return !IS_INCLUDES && -1;
  	  };
  	};
  
  	var arrayIndexOf = _arrayIncludes(false);
  	var IE_PROTO$2     = _sharedKey('IE_PROTO');
  
  	var _objectKeysInternal = function(object, names){
  	  var O      = _toIobject(object)
  	    , i      = 0
  	    , result = []
  	    , key;
  	  for(key in O)if(key != IE_PROTO$2)_has(O, key) && result.push(key);
  	  // Don't enum bug & hidden keys
  	  while(names.length > i)if(_has(O, key = names[i++])){
  	    ~arrayIndexOf(result, key) || result.push(key);
  	  }
  	  return result;
  	};
  
  	// IE 8- don't enum bug keys
  	var _enumBugKeys = (
  	  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
  	).split(',');
  
  	// 19.1.2.14 / 15.2.3.14 Object.keys(O)
  
  
  	var _objectKeys = Object.keys || function keys(O){
  	  return _objectKeysInternal(O, _enumBugKeys);
  	};
  
  	var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties){
  	  _anObject(O);
  	  var keys   = _objectKeys(Properties)
  	    , length = keys.length
  	    , i = 0
  	    , P;
  	  while(length > i)_objectDp.f(O, P = keys[i++], Properties[P]);
  	  return O;
  	};
  
  	var _html = _global.document && document.documentElement;
  
  	// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
  	var IE_PROTO$1    = _sharedKey('IE_PROTO');
  	var Empty       = function(){ /* empty */ };
  	var PROTOTYPE$1   = 'prototype';
  
  	// Create object with fake `null` prototype: use iframe Object with cleared prototype
  	var createDict = function(){
  	  // Thrash, waste and sodomy: IE GC bug
  	  var iframe = _domCreate('iframe')
  	    , i      = _enumBugKeys.length
  	    , lt     = '<'
  	    , gt     = '>'
  	    , iframeDocument;
  	  iframe.style.display = 'none';
  	  _html.appendChild(iframe);
  	  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
  	  // createDict = iframe.contentWindow.Object;
  	  // html.removeChild(iframe);
  	  iframeDocument = iframe.contentWindow.document;
  	  iframeDocument.open();
  	  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
  	  iframeDocument.close();
  	  createDict = iframeDocument.F;
  	  while(i--)delete createDict[PROTOTYPE$1][_enumBugKeys[i]];
  	  return createDict();
  	};
  
  	var _objectCreate = Object.create || function create(O, Properties){
  	  var result;
  	  if(O !== null){
  	    Empty[PROTOTYPE$1] = _anObject(O);
  	    result = new Empty;
  	    Empty[PROTOTYPE$1] = null;
  	    // add "__proto__" for Object.getPrototypeOf polyfill
  	    result[IE_PROTO$1] = O;
  	  } else result = createDict();
  	  return Properties === undefined ? result : _objectDps(result, Properties);
  	};
  
  	var _wks = createCommonjsModule(function (module) {
  	var store      = _shared('wks')
  	  , Symbol     = _global.Symbol
  	  , USE_SYMBOL = typeof Symbol == 'function';
  
  	var $exports = module.exports = function(name){
  	  return store[name] || (store[name] =
  	    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));
  	};
  
  	$exports.store = store;
  	});
  
  	var def = _objectDp.f;
  	var TAG = _wks('toStringTag');
  
  	var _setToStringTag = function(it, tag, stat){
  	  if(it && !_has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});
  	};
  
  	var IteratorPrototype = {};
  
  	// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
  	_hide(IteratorPrototype, _wks('iterator'), function(){ return this; });
  
  	var _iterCreate = function(Constructor, NAME, next){
  	  Constructor.prototype = _objectCreate(IteratorPrototype, {next: _propertyDesc(1, next)});
  	  _setToStringTag(Constructor, NAME + ' Iterator');
  	};
  
  	var ITERATOR       = _wks('iterator');
  	var BUGGY          = !([].keys && 'next' in [].keys());
  	var FF_ITERATOR    = '@@iterator';
  	var KEYS           = 'keys';
  	var VALUES         = 'values';
  
  	var returnThis = function(){ return this; };
  
  	var _iterDefine = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){
  	  _iterCreate(Constructor, NAME, next);
  	  var getMethod = function(kind){
  	    if(!BUGGY && kind in proto)return proto[kind];
  	    switch(kind){
  	      case KEYS: return function keys(){ return new Constructor(this, kind); };
  	      case VALUES: return function values(){ return new Constructor(this, kind); };
  	    } return function entries(){ return new Constructor(this, kind); };
  	  };
  	  var TAG        = NAME + ' Iterator'
  	    , DEF_VALUES = DEFAULT == VALUES
  	    , VALUES_BUG = false
  	    , proto      = Base.prototype
  	    , $native    = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]
  	    , $default   = $native || getMethod(DEFAULT)
  	    , $entries   = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined
  	    , $anyNative = NAME == 'Array' ? proto.entries || $native : $native
  	    , methods, key, IteratorPrototype;
  	  // Fix native
  	  if($anyNative){
  	    IteratorPrototype = _objectGpo($anyNative.call(new Base));
  	    if(IteratorPrototype !== Object.prototype){
  	      // Set @@toStringTag to native iterators
  	      _setToStringTag(IteratorPrototype, TAG, true);
  	      // fix for some old engines
  	      if(!_library && !_has(IteratorPrototype, ITERATOR))_hide(IteratorPrototype, ITERATOR, returnThis);
  	    }
  	  }
  	  // fix Array#{values, @@iterator}.name in V8 / FF
  	  if(DEF_VALUES && $native && $native.name !== VALUES){
  	    VALUES_BUG = true;
  	    $default = function values(){ return $native.call(this); };
  	  }
  	  // Define iterator
  	  if((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){
  	    _hide(proto, ITERATOR, $default);
  	  }
  	  // Plug for library
  	  _iterators[NAME] = $default;
  	  _iterators[TAG]  = returnThis;
  	  if(DEFAULT){
  	    methods = {
  	      values:  DEF_VALUES ? $default : getMethod(VALUES),
  	      keys:    IS_SET     ? $default : getMethod(KEYS),
  	      entries: $entries
  	    };
  	    if(FORCED)for(key in methods){
  	      if(!(key in proto))_redefine(proto, key, methods[key]);
  	    } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);
  	  }
  	  return methods;
  	};
  
  	var $at  = _stringAt(true);
  
  	// 21.1.3.27 String.prototype[@@iterator]()
  	_iterDefine(String, 'String', function(iterated){
  	  this._t = String(iterated); // target
  	  this._i = 0;                // next index
  	// 21.1.5.2.1 %StringIteratorPrototype%.next()
  	}, function(){
  	  var O     = this._t
  	    , index = this._i
  	    , point;
  	  if(index >= O.length)return {value: undefined, done: true};
  	  point = $at(O, index);
  	  this._i += point.length;
  	  return {value: point, done: false};
  	});
  
  	var _addToUnscopables = function(){ /* empty */ };
  
  	var _iterStep = function(done, value){
  	  return {value: value, done: !!done};
  	};
  
  	// 22.1.3.4 Array.prototype.entries()
  	// 22.1.3.13 Array.prototype.keys()
  	// 22.1.3.29 Array.prototype.values()
  	// 22.1.3.30 Array.prototype[@@iterator]()
  	var es6_array_iterator = _iterDefine(Array, 'Array', function(iterated, kind){
  	  this._t = _toIobject(iterated); // target
  	  this._i = 0;                   // next index
  	  this._k = kind;                // kind
  	// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
  	}, function(){
  	  var O     = this._t
  	    , kind  = this._k
  	    , index = this._i++;
  	  if(!O || index >= O.length){
  	    this._t = undefined;
  	    return _iterStep(1);
  	  }
  	  if(kind == 'keys'  )return _iterStep(0, index);
  	  if(kind == 'values')return _iterStep(0, O[index]);
  	  return _iterStep(0, [index, O[index]]);
  	}, 'values');
  
  	// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
  	_iterators.Arguments = _iterators.Array;
  
  	_addToUnscopables('keys');
  	_addToUnscopables('values');
  	_addToUnscopables('entries');
  
  	var TO_STRING_TAG = _wks('toStringTag');
  
  	for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){
  	  var NAME       = collections[i]
  	    , Collection = _global[NAME]
  	    , proto      = Collection && Collection.prototype;
  	  if(proto && !proto[TO_STRING_TAG])_hide(proto, TO_STRING_TAG, NAME);
  	  _iterators[NAME] = _iterators.Array;
  	}
  
  	var f$1 = _wks;
  
  	var _wksExt = {
  		f: f$1
  	};
  
  	var iterator$2 = _wksExt.f('iterator');
  
  	var iterator = createCommonjsModule(function (module) {
  	module.exports = { "default": iterator$2, __esModule: true };
  	});
  
  	var _meta = createCommonjsModule(function (module) {
  	var META     = _uid('meta')
  	  , setDesc  = _objectDp.f
  	  , id       = 0;
  	var isExtensible = Object.isExtensible || function(){
  	  return true;
  	};
  	var FREEZE = !_fails(function(){
  	  return isExtensible(Object.preventExtensions({}));
  	});
  	var setMeta = function(it){
  	  setDesc(it, META, {value: {
  	    i: 'O' + ++id, // object ID
  	    w: {}          // weak collections IDs
  	  }});
  	};
  	var fastKey = function(it, create){
  	  // return primitive with prefix
  	  if(!_isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
  	  if(!_has(it, META)){
  	    // can't set metadata to uncaught frozen object
  	    if(!isExtensible(it))return 'F';
  	    // not necessary to add metadata
  	    if(!create)return 'E';
  	    // add missing metadata
  	    setMeta(it);
  	  // return object ID
  	  } return it[META].i;
  	};
  	var getWeak = function(it, create){
  	  if(!_has(it, META)){
  	    // can't set metadata to uncaught frozen object
  	    if(!isExtensible(it))return true;
  	    // not necessary to add metadata
  	    if(!create)return false;
  	    // add missing metadata
  	    setMeta(it);
  	  // return hash weak collections IDs
  	  } return it[META].w;
  	};
  	// add metadata on freeze-family methods calling
  	var onFreeze = function(it){
  	  if(FREEZE && meta.NEED && isExtensible(it) && !_has(it, META))setMeta(it);
  	  return it;
  	};
  	var meta = module.exports = {
  	  KEY:      META,
  	  NEED:     false,
  	  fastKey:  fastKey,
  	  getWeak:  getWeak,
  	  onFreeze: onFreeze
  	};
  	});
  
  	var defineProperty$4 = _objectDp.f;
  	var _wksDefine = function(name){
  	  var $Symbol = _core.Symbol || (_core.Symbol = _library ? {} : _global.Symbol || {});
  	  if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty$4($Symbol, name, {value: _wksExt.f(name)});
  	};
  
  	var _keyof = function(object, el){
  	  var O      = _toIobject(object)
  	    , keys   = _objectKeys(O)
  	    , length = keys.length
  	    , index  = 0
  	    , key;
  	  while(length > index)if(O[key = keys[index++]] === el)return key;
  	};
  
  	var f$2 = Object.getOwnPropertySymbols;
  
  	var _objectGops = {
  		f: f$2
  	};
  
  	var f$3 = {}.propertyIsEnumerable;
  
  	var _objectPie = {
  		f: f$3
  	};
  
  	// all enumerable object keys, includes symbols
  
  	var _enumKeys = function(it){
  	  var result     = _objectKeys(it)
  	    , getSymbols = _objectGops.f;
  	  if(getSymbols){
  	    var symbols = getSymbols(it)
  	      , isEnum  = _objectPie.f
  	      , i       = 0
  	      , key;
  	    while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);
  	  } return result;
  	};
  
  	// 7.2.2 IsArray(argument)
  
  	var _isArray = Array.isArray || function isArray(arg){
  	  return _cof(arg) == 'Array';
  	};
  
  	// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
  	var hiddenKeys = _enumBugKeys.concat('length', 'prototype');
  
  	var f$5 = Object.getOwnPropertyNames || function getOwnPropertyNames(O){
  	  return _objectKeysInternal(O, hiddenKeys);
  	};
  
  	var _objectGopn = {
  		f: f$5
  	};
  
  	// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
  	var gOPN$1      = _objectGopn.f;
  	var toString$1  = {}.toString;
  
  	var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
  	  ? Object.getOwnPropertyNames(window) : [];
  
  	var getWindowNames = function(it){
  	  try {
  	    return gOPN$1(it);
  	  } catch(e){
  	    return windowNames.slice();
  	  }
  	};
  
  	var f$4 = function getOwnPropertyNames(it){
  	  return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN$1(_toIobject(it));
  	};
  
  	var _objectGopnExt = {
  		f: f$4
  	};
  
  	var gOPD$1           = Object.getOwnPropertyDescriptor;
  
  	var f$6 = _descriptors ? gOPD$1 : function getOwnPropertyDescriptor(O, P){
  	  O = _toIobject(O);
  	  P = _toPrimitive(P, true);
  	  if(_ie8DomDefine)try {
  	    return gOPD$1(O, P);
  	  } catch(e){ /* empty */ }
  	  if(_has(O, P))return _propertyDesc(!_objectPie.f.call(O, P), O[P]);
  	};
  
  	var _objectGopd = {
  		f: f$6
  	};
  
  	// ECMAScript 6 symbols shim
  	var META           = _meta.KEY;
  	var gOPD           = _objectGopd.f;
  	var dP$1             = _objectDp.f;
  	var gOPN           = _objectGopnExt.f;
  	var $Symbol        = _global.Symbol;
  	var $JSON          = _global.JSON;
  	var _stringify     = $JSON && $JSON.stringify;
  	var PROTOTYPE$2      = 'prototype';
  	var HIDDEN         = _wks('_hidden');
  	var TO_PRIMITIVE   = _wks('toPrimitive');
  	var isEnum         = {}.propertyIsEnumerable;
  	var SymbolRegistry = _shared('symbol-registry');
  	var AllSymbols     = _shared('symbols');
  	var OPSymbols      = _shared('op-symbols');
  	var ObjectProto$1    = Object[PROTOTYPE$2];
  	var USE_NATIVE     = typeof $Symbol == 'function';
  	var QObject        = _global.QObject;
  	// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
  	var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild;
  
  	// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
  	var setSymbolDesc = _descriptors && _fails(function(){
  	  return _objectCreate(dP$1({}, 'a', {
  	    get: function(){ return dP$1(this, 'a', {value: 7}).a; }
  	  })).a != 7;
  	}) ? function(it, key, D){
  	  var protoDesc = gOPD(ObjectProto$1, key);
  	  if(protoDesc)delete ObjectProto$1[key];
  	  dP$1(it, key, D);
  	  if(protoDesc && it !== ObjectProto$1)dP$1(ObjectProto$1, key, protoDesc);
  	} : dP$1;
  
  	var wrap = function(tag){
  	  var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]);
  	  sym._k = tag;
  	  return sym;
  	};
  
  	var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){
  	  return typeof it == 'symbol';
  	} : function(it){
  	  return it instanceof $Symbol;
  	};
  
  	var $defineProperty = function defineProperty(it, key, D){
  	  if(it === ObjectProto$1)$defineProperty(OPSymbols, key, D);
  	  _anObject(it);
  	  key = _toPrimitive(key, true);
  	  _anObject(D);
  	  if(_has(AllSymbols, key)){
  	    if(!D.enumerable){
  	      if(!_has(it, HIDDEN))dP$1(it, HIDDEN, _propertyDesc(1, {}));
  	      it[HIDDEN][key] = true;
  	    } else {
  	      if(_has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
  	      D = _objectCreate(D, {enumerable: _propertyDesc(0, false)});
  	    } return setSymbolDesc(it, key, D);
  	  } return dP$1(it, key, D);
  	};
  	var $defineProperties = function defineProperties(it, P){
  	  _anObject(it);
  	  var keys = _enumKeys(P = _toIobject(P))
  	    , i    = 0
  	    , l = keys.length
  	    , key;
  	  while(l > i)$defineProperty(it, key = keys[i++], P[key]);
  	  return it;
  	};
  	var $create = function create(it, P){
  	  return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);
  	};
  	var $propertyIsEnumerable = function propertyIsEnumerable(key){
  	  var E = isEnum.call(this, key = _toPrimitive(key, true));
  	  if(this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key))return false;
  	  return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
  	};
  	var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
  	  it  = _toIobject(it);
  	  key = _toPrimitive(key, true);
  	  if(it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key))return;
  	  var D = gOPD(it, key);
  	  if(D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
  	  return D;
  	};
  	var $getOwnPropertyNames = function getOwnPropertyNames(it){
  	  var names  = gOPN(_toIobject(it))
  	    , result = []
  	    , i      = 0
  	    , key;
  	  while(names.length > i){
  	    if(!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);
  	  } return result;
  	};
  	var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
  	  var IS_OP  = it === ObjectProto$1
  	    , names  = gOPN(IS_OP ? OPSymbols : _toIobject(it))
  	    , result = []
  	    , i      = 0
  	    , key;
  	  while(names.length > i){
  	    if(_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true))result.push(AllSymbols[key]);
  	  } return result;
  	};
  
  	// 19.4.1.1 Symbol([description])
  	if(!USE_NATIVE){
  	  $Symbol = function Symbol(){
  	    if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');
  	    var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);
  	    var $set = function(value){
  	      if(this === ObjectProto$1)$set.call(OPSymbols, value);
  	      if(_has(this, HIDDEN) && _has(this[HIDDEN], tag))this[HIDDEN][tag] = false;
  	      setSymbolDesc(this, tag, _propertyDesc(1, value));
  	    };
  	    if(_descriptors && setter)setSymbolDesc(ObjectProto$1, tag, {configurable: true, set: $set});
  	    return wrap(tag);
  	  };
  	  _redefine($Symbol[PROTOTYPE$2], 'toString', function toString(){
  	    return this._k;
  	  });
  
  	  _objectGopd.f = $getOwnPropertyDescriptor;
  	  _objectDp.f   = $defineProperty;
  	  _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;
  	  _objectPie.f  = $propertyIsEnumerable;
  	  _objectGops.f = $getOwnPropertySymbols;
  
  	  if(_descriptors && !_library){
  	    _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true);
  	  }
  
  	  _wksExt.f = function(name){
  	    return wrap(_wks(name));
  	  };
  	}
  
  	_export(_export.G + _export.W + _export.F * !USE_NATIVE, {Symbol: $Symbol});
  
  	for(var symbols = (
  	  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
  	  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
  	).split(','), i$1 = 0; symbols.length > i$1; )_wks(symbols[i$1++]);
  
  	for(var symbols = _objectKeys(_wks.store), i$1 = 0; symbols.length > i$1; )_wksDefine(symbols[i$1++]);
  
  	_export(_export.S + _export.F * !USE_NATIVE, 'Symbol', {
  	  // 19.4.2.1 Symbol.for(key)
  	  'for': function(key){
  	    return _has(SymbolRegistry, key += '')
  	      ? SymbolRegistry[key]
  	      : SymbolRegistry[key] = $Symbol(key);
  	  },
  	  // 19.4.2.5 Symbol.keyFor(sym)
  	  keyFor: function keyFor(key){
  	    if(isSymbol(key))return _keyof(SymbolRegistry, key);
  	    throw TypeError(key + ' is not a symbol!');
  	  },
  	  useSetter: function(){ setter = true; },
  	  useSimple: function(){ setter = false; }
  	});
  
  	_export(_export.S + _export.F * !USE_NATIVE, 'Object', {
  	  // 19.1.2.2 Object.create(O [, Properties])
  	  create: $create,
  	  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
  	  defineProperty: $defineProperty,
  	  // 19.1.2.3 Object.defineProperties(O, Properties)
  	  defineProperties: $defineProperties,
  	  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
  	  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
  	  // 19.1.2.7 Object.getOwnPropertyNames(O)
  	  getOwnPropertyNames: $getOwnPropertyNames,
  	  // 19.1.2.8 Object.getOwnPropertySymbols(O)
  	  getOwnPropertySymbols: $getOwnPropertySymbols
  	});
  
  	// 24.3.2 JSON.stringify(value [, replacer [, space]])
  	$JSON && _export(_export.S + _export.F * (!USE_NATIVE || _fails(function(){
  	  var S = $Symbol();
  	  // MS Edge converts symbol values to JSON as {}
  	  // WebKit converts symbol values to JSON as null
  	  // V8 throws on boxed symbols
  	  return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';
  	})), 'JSON', {
  	  stringify: function stringify(it){
  	    if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined
  	    var args = [it]
  	      , i    = 1
  	      , replacer, $replacer;
  	    while(arguments.length > i)args.push(arguments[i++]);
  	    replacer = args[1];
  	    if(typeof replacer == 'function')$replacer = replacer;
  	    if($replacer || !_isArray(replacer))replacer = function(key, value){
  	      if($replacer)value = $replacer.call(this, key, value);
  	      if(!isSymbol(value))return value;
  	    };
  	    args[1] = replacer;
  	    return _stringify.apply($JSON, args);
  	  }
  	});
  
  	// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
  	$Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf);
  	// 19.4.3.5 Symbol.prototype[@@toStringTag]
  	_setToStringTag($Symbol, 'Symbol');
  	// 20.2.1.9 Math[@@toStringTag]
  	_setToStringTag(Math, 'Math', true);
  	// 24.3.3 JSON[@@toStringTag]
  	_setToStringTag(_global.JSON, 'JSON', true);
  
  	_wksDefine('asyncIterator');
  
  	_wksDefine('observable');
  
  	var index = _core.Symbol;
  
  	var symbol = createCommonjsModule(function (module) {
  	module.exports = { "default": index, __esModule: true };
  	});
  
  	var _typeof_1 = createCommonjsModule(function (module, exports) {
  	"use strict";
  
  	exports.__esModule = true;
  
  
  
  	var _iterator2 = _interopRequireDefault(iterator);
  
  
  
  	var _symbol2 = _interopRequireDefault(symbol);
  
  	var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
  
  	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  
  	exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
  	  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
  	} : function (obj) {
  	  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
  	};
  	});
  
  	var possibleConstructorReturn = createCommonjsModule(function (module, exports) {
  	"use strict";
  
  	exports.__esModule = true;
  
  
  
  	var _typeof3 = _interopRequireDefault(_typeof_1);
  
  	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  
  	exports.default = function (self, call) {
  	  if (!self) {
  	    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  	  }
  
  	  return call && ((typeof call === "undefined" ? "undefined" : (0, _typeof3.default)(call)) === "object" || typeof call === "function") ? call : self;
  	};
  	});
  
  	var _possibleConstructorReturn = unwrapExports(possibleConstructorReturn);
  
  	// Works with __proto__ only. Old v8 can't work with null proto objects.
  	/* eslint-disable no-proto */
  
  	var check = function(O, proto){
  	  _anObject(O);
  	  if(!_isObject(proto) && proto !== null)throw TypeError(proto + ": can't set as prototype!");
  	};
  	var _setProto = {
  	  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
  	    function(test, buggy, set){
  	      try {
  	        set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
  	        set(test, []);
  	        buggy = !(test instanceof Array);
  	      } catch(e){ buggy = true; }
  	      return function setPrototypeOf(O, proto){
  	        check(O, proto);
  	        if(buggy)O.__proto__ = proto;
  	        else set(O, proto);
  	        return O;
  	      };
  	    }({}, false) : undefined),
  	  check: check
  	};
  
  	// 19.1.3.19 Object.setPrototypeOf(O, proto)
  
  	_export(_export.S, 'Object', {setPrototypeOf: _setProto.set});
  
  	var setPrototypeOf$2 = _core.Object.setPrototypeOf;
  
  	var setPrototypeOf = createCommonjsModule(function (module) {
  	module.exports = { "default": setPrototypeOf$2, __esModule: true };
  	});
  
  	// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
  	_export(_export.S, 'Object', {create: _objectCreate});
  
  	var $Object$1 = _core.Object;
  	var create$2 = function create(P, D){
  	  return $Object$1.create(P, D);
  	};
  
  	var create = createCommonjsModule(function (module) {
  	module.exports = { "default": create$2, __esModule: true };
  	});
  
  	var inherits = createCommonjsModule(function (module, exports) {
  	"use strict";
  
  	exports.__esModule = true;
  
  
  
  	var _setPrototypeOf2 = _interopRequireDefault(setPrototypeOf);
  
  
  
  	var _create2 = _interopRequireDefault(create);
  
  
  
  	var _typeof3 = _interopRequireDefault(_typeof_1);
  
  	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  
  	exports.default = function (subClass, superClass) {
  	  if (typeof superClass !== "function" && superClass !== null) {
  	    throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass)));
  	  }
  
  	  subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
  	    constructor: {
  	      value: subClass,
  	      enumerable: false,
  	      writable: true,
  	      configurable: true
  	    }
  	  });
  	  if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;
  	};
  	});
  
  	var _inherits = unwrapExports(inherits);
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * Contains utility methods that are useful throughout the library.
  	 *
  	 * @public
  	 */
  	var Utilities = function () {
  	  function Utilities() {
  	    _classCallCheck(this, Utilities);
  	  }
  
  	  _createClass(Utilities, null, [{
  	    key: "abs",
  
  
  	    /**
  	     * Returns the absolute value of a given number.
  	     *
  	     * This method is simply a convenient shorthand for <code>Math.abs</code> while ensuring that nulls are returned as
  	     * <code>null</code> instead of zero.
  	     *
  	     * @param {number} value - the number whose absolute value is to be returned
  	     * @return {number} The absolute value of <code>value</code> or <code>null</code> if <code>value</code> is
  	     * <code>null</code>.
  	     * @public
  	     * @static
  	     */
  	    value: function abs(value) {
  	      return value != null ? Math.abs(value) : null;
  	    }
  
  	    /**
  	     * Returns whether the specified <code>object</code> has a property with the specified <code>name</code> as an own
  	     * (not inherited) property.
  	     *
  	     * @param {Object} object - the object on which the property is to be checked
  	     * @param {string} name - the name of the property to be checked
  	     * @return {boolean} <code>true</code> if <code>object</code> has an own property with <code>name</code>.
  	     * @public
  	     * @static
  	     */
  
  	  }, {
  	    key: "hasOwn",
  	    value: function hasOwn(object, name) {
  	      return Object.prototype.hasOwnProperty.call(object, name);
  	    }
  
  	    /**
  	     * Throws an error indicating that the a given method on a specific class has not been implemented.
  	     *
  	     * @param {string} className - the name of the class on which the method has not been implemented
  	     * @param {string} methodName - the name of the method which has not been implemented
  	     * @return {void}
  	     * @throws {Error} The error describing the class method which has not been implemented.
  	     * @public
  	     * @static
  	     */
  
  	  }, {
  	    key: "throwUnimplemented",
  	    value: function throwUnimplemented(className, methodName) {
  	      throw new Error("\"" + methodName + "\" method must be implemented on the " + className + " class");
  	    }
  
  	    /**
  	     * Transforms the specified <code>string</code> to upper case while remaining null-safe.
  	     *
  	     * @param {string} string - the string to be transformed to upper case
  	     * @return {string} <code>string</code> transformed to upper case if <code>string</code> is not <code>null</code>.
  	     * @public
  	     * @static
  	     */
  
  	  }, {
  	    key: "toUpperCase",
  	    value: function toUpperCase(string) {
  	      return string != null ? string.toUpperCase() : null;
  	    }
  	  }]);
  
  	  return Utilities;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * Defines a service contract that must be met by all implementations.
  	 *
  	 * @public
  	 */
  
  	var Service = function () {
  	  function Service() {
  	    _classCallCheck(this, Service);
  	  }
  
  	  _createClass(Service, [{
  	    key: 'getName',
  
  
  	    /**
  	     * Returns the name of this {@link Service}.
  	     *
  	     * @return {string} The service name.
  	     * @public
  	     */
  	    value: function getName() {
  	      Utilities.throwUnimplemented('Service', 'getName');
  	    }
  	  }]);
  
  	  return Service;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * A service for working with elements.
  	 *
  	 * @public
  	 * @extends Service
  	 */
  
  	var ElementService = function (_Service) {
  	  _inherits(ElementService, _Service);
  
  	  function ElementService() {
  	    _classCallCheck(this, ElementService);
  
  	    return _possibleConstructorReturn(this, (ElementService.__proto__ || _Object$getPrototypeOf(ElementService)).apply(this, arguments));
  	  }
  
  	  _createClass(ElementService, [{
  	    key: 'createCanvas',
  
  
  	    /**
  	     * Creates an instance of a canvas element.
  	     *
  	     * @return {*} The newly created canvas element.
  	     * @public
  	     */
  	    value: function createCanvas() {
  	      Utilities.throwUnimplemented('ElementService', 'createCanvas');
  	    }
  
  	    /**
  	     * Creates an instance of a image element.
  	     *
  	     * @return {*} The newly created image element.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'createImage',
  	    value: function createImage() {
  	      Utilities.throwUnimplemented('ElementService', 'createImage');
  	    }
  
  	    /**
  	     * @override
  	     */
  
  	  }, {
  	    key: 'getName',
  	    value: function getName() {
  	      return 'element';
  	    }
  
  	    /**
  	     * Returns whether the specified <code>element</code> is a canvas.
  	     *
  	     * @param {*} element - the element to be checked
  	     * @return {boolean} <code>true</code> if <code>element</code> is a canvas; otherwise <code>false</code>.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'isCanvas',
  	    value: function isCanvas(element) {
  	      Utilities.throwUnimplemented('ElementService', 'isCanvas');
  	    }
  
  	    /**
  	     * Returns whether the specified <code>element</code> is an image.
  	     *
  	     * @param {*} element - the element to be checked
  	     * @return {boolean} <code>true</code> if <code>element</code> is an image; otherwise <code>false</code>.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'isImage',
  	    value: function isImage(element) {
  	      Utilities.throwUnimplemented('ElementService', 'isImage');
  	    }
  	  }]);
  
  	  return ElementService;
  	}(Service);
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * An implementation of {@link ElementService} intended for use within a browser environment.
  	 *
  	 * @public
  	 * @extends ElementService
  	 */
  
  	var BrowserElementService = function (_ElementService) {
  	  _inherits(BrowserElementService, _ElementService);
  
  	  function BrowserElementService() {
  	    _classCallCheck(this, BrowserElementService);
  
  	    return _possibleConstructorReturn(this, (BrowserElementService.__proto__ || _Object$getPrototypeOf(BrowserElementService)).apply(this, arguments));
  	  }
  
  	  _createClass(BrowserElementService, [{
  	    key: 'createCanvas',
  
  
  	    /**
  	     * @override
  	     */
  	    value: function createCanvas() {
  	      return document.createElement('canvas');
  	    }
  
  	    /**
  	     * @override
  	     */
  
  	  }, {
  	    key: 'createImage',
  	    value: function createImage() {
  	      return document.createElement('img');
  	    }
  
  	    /**
  	     * @override
  	     */
  
  	  }, {
  	    key: 'isCanvas',
  	    value: function isCanvas(element) {
  	      return element instanceof HTMLCanvasElement;
  	    }
  
  	    /**
  	     * @override
  	     */
  
  	  }, {
  	    key: 'isImage',
  	    value: function isImage(element) {
  	      return element instanceof HTMLImageElement;
  	    }
  	  }]);
  
  	  return BrowserElementService;
  	}(ElementService);
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * Responsible for rendering a QR code {@link Frame} on a specific type of element.
  	 *
  	 * A renderer may be dependant on the rendering of another element, so the ordering of their execution is important.
  	 *
  	 * The rendering of a element can be deferred by disabling the renderer initially, however, any attempt get the element
  	 * from the renderer will result in it being immediately enabled and the element being rendered.
  	 *
  	 * @public
  	 */
  
  	var Renderer = function () {
  
  	  /**
  	   * Creates a new instance of {@link Renderer} for the <code>qrious</code> instance and <code>element</code> provided.
  	   *
  	   * @param {QRious} qrious - the {@link QRious} instance to be used
  	   * @param {*} element - the element onto which the QR code is to be rendered
  	   * @param {boolean} [enabled] - <code>true</code> this {@link Renderer} is enabled; otherwise <code>false</code>.
  	   * @public
  	   */
  	  function Renderer(qrious, element, enabled) {
  	    _classCallCheck(this, Renderer);
  
  	    /**
  	     * The {@link QRious} instance.
  	     *
  	     * @protected
  	     * @type {QRious}
  	     */
  	    this.qrious = qrious;
  
  	    /**
  	     * The element onto which this {@link Renderer} is rendering the QR code.
  	     *
  	     * @protected
  	     * @type {*}
  	     */
  	    this.element = element;
  	    this.element.qrious = qrious;
  
  	    /**
  	     * Whether this {@link Renderer} is enabled.
  	     *
  	     * @protected
  	     * @type {boolean}
  	     */
  	    this.enabled = Boolean(enabled);
  	  }
  
  	  /**
  	   * Draws the specified QR code <code>frame</code> on the underlying element.
  	   *
  	   * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.
  	   *
  	   * @param {Frame} frame - the {@link Frame} to be drawn
  	   * @return {void}
  	   * @protected
  	   */
  
  
  	  _createClass(Renderer, [{
  	    key: 'draw',
  	    value: function draw(frame) {
  	      Utilities.throwUnimplemented('Renderer', 'draw');
  	    }
  
  	    /**
  	     * Returns the element onto which this {@link Renderer} is rendering the QR code.
  	     *
  	     * If this method is called while this {@link Renderer} is disabled, it will be immediately enabled and rendered
  	     * before the element is returned.
  	     *
  	     * @return {*} The element.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'getElement',
  	    value: function getElement() {
  	      if (!this.enabled) {
  	        this.enabled = true;
  	        this.render();
  	      }
  
  	      return this.element;
  	    }
  
  	    /**
  	     * Calculates the size (in pixel units) to represent an individual module within the QR code based on the
  	     * <code>frame</code> provided.
  	     *
  	     * Any configured padding will be excluded from the returned size.
  	     *
  	     * The returned value will be at least one, even in cases where the size of the QR code does not fit its contents.
  	     * This is done so that the inevitable clipping is handled more gracefully since this way at least something is
  	     * displayed instead of just a blank space filled by the background color.
  	     *
  	     * @param {Frame} frame - the {@link Frame} from which the module size is to be derived
  	     * @return {number} The pixel size for each module in the QR code which will be no less than one.
  	     * @protected
  	     */
  
  	  }, {
  	    key: 'getModuleSize',
  	    value: function getModuleSize(frame) {
  	      var qrious = this.qrious;
  	      var padding = qrious.padding || 0;
  	      var pixels = Math.floor((qrious.size - padding * 2) / frame.width);
  
  	      return Math.max(1, pixels);
  	    }
  
  	    /**
  	     * Calculates the offset/padding (in pixel units) to be inserted before the QR code based on the <code>frame</code>
  	     * provided.
  	     *
  	     * The returned value will be zero if there is no available offset or if the size of the QR code does not fit its
  	     * contents. It will never be a negative value. This is done so that the inevitable clipping appears more naturally
  	     * and it is not clipped from all directions.
  	     *
  	     * @param {Frame} frame - the {@link Frame} from which the offset is to be derived
  	     * @return {number} The pixel offset for the QR code which will be no less than zero.
  	     * @protected
  	     */
  
  	  }, {
  	    key: 'getOffset',
  	    value: function getOffset(frame) {
  	      var qrious = this.qrious;
  	      var padding = qrious.padding;
  
  	      if (padding != null) {
  	        return padding;
  	      }
  
  	      var moduleSize = this.getModuleSize(frame);
  	      var offset = Math.floor((qrious.size - moduleSize * frame.width) / 2);
  
  	      return Math.max(0, offset);
  	    }
  
  	    /**
  	     * Renders a QR code on the underlying element based on the <code>frame</code> provided.
  	     *
  	     * @param {Frame} frame - the {@link Frame} to be rendered
  	     * @return {void}
  	     * @public
  	     */
  
  	  }, {
  	    key: 'render',
  	    value: function render(frame) {
  	      if (this.enabled) {
  	        this.resize();
  	        this.reset();
  	        this.draw(frame);
  	      }
  	    }
  
  	    /**
  	     * Resets the underlying element, effectively clearing any previously rendered QR code.
  	     *
  	     * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.
  	     *
  	     * @return {void}
  	     * @protected
  	     */
  
  	  }, {
  	    key: 'reset',
  	    value: function reset() {
  	      Utilities.throwUnimplemented('Renderer', 'reset');
  	    }
  
  	    /**
  	     * Ensures that the size of the underlying element matches that defined on the associated {@link QRious} instance.
  	     *
  	     * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.
  	     *
  	     * @return {void}
  	     * @protected
  	     */
  
  	  }, {
  	    key: 'resize',
  	    value: function resize() {
  	      Utilities.throwUnimplemented('Renderer', 'resize');
  	    }
  	  }]);
  
  	  return Renderer;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * An implementation of {@link Renderer} for working with <code>canvas</code> elements.
  	 *
  	 * @public
  	 * @extends Renderer
  	 */
  
  	var CanvasRenderer = function (_Renderer) {
  	  _inherits(CanvasRenderer, _Renderer);
  
  	  function CanvasRenderer() {
  	    _classCallCheck(this, CanvasRenderer);
  
  	    return _possibleConstructorReturn(this, (CanvasRenderer.__proto__ || _Object$getPrototypeOf(CanvasRenderer)).apply(this, arguments));
  	  }
  
  	  _createClass(CanvasRenderer, [{
  	    key: 'draw',
  
  
  	    /**
  	     * @override
  	     */
  	    value: function draw(frame) {
  	      var qrious = this.qrious;
  	      var moduleSize = this.getModuleSize(frame);
  	      var offset = this.getOffset(frame);
  	      var context = this.element.getContext('2d');
  
  	      context.fillStyle = qrious.foreground;
  	      context.globalAlpha = qrious.foregroundAlpha;
  
  	      for (var i = 0; i < frame.width; i++) {
  	        for (var j = 0; j < frame.width; j++) {
  	          if (frame.buffer[j * frame.width + i]) {
  	            context.fillRect(moduleSize * i + offset, moduleSize * j + offset, moduleSize, moduleSize);
  	          }
  	        }
  	      }
  	    }
  
  	    /**
  	     * @override
  	     */
  
  	  }, {
  	    key: 'reset',
  	    value: function reset() {
  	      var qrious = this.qrious;
  	      var context = this.element.getContext('2d');
  	      var size = qrious.size;
  
  	      context.lineWidth = 1;
  	      context.clearRect(0, 0, size, size);
  	      context.fillStyle = qrious.background;
  	      context.globalAlpha = qrious.backgroundAlpha;
  	      context.fillRect(0, 0, size, size);
  	    }
  
  	    /**
  	     * @override
  	     */
  
  	  }, {
  	    key: 'resize',
  	    value: function resize() {
  	      this.element.width = this.element.height = this.qrious.size;
  	    }
  	  }]);
  
  	  return CanvasRenderer;
  	}(Renderer);
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/* eslint no-multi-spaces: "off" */
  
  	/**
  	 * Contains alignment pattern information.
  	 *
  	 * @public
  	 */
  	var Alignment = function () {
  	  function Alignment() {
  	    _classCallCheck(this, Alignment);
  	  }
  
  	  _createClass(Alignment, null, [{
  	    key: "BLOCK",
  
  
  	    /**
  	     * Returns the alignment pattern block.
  	     *
  	     * @return {number[]} The alignment pattern block.
  	     * @public
  	     * @static
  	     */
  	    get: function get() {
  	      return [0, 11, 15, 19, 23, 27, 31, 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24, 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28];
  	    }
  	  }]);
  
  	  return Alignment;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/* eslint no-multi-spaces: "off" */
  
  	/**
  	 * Contains error correction information.
  	 *
  	 * @public
  	 */
  	var ErrorCorrection = function () {
  	  function ErrorCorrection() {
  	    _classCallCheck(this, ErrorCorrection);
  	  }
  
  	  _createClass(ErrorCorrection, null, [{
  	    key: "BLOCKS",
  
  
  	    /**
  	     * Returns the error correction blocks.
  	     *
  	     * There are four elements per version. The first two indicate the number of blocks, then the data width, and finally
  	     * the ECC width.
  	     *
  	     * @return {number[]} The ECC blocks.
  	     * @public
  	     * @static
  	     */
  	    get: function get() {
  	      return [1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17, 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28, 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22, 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16, 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22, 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28, 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26, 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26, 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24, 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28, 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24, 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28, 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22, 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24, 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24, 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30, 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28, 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28, 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26, 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28, 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30, 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24, 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30, 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30, 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30, 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30, 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30, 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30, 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30, 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30, 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30, 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30, 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30, 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30, 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30, 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30, 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30, 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30, 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30, 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30];
  	    }
  
  	    /**
  	     * Returns the final format bits with mask (level << 3 | mask).
  	     *
  	     * @return {number[]} The final format bits.
  	     * @public
  	     * @static
  	     */
  
  	  }, {
  	    key: "FINAL_FORMAT",
  	    get: function get() {
  	      return [
  	      // L
  	      0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,
  	      // M
  	      0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,
  	      // Q
  	      0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,
  	      // H
  	      0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b];
  	    }
  
  	    /**
  	     * Returns a map of human-readable ECC levels.
  	     *
  	     * @return {Object<string, number>} A ECC level mapping.
  	     * @public
  	     * @static
  	     */
  
  	  }, {
  	    key: "LEVELS",
  	    get: function get() {
  	      return {
  	        L: 1,
  	        M: 2,
  	        Q: 3,
  	        H: 4
  	      };
  	    }
  	  }]);
  
  	  return ErrorCorrection;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * Contains Galois field information.
  	 *
  	 * @public
  	 */
  	var Galois = function () {
  	  function Galois() {
  	    _classCallCheck(this, Galois);
  	  }
  
  	  _createClass(Galois, null, [{
  	    key: "EXPONENT",
  
  
  	    /**
  	     * Returns the Galois field exponent table.
  	     *
  	     * @return {number[]} The Galois field exponent table.
  	     * @public
  	     * @static
  	     */
  	    get: function get() {
  	      return [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09, 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16, 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00];
  	    }
  
  	    /**
  	     * Returns the Galois field log table.
  	     *
  	     * @return {number[]} The Galois field log table.
  	     * @public
  	     * @static
  	     */
  
  	  }, {
  	    key: "LOG",
  	    get: function get() {
  	      return [0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b, 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71, 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45, 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6, 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88, 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40, 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d, 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57, 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18, 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e, 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61, 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2, 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6, 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a, 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7, 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf];
  	    }
  	  }]);
  
  	  return Galois;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * Contains version pattern information.
  	 *
  	 * @public
  	 */
  	var Version = function () {
  	  function Version() {
  	    _classCallCheck(this, Version);
  	  }
  
  	  _createClass(Version, null, [{
  	    key: "BLOCK",
  
  
  	    /**
  	     * Returns the version pattern block.
  	     *
  	     * @return {number[]} The version pattern block.
  	     * @public
  	     * @static
  	     */
  	    get: function get() {
  	      return [0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d, 0x928, 0xb78, 0x45d, 0xa17, 0x532, 0x9a6, 0x683, 0x8c9, 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75, 0x250, 0x9d5, 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64, 0x541, 0xc69];
  	    }
  	  }]);
  
  	  return Version;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * Generates information for a QR code frame based on a specific value to be encoded.
  	 *
  	 * @public
  	 */
  
  	var Frame = function () {
  	  _createClass(Frame, null, [{
  	    key: '_createArray',
  	    value: function _createArray(length) {
  	      var array = [];
  
  	      for (var i = 0; i < length; i++) {
  	        array[i] = 0;
  	      }
  
  	      return array;
  	    }
  	  }, {
  	    key: '_getMaskBit',
  	    value: function _getMaskBit(x, y) {
  	      var bit = void 0;
  
  	      if (x > y) {
  	        bit = x;
  	        x = y;
  	        y = bit;
  	      }
  
  	      bit = y;
  	      bit += y * y;
  	      bit >>= 1;
  	      bit += x;
  
  	      return bit;
  	    }
  	  }, {
  	    key: '_modN',
  	    value: function _modN(x) {
  	      while (x >= 255) {
  	        x -= 255;
  	        x = (x >> 8) + (x & 255);
  	      }
  
  	      return x;
  	    }
  
  	    // *Badness* coefficients.
  
  	  }, {
  	    key: 'N1',
  	    get: function get() {
  	      return 3;
  	    }
  	  }, {
  	    key: 'N2',
  	    get: function get() {
  	      return 3;
  	    }
  	  }, {
  	    key: 'N3',
  	    get: function get() {
  	      return 40;
  	    }
  	  }, {
  	    key: 'N4',
  	    get: function get() {
  	      return 10;
  	    }
  
  	    /**
  	     * Creates an instance of {@link Frame} based on the <code>options</code> provided.
  	     *
  	     * @param {Frame~Options} options - the options to be used
  	     * @public
  	     */
  
  	  }]);
  
  	  function Frame(options) {
  	    _classCallCheck(this, Frame);
  
  	    this._badness = [];
  	    this._level = ErrorCorrection.LEVELS[options.level];
  	    this._polynomial = [];
  	    this._value = options.value;
  	    this._valueLength = this._value.length;
  	    this._version = 0;
  	    this._stringBuffer = [];
  
  	    var dataBlock = void 0;
  	    var eccBlock = void 0;
  	    var neccBlock1 = void 0;
  	    var neccBlock2 = void 0;
  
  	    while (this._version < 40) {
  	      this._version++;
  
  	      var index = (this._level - 1) * 4 + (this._version - 1) * 16;
  
  	      neccBlock1 = ErrorCorrection.BLOCKS[index++];
  	      neccBlock2 = ErrorCorrection.BLOCKS[index++];
  	      dataBlock = ErrorCorrection.BLOCKS[index++];
  	      eccBlock = ErrorCorrection.BLOCKS[index];
  
  	      index = dataBlock * (neccBlock1 + neccBlock2) + neccBlock2 - 3 + (this._version <= 9);
  
  	      if (this._valueLength <= index) {
  	        break;
  	      }
  	    }
  
  	    this._dataBlock = dataBlock;
  	    this._eccBlock = eccBlock;
  	    this._neccBlock1 = neccBlock1;
  	    this._neccBlock2 = neccBlock2;
  
  	    /**
  	     * The data width is based on version.
  	     *
  	     * @public
  	     * @type {number}
  	     */
  	    // FIXME: Ensure that it fits instead of being truncated.
  	    this.width = 17 + 4 * this._version;
  
  	    /**
  	     * The image buffer.
  	     *
  	     * @public
  	     * @type {number[]}
  	     */
  	    this.buffer = Frame._createArray(this.width * this.width);
  
  	    this._ecc = Frame._createArray(this._dataBlock + (this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2) + this._neccBlock2);
  	    this._mask = Frame._createArray((this.width * (this.width + 1) + 1) / 2);
  
  	    this._insertFinders();
  	    this._insertAlignments();
  
  	    // Insert single foreground cell.
  	    this.buffer[8 + this.width * (this.width - 8)] = 1;
  
  	    this._insertTimingGap();
  	    this._reverseMask();
  	    this._insertTimingRowAndColumn();
  	    this._insertVersion();
  	    this._syncMask();
  	    this._convertBitStream(this._value.length);
  	    this._calculatePolynomial();
  	    this._appendEccToData();
  	    this._interleaveBlocks();
  	    this._pack();
  	    this._finish();
  	  }
  
  	  _createClass(Frame, [{
  	    key: '_addAlignment',
  	    value: function _addAlignment(x, y) {
  	      this.buffer[x + this.width * y] = 1;
  
  	      for (var i = -2; i < 2; i++) {
  	        this.buffer[x + i + this.width * (y - 2)] = 1;
  	        this.buffer[x - 2 + this.width * (y + i + 1)] = 1;
  	        this.buffer[x + 2 + this.width * (y + i)] = 1;
  	        this.buffer[x + i + 1 + this.width * (y + 2)] = 1;
  	      }
  
  	      for (var _i = 0; _i < 2; _i++) {
  	        this._setMask(x - 1, y + _i);
  	        this._setMask(x + 1, y - _i);
  	        this._setMask(x - _i, y - 1);
  	        this._setMask(x + _i, y + 1);
  	      }
  	    }
  	  }, {
  	    key: '_appendData',
  	    value: function _appendData(data, dataLength, ecc, eccLength) {
  	      for (var i = 0; i < eccLength; i++) {
  	        this._stringBuffer[ecc + i] = 0;
  	      }
  
  	      for (var _i2 = 0; _i2 < dataLength; _i2++) {
  	        var bit = Galois.LOG[this._stringBuffer[data + _i2] ^ this._stringBuffer[ecc]];
  
  	        if (bit !== 255) {
  	          for (var j = 1; j < eccLength; j++) {
  	            this._stringBuffer[ecc + j - 1] = this._stringBuffer[ecc + j] ^ Galois.EXPONENT[Frame._modN(bit + this._polynomial[eccLength - j])];
  	          }
  	        } else {
  	          for (var _j = ecc; _j < ecc + eccLength; _j++) {
  	            this._stringBuffer[_j] = this._stringBuffer[_j + 1];
  	          }
  	        }
  
  	        this._stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois.EXPONENT[Frame._modN(bit + this._polynomial[0])];
  	      }
  	    }
  	  }, {
  	    key: '_appendEccToData',
  	    value: function _appendEccToData() {
  	      var data = 0;
  	      var ecc = this._calculateMaxLength();
  
  	      for (var i = 0; i < this._neccBlock1; i++) {
  	        this._appendData(data, this._dataBlock, ecc, this._eccBlock);
  
  	        data += this._dataBlock;
  	        ecc += this._eccBlock;
  	      }
  
  	      for (var _i3 = 0; _i3 < this._neccBlock2; _i3++) {
  	        this._appendData(data, this._dataBlock + 1, ecc, this._eccBlock);
  
  	        data += this._dataBlock + 1;
  	        ecc += this._eccBlock;
  	      }
  	    }
  	  }, {
  	    key: '_applyMask',
  	    value: function _applyMask(mask) {
  	      var width = this.width;
  
  	      switch (mask) {
  	        case 0:
  	          for (var y = 0; y < width; y++) {
  	            for (var x = 0; x < width; x++) {
  	              if (!(x + y & 1) && !this._isMasked(x, y)) {
  	                this.buffer[x + y * width] ^= 1;
  	              }
  	            }
  	          }
  
  	          break;
  	        case 1:
  	          for (var _y = 0; _y < width; _y++) {
  	            for (var _x = 0; _x < width; _x++) {
  	              if (!(_y & 1) && !this._isMasked(_x, _y)) {
  	                this.buffer[_x + _y * width] ^= 1;
  	              }
  	            }
  	          }
  
  	          break;
  	        case 2:
  	          for (var _y2 = 0; _y2 < width; _y2++) {
  	            for (var r3x = 0, _x2 = 0; _x2 < width; _x2++, r3x++) {
  	              if (r3x === 3) {
  	                r3x = 0;
  	              }
  
  	              if (!r3x && !this._isMasked(_x2, _y2)) {
  	                this.buffer[_x2 + _y2 * width] ^= 1;
  	              }
  	            }
  	          }
  
  	          break;
  	        case 3:
  	          for (var r3y = 0, _y3 = 0; _y3 < width; _y3++, r3y++) {
  	            if (r3y === 3) {
  	              r3y = 0;
  	            }
  
  	            for (var _r3x = r3y, _x3 = 0; _x3 < width; _x3++, _r3x++) {
  	              if (_r3x === 3) {
  	                _r3x = 0;
  	              }
  
  	              if (!_r3x && !this._isMasked(_x3, _y3)) {
  	                this.buffer[_x3 + _y3 * width] ^= 1;
  	              }
  	            }
  	          }
  
  	          break;
  	        case 4:
  	          for (var _y4 = 0; _y4 < width; _y4++) {
  	            for (var _r3x2 = 0, _r3y = _y4 >> 1 & 1, _x4 = 0; _x4 < width; _x4++, _r3x2++) {
  	              if (_r3x2 === 3) {
  	                _r3x2 = 0;
  	                _r3y = !_r3y;
  	              }
  
  	              if (!_r3y && !this._isMasked(_x4, _y4)) {
  	                this.buffer[_x4 + _y4 * width] ^= 1;
  	              }
  	            }
  	          }
  
  	          break;
  	        case 5:
  	          for (var _r3y2 = 0, _y5 = 0; _y5 < width; _y5++, _r3y2++) {
  	            if (_r3y2 === 3) {
  	              _r3y2 = 0;
  	            }
  
  	            for (var _r3x3 = 0, _x5 = 0; _x5 < width; _x5++, _r3x3++) {
  	              if (_r3x3 === 3) {
  	                _r3x3 = 0;
  	              }
  
  	              if (!((_x5 & _y5 & 1) + !(!_r3x3 | !_r3y2)) && !this._isMasked(_x5, _y5)) {
  	                this.buffer[_x5 + _y5 * width] ^= 1;
  	              }
  	            }
  	          }
  
  	          break;
  	        case 6:
  	          for (var _r3y3 = 0, _y6 = 0; _y6 < width; _y6++, _r3y3++) {
  	            if (_r3y3 === 3) {
  	              _r3y3 = 0;
  	            }
  
  	            for (var _r3x4 = 0, _x6 = 0; _x6 < width; _x6++, _r3x4++) {
  	              if (_r3x4 === 3) {
  	                _r3x4 = 0;
  	              }
  
  	              if (!((_x6 & _y6 & 1) + (_r3x4 && _r3x4 === _r3y3) & 1) && !this._isMasked(_x6, _y6)) {
  	                this.buffer[_x6 + _y6 * width] ^= 1;
  	              }
  	            }
  	          }
  
  	          break;
  	        case 7:
  	          for (var _r3y4 = 0, _y7 = 0; _y7 < width; _y7++, _r3y4++) {
  	            if (_r3y4 === 3) {
  	              _r3y4 = 0;
  	            }
  
  	            for (var _r3x5 = 0, _x7 = 0; _x7 < width; _x7++, _r3x5++) {
  	              if (_r3x5 === 3) {
  	                _r3x5 = 0;
  	              }
  
  	              if (!((_r3x5 && _r3x5 === _r3y4) + (_x7 + _y7 & 1) & 1) && !this._isMasked(_x7, _y7)) {
  	                this.buffer[_x7 + _y7 * width] ^= 1;
  	              }
  	            }
  	          }
  
  	          break;
  	      }
  	    }
  	  }, {
  	    key: '_calculateMaxLength',
  	    value: function _calculateMaxLength() {
  	      return this._dataBlock * (this._neccBlock1 + this._neccBlock2) + this._neccBlock2;
  	    }
  	  }, {
  	    key: '_calculatePolynomial',
  	    value: function _calculatePolynomial() {
  	      this._polynomial[0] = 1;
  
  	      for (var i = 0; i < this._eccBlock; i++) {
  	        this._polynomial[i + 1] = 1;
  
  	        for (var j = i; j > 0; j--) {
  	          this._polynomial[j] = this._polynomial[j] ? this._polynomial[j - 1] ^ Galois.EXPONENT[Frame._modN(Galois.LOG[this._polynomial[j]] + i)] : this._polynomial[j - 1];
  	        }
  
  	        this._polynomial[0] = Galois.EXPONENT[Frame._modN(Galois.LOG[this._polynomial[0]] + i)];
  	      }
  
  	      // Use logs for generator polynomial to save calculation step.
  	      for (var _i4 = 0; _i4 <= this._eccBlock; _i4++) {
  	        this._polynomial[_i4] = Galois.LOG[this._polynomial[_i4]];
  	      }
  	    }
  	  }, {
  	    key: '_checkBadness',
  	    value: function _checkBadness() {
  	      var bad = 0;
  	      var width = this.width;
  
  	      // Blocks of same colour.
  	      for (var y = 0; y < width - 1; y++) {
  	        for (var x = 0; x < width - 1; x++) {
  	          // All foreground colour.
  	          if (this.buffer[x + width * y] && this.buffer[x + 1 + width * y] && this.buffer[x + width * (y + 1)] && this.buffer[x + 1 + width * (y + 1)] ||
  	          // All background colour.
  	          !(this.buffer[x + width * y] || this.buffer[x + 1 + width * y] || this.buffer[x + width * (y + 1)] || this.buffer[x + 1 + width * (y + 1)])) {
  	            bad += Frame.N2;
  	          }
  	        }
  	      }
  
  	      var bw = 0;
  
  	      // X runs.
  	      for (var _y8 = 0; _y8 < width; _y8++) {
  	        var h = 0;
  
  	        this._badness[0] = 0;
  
  	        for (var b = 0, _x8 = 0; _x8 < width; _x8++) {
  	          var b1 = this.buffer[_x8 + width * _y8];
  
  	          if (b === b1) {
  	            this._badness[h]++;
  	          } else {
  	            this._badness[++h] = 1;
  	          }
  
  	          b = b1;
  	          bw += b ? 1 : -1;
  	        }
  
  	        bad += this._getBadness(h);
  	      }
  
  	      if (bw < 0) {
  	        bw = -bw;
  	      }
  
  	      var count = 0;
  	      var big = bw;
  	      big += big << 2;
  	      big <<= 1;
  
  	      while (big > width * width) {
  	        big -= width * width;
  	        count++;
  	      }
  
  	      bad += count * Frame.N4;
  
  	      // Y runs.
  	      for (var _x9 = 0; _x9 < width; _x9++) {
  	        var _h = 0;
  
  	        this._badness[0] = 0;
  
  	        for (var _b = 0, _y9 = 0; _y9 < width; _y9++) {
  	          var _b2 = this.buffer[_x9 + width * _y9];
  
  	          if (_b === _b2) {
  	            this._badness[_h]++;
  	          } else {
  	            this._badness[++_h] = 1;
  	          }
  
  	          _b = _b2;
  	        }
  
  	        bad += this._getBadness(_h);
  	      }
  
  	      return bad;
  	    }
  	  }, {
  	    key: '_convertBitStream',
  	    value: function _convertBitStream(length) {
  	      // Convert string to bit stream. 8-bit data to QR-coded 8-bit data (numeric, alphanumeric, or kanji not supported).
  	      for (var i = 0; i < length; i++) {
  	        this._ecc[i] = this._value.charCodeAt(i);
  	      }
  
  	      this._stringBuffer = this._ecc.slice(0);
  
  	      var maxLength = this._calculateMaxLength();
  
  	      if (length >= maxLength - 2) {
  	        length = maxLength - 2;
  
  	        if (this._version > 9) {
  	          length--;
  	        }
  	      }
  
  	      // Shift and re-pack to insert length prefix.
  	      var index = length;
  
  	      if (this._version > 9) {
  	        this._stringBuffer[index + 2] = 0;
  	        this._stringBuffer[index + 3] = 0;
  
  	        while (index--) {
  	          var bit = this._stringBuffer[index];
  
  	          this._stringBuffer[index + 3] |= 255 & bit << 4;
  	          this._stringBuffer[index + 2] = bit >> 4;
  	        }
  
  	        this._stringBuffer[2] |= 255 & length << 4;
  	        this._stringBuffer[1] = length >> 4;
  	        this._stringBuffer[0] = 0x40 | length >> 12;
  	      } else {
  	        this._stringBuffer[index + 1] = 0;
  	        this._stringBuffer[index + 2] = 0;
  
  	        while (index--) {
  	          var _bit = this._stringBuffer[index];
  
  	          this._stringBuffer[index + 2] |= 255 & _bit << 4;
  	          this._stringBuffer[index + 1] = _bit >> 4;
  	        }
  
  	        this._stringBuffer[1] |= 255 & length << 4;
  	        this._stringBuffer[0] = 0x40 | length >> 4;
  	      }
  
  	      // Fill to end with pad pattern.
  	      index = length + 3 - (this._version < 10);
  
  	      while (index < maxLength) {
  	        this._stringBuffer[index++] = 0xec;
  	        this._stringBuffer[index++] = 0x11;
  	      }
  	    }
  	  }, {
  	    key: '_getBadness',
  	    value: function _getBadness(length) {
  	      var badRuns = 0;
  
  	      for (var i = 0; i <= length; i++) {
  	        if (this._badness[i] >= 5) {
  	          badRuns += Frame.N1 + this._badness[i] - 5;
  	        }
  	      }
  
  	      // FBFFFBF as in finder.
  	      for (var _i5 = 3; _i5 < length - 1; _i5 += 2) {
  	        if (this._badness[_i5 - 2] === this._badness[_i5 + 2] && this._badness[_i5 + 2] === this._badness[_i5 - 1] && this._badness[_i5 - 1] === this._badness[_i5 + 1] && this._badness[_i5 - 1] * 3 === this._badness[_i5] && (
  	        // Background around the foreground pattern? Not part of the specs.
  	        this._badness[_i5 - 3] === 0 || _i5 + 3 > length || this._badness[_i5 - 3] * 3 >= this._badness[_i5] * 4 || this._badness[_i5 + 3] * 3 >= this._badness[_i5] * 4)) {
  	          badRuns += Frame.N3;
  	        }
  	      }
  
  	      return badRuns;
  	    }
  	  }, {
  	    key: '_finish',
  	    value: function _finish() {
  	      // Save pre-mask copy of frame.
  	      this._stringBuffer = this.buffer.slice(0);
  
  	      var bit = 0;
  	      var i = void 0;
  	      var mask = 30000;
  
  	      /*
  	       * Using for instead of while since in original Arduino code if an early mask was "good enough" it wouldn't try for
  	       * a better one since they get more complex and take longer.
  	       */
  	      for (i = 0; i < 8; i++) {
  	        // Returns foreground-background imbalance.
  	        this._applyMask(i);
  
  	        var currentMask = this._checkBadness();
  
  	        // Is current mask better than previous best?
  	        if (currentMask < mask) {
  	          mask = currentMask;
  	          bit = i;
  	        }
  
  	        // Don't increment "i" to a void redoing mask.
  	        if (bit === 7) {
  	          break;
  	        }
  
  	        // Reset for next pass.
  	        this.buffer = this._stringBuffer.slice(0);
  	      }
  
  	      // Redo best mask as none were "good enough" (i.e. last wasn't bit).
  	      if (bit !== i) {
  	        this._applyMask(bit);
  	      }
  
  	      // Add in final mask/ECC level bytes.
  	      mask = ErrorCorrection.FINAL_FORMAT[bit + (this._level - 1 << 3)];
  
  	      // Low byte.
  	      for (i = 0; i < 8; i++, mask >>= 1) {
  	        if (mask & 1) {
  	          this.buffer[this.width - 1 - i + this.width * 8] = 1;
  
  	          if (i < 6) {
  	            this.buffer[8 + this.width * i] = 1;
  	          } else {
  	            this.buffer[8 + this.width * (i + 1)] = 1;
  	          }
  	        }
  	      }
  
  	      // High byte.
  	      for (i = 0; i < 7; i++, mask >>= 1) {
  	        if (mask & 1) {
  	          this.buffer[8 + this.width * (this.width - 7 + i)] = 1;
  
  	          if (i) {
  	            this.buffer[6 - i + this.width * 8] = 1;
  	          } else {
  	            this.buffer[7 + this.width * 8] = 1;
  	          }
  	        }
  	      }
  	    }
  	  }, {
  	    key: '_interleaveBlocks',
  	    value: function _interleaveBlocks() {
  	      var maxLength = this._calculateMaxLength();
  	      var i = void 0;
  	      var k = 0;
  
  	      for (i = 0; i < this._dataBlock; i++) {
  	        for (var j = 0; j < this._neccBlock1; j++) {
  	          this._ecc[k++] = this._stringBuffer[i + j * this._dataBlock];
  	        }
  
  	        for (var _j2 = 0; _j2 < this._neccBlock2; _j2++) {
  	          this._ecc[k++] = this._stringBuffer[this._neccBlock1 * this._dataBlock + i + _j2 * (this._dataBlock + 1)];
  	        }
  	      }
  
  	      for (var _j3 = 0; _j3 < this._neccBlock2; _j3++) {
  	        this._ecc[k++] = this._stringBuffer[this._neccBlock1 * this._dataBlock + i + _j3 * (this._dataBlock + 1)];
  	      }
  
  	      for (i = 0; i < this._eccBlock; i++) {
  	        for (var _j4 = 0; _j4 < this._neccBlock1 + this._neccBlock2; _j4++) {
  	          this._ecc[k++] = this._stringBuffer[maxLength + i + _j4 * this._eccBlock];
  	        }
  	      }
  
  	      this._stringBuffer = this._ecc;
  	    }
  	  }, {
  	    key: '_insertAlignments',
  	    value: function _insertAlignments() {
  	      var width = this.width;
  
  	      if (this._version > 1) {
  	        var i = Alignment.BLOCK[this._version];
  	        var y = width - 7;
  
  	        for (;;) {
  	          var x = width - 7;
  
  	          while (x > i - 3) {
  	            this._addAlignment(x, y);
  
  	            if (x < i) {
  	              break;
  	            }
  
  	            x -= i;
  	          }
  
  	          if (y <= i + 9) {
  	            break;
  	          }
  
  	          y -= i;
  
  	          this._addAlignment(6, y);
  	          this._addAlignment(y, 6);
  	        }
  	      }
  	    }
  	  }, {
  	    key: '_insertFinders',
  	    value: function _insertFinders() {
  	      var width = this.width;
  
  	      for (var i = 0; i < 3; i++) {
  	        var j = 0;
  	        var y = 0;
  
  	        if (i === 1) {
  	          j = width - 7;
  	        }
  	        if (i === 2) {
  	          y = width - 7;
  	        }
  
  	        this.buffer[y + 3 + width * (j + 3)] = 1;
  
  	        for (var x = 0; x < 6; x++) {
  	          this.buffer[y + x + width * j] = 1;
  	          this.buffer[y + width * (j + x + 1)] = 1;
  	          this.buffer[y + 6 + width * (j + x)] = 1;
  	          this.buffer[y + x + 1 + width * (j + 6)] = 1;
  	        }
  
  	        for (var _x10 = 1; _x10 < 5; _x10++) {
  	          this._setMask(y + _x10, j + 1);
  	          this._setMask(y + 1, j + _x10 + 1);
  	          this._setMask(y + 5, j + _x10);
  	          this._setMask(y + _x10 + 1, j + 5);
  	        }
  
  	        for (var _x11 = 2; _x11 < 4; _x11++) {
  	          this.buffer[y + _x11 + width * (j + 2)] = 1;
  	          this.buffer[y + 2 + width * (j + _x11 + 1)] = 1;
  	          this.buffer[y + 4 + width * (j + _x11)] = 1;
  	          this.buffer[y + _x11 + 1 + width * (j + 4)] = 1;
  	        }
  	      }
  	    }
  	  }, {
  	    key: '_insertTimingGap',
  	    value: function _insertTimingGap() {
  	      var width = this.width;
  
  	      for (var y = 0; y < 7; y++) {
  	        this._setMask(7, y);
  	        this._setMask(width - 8, y);
  	        this._setMask(7, y + width - 7);
  	      }
  
  	      for (var x = 0; x < 8; x++) {
  	        this._setMask(x, 7);
  	        this._setMask(x + width - 8, 7);
  	        this._setMask(x, width - 8);
  	      }
  	    }
  	  }, {
  	    key: '_insertTimingRowAndColumn',
  	    value: function _insertTimingRowAndColumn() {
  	      var width = this.width;
  
  	      for (var x = 0; x < width - 14; x++) {
  	        if (x & 1) {
  	          this._setMask(8 + x, 6);
  	          this._setMask(6, 8 + x);
  	        } else {
  	          this.buffer[8 + x + width * 6] = 1;
  	          this.buffer[6 + width * (8 + x)] = 1;
  	        }
  	      }
  	    }
  	  }, {
  	    key: '_insertVersion',
  	    value: function _insertVersion() {
  	      var width = this.width;
  
  	      if (this._version > 6) {
  	        var i = Version.BLOCK[this._version - 7];
  	        var j = 17;
  
  	        for (var x = 0; x < 6; x++) {
  	          for (var y = 0; y < 3; y++, j--) {
  	            if (1 & (j > 11 ? this._version >> j - 12 : i >> j)) {
  	              this.buffer[5 - x + width * (2 - y + width - 11)] = 1;
  	              this.buffer[2 - y + width - 11 + width * (5 - x)] = 1;
  	            } else {
  	              this._setMask(5 - x, 2 - y + width - 11);
  	              this._setMask(2 - y + width - 11, 5 - x);
  	            }
  	          }
  	        }
  	      }
  	    }
  	  }, {
  	    key: '_isMasked',
  	    value: function _isMasked(x, y) {
  	      var bit = Frame._getMaskBit(x, y);
  
  	      return this._mask[bit] === 1;
  	    }
  	  }, {
  	    key: '_pack',
  	    value: function _pack() {
  	      var x = this.width - 1;
  	      var y = this.width - 1;
  	      var k = 1;
  	      var v = 1;
  
  	      // Interleaved data and ECC codes.
  	      var length = (this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2) + this._neccBlock2;
  
  	      for (var i = 0; i < length; i++) {
  	        var bit = this._stringBuffer[i];
  
  	        for (var j = 0; j < 8; j++, bit <<= 1) {
  	          if (0x80 & bit) {
  	            this.buffer[x + this.width * y] = 1;
  	          }
  
  	          // Find next fill position.
  	          do {
  	            if (v) {
  	              x--;
  	            } else {
  	              x++;
  
  	              if (k) {
  	                if (y !== 0) {
  	                  y--;
  	                } else {
  	                  x -= 2;
  	                  k = !k;
  
  	                  if (x === 6) {
  	                    x--;
  	                    y = 9;
  	                  }
  	                }
  	              } else if (y !== this.width - 1) {
  	                y++;
  	              } else {
  	                x -= 2;
  	                k = !k;
  
  	                if (x === 6) {
  	                  x--;
  	                  y -= 8;
  	                }
  	              }
  	            }
  
  	            v = !v;
  	          } while (this._isMasked(x, y));
  	        }
  	      }
  	    }
  	  }, {
  	    key: '_reverseMask',
  	    value: function _reverseMask() {
  	      var width = this.width;
  
  	      for (var x = 0; x < 9; x++) {
  	        this._setMask(x, 8);
  	      }
  
  	      for (var _x12 = 0; _x12 < 8; _x12++) {
  	        this._setMask(_x12 + width - 8, 8);
  	        this._setMask(8, _x12);
  	      }
  
  	      for (var y = 0; y < 7; y++) {
  	        this._setMask(8, y + width - 7);
  	      }
  	    }
  	  }, {
  	    key: '_setMask',
  	    value: function _setMask(x, y) {
  	      var bit = Frame._getMaskBit(x, y);
  
  	      this._mask[bit] = 1;
  	    }
  	  }, {
  	    key: '_syncMask',
  	    value: function _syncMask() {
  	      var width = this.width;
  
  	      for (var y = 0; y < width; y++) {
  	        for (var x = 0; x <= y; x++) {
  	          if (this.buffer[x + width * y]) {
  	            this._setMask(x, y);
  	          }
  	        }
  	      }
  	    }
  	  }]);
  
  	  return Frame;
  	}();
  
  
  
  	/**
  	 * The options used by {@link Frame}.
  	 *
  	 * @typedef {Object} Frame~Options
  	 * @property {string} level - The ECC level to be used.
  	 * @property {string} value - The value to be encoded.
  	 */
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * An implementation of {@link Renderer} for working with <code>img</code> elements.
  	 *
  	 * This depends on {@link CanvasRenderer} being executed first as this implementation simply applies the data URL from
  	 * the rendered <code>canvas</code> element as the <code>src</code> for the <code>img</code> element being rendered.
  	 *
  	 * @public
  	 * @extends Renderer
  	 */
  
  	var ImageRenderer = function (_Renderer) {
  	  _inherits(ImageRenderer, _Renderer);
  
  	  function ImageRenderer() {
  	    _classCallCheck(this, ImageRenderer);
  
  	    return _possibleConstructorReturn(this, (ImageRenderer.__proto__ || _Object$getPrototypeOf(ImageRenderer)).apply(this, arguments));
  	  }
  
  	  _createClass(ImageRenderer, [{
  	    key: 'draw',
  
  
  	    /**
  	     * @override
  	     */
  	    value: function draw() {
  	      this.element.src = this.qrious.toDataURL();
  	    }
  
  	    /**
  	     * @override
  	     */
  
  	  }, {
  	    key: 'reset',
  	    value: function reset() {
  	      this.element.src = '';
  	    }
  
  	    /**
  	     * @override
  	     */
  
  	  }, {
  	    key: 'resize',
  	    value: function resize() {
  	      this.element.width = this.element.height = this.qrious.size;
  	    }
  	  }]);
  
  	  return ImageRenderer;
  	}(Renderer);
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * Defines an available option while also configuring how values are applied to the target object.
  	 *
  	 * While a value associated with an option can be changed on the target object, the option definition itself is
  	 * immutable.
  	 *
  	 * @public
  	 */
  	var Option = function () {
  
  	  /**
  	   * Creates a new instance of {@link Option} based on the <code>name</code> provided.
  	   *
  	   * Optionally, a <code>defaultValue</code> can be specified as well a <code>valueTransformer</code> and
  	   * <code>fieldNameResolver</code> for greater control over how the option value is applied.
  	   *
  	   * If no <code>valueTransformer</code> is specified, then any specified option will be applied directly.
  	   *
  	   * If no <code>fieldNameResolver</code> is specified, then the field name will be resolved to <code>name</code>
  	   * prefixed with a single underscore when the option is applied.
  	   *
  	   * @param {string} name - the name to be used
  	   * @param {*} [defaultValue] - the default value to be used
  	   * @param {Option~ValueTransformer} [valueTransformer] - the value transformer to be used
  	   * @param {Option~FieldNameResolver} [fieldNameResolver] - the field name resolver to be used
  	   * @public
  	   */
  	  function Option(name, defaultValue, valueTransformer, fieldNameResolver) {
  	    _classCallCheck(this, Option);
  
  	    this._name = name;
  	    this._defaultValue = defaultValue;
  	    this._valueTransformer = valueTransformer;
  	    this._fieldName = typeof fieldNameResolver === 'function' ? fieldNameResolver(this) : '_' + name;
  	  }
  
  	  /**
  	   * Transforms the specified <code>value</code> so that it can be applied for this {@link Option}.
  	   *
  	   * If a value transformer has been specified for this {@link Option}, it will be called upon to transform
  	   * <code>value</code>. Otherwise, <code>value</code> will be returned directly.
  	   *
  	   * @param {*} value - the value to be transformed
  	   * @return {*} The transformed value or <code>value</code> if no value transformer is specified.
  	   * @public
  	   */
  
  
  	  _createClass(Option, [{
  	    key: 'transform',
  	    value: function transform(value) {
  	      var transformer = this._valueTransformer;
  	      if (typeof transformer === 'function') {
  	        return transformer(value, this);
  	      }
  
  	      return value;
  	    }
  
  	    /**
  	     * Returns the field name for this {@link Option}.
  	     *
  	     * @return {string} The field name.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'fieldName',
  	    get: function get() {
  	      return this._fieldName;
  	    }
  
  	    /**
  	     * Returns the name for this {@link Option}.
  	     *
  	     * @return {string} The name.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'name',
  	    get: function get() {
  	      return this._name;
  	    }
  
  	    /**
  	     * Returns the default value for this {@link Option}.
  	     *
  	     * @return {*} The default value.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'defaultValue',
  	    get: function get() {
  	      return this._defaultValue;
  	    }
  	  }]);
  
  	  return Option;
  	}();
  
  
  
  	/**
  	 * Returns the field name to which the specified <code>option</code> is associated on the target object.
  	 *
  	 * The resolved name will be used to identify the field that values for <code>option</code> are to be read from and
  	 * written to.
  	 *
  	 * This function will only called once for <code>option</code>, upon initialization.
  	 *
  	 * @callback Option~FieldNameResolver
  	 * @param {Option} option - the {@link Option} whose field name is to be resolved
  	 * @return {string} The resolved field name for <code>option</code>.
  	 */
  
  	/**
  	 * Returns a transformed value for the specified <code>value</code> to be applied for the <code>option</code> provided.
  	 *
  	 * @callback Option~ValueTransformer
  	 * @param {*} value - the value to be transformed
  	 * @param {Option} option - the {@link Option} for which <code>value</code> is being transformed
  	 * @return {*} The transform value.
  	 */
  
  	var isEnum$1    = _objectPie.f;
  	var _objectToArray = function(isEntries){
  	  return function(it){
  	    var O      = _toIobject(it)
  	      , keys   = _objectKeys(O)
  	      , length = keys.length
  	      , i      = 0
  	      , result = []
  	      , key;
  	    while(length > i)if(isEnum$1.call(O, key = keys[i++])){
  	      result.push(isEntries ? [key, O[key]] : O[key]);
  	    } return result;
  	  };
  	};
  
  	// https://github.com/tc39/proposal-object-values-entries
  	var $values = _objectToArray(false);
  
  	_export(_export.S, 'Object', {
  	  values: function values(it){
  	    return $values(it);
  	  }
  	});
  
  	var values$1 = _core.Object.values;
  
  	var values = createCommonjsModule(function (module) {
  	module.exports = { "default": values$1, __esModule: true };
  	});
  
  	var _Object$values = unwrapExports(values);
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * Manages multiple {@link Option} instances that are intended to be used by multiple implementations.
  	 *
  	 * Although the option definitions are shared between targets, the values are maintained on the targets themselves.
  	 *
  	 * While a value associated with each option can be changed on the target objects, the manager and the option
  	 * definitions themselves are immutable.
  	 *
  	 * @public
  	 */
  
  	var OptionManager = function () {
  	  _createClass(OptionManager, null, [{
  	    key: '_get',
  	    value: function _get(option, target) {
  	      return target[option.fieldName];
  	    }
  	  }, {
  	    key: '_set',
  	    value: function _set(option, value, target) {
  	      var fieldName = option.fieldName;
  	      var oldValue = target[fieldName];
  	      var newValue = option.transform(value != null ? value : option.defaultValue);
  
  	      target[fieldName] = newValue;
  
  	      return newValue !== oldValue;
  	    }
  
  	    /**
  	     * Creates a new instance of {@link OptionManager} for the specified available <code>options</code>.
  	     *
  	     * @param {Option[]} options - the options to be used
  	     * @public
  	     */
  
  	  }]);
  
  	  function OptionManager(options) {
  	    var _this = this;
  
  	    _classCallCheck(this, OptionManager);
  
  	    this._options = {};
  
  	    options.forEach(function (option) {
  	      _this._options[option.name] = option;
  	    });
  	  }
  
  	  /**
  	   * Sets the default values for all of the available options on the <code>target</code> object provided.
  	   *
  	   * @param {Object} target - the object on which the default values are to be set for each available option
  	   * @return {void}
  	   * @public
  	   */
  
  
  	  _createClass(OptionManager, [{
  	    key: 'applyDefaults',
  	    value: function applyDefaults(target) {
  	      var options = this._options;
  
  	      for (var name in options) {
  	        if (Utilities.hasOwn(options, name)) {
  	          var option = options[name];
  
  	          OptionManager._set(option, option.defaultValue, target);
  	        }
  	      }
  	    }
  
  	    /**
  	     * Returns whether an option with the specified <code>name</code> is available.
  	     *
  	     * @param {string} name - the name of the {@link Option} whose existence is to be checked
  	     * @return {boolean} <code>true</code> if an {@link Option} exists with <code>name</code>; otherwise
  	     * <code>false</code>.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'exists',
  	    value: function exists(name) {
  	      return this._options[name] != null;
  	    }
  
  	    /**
  	     * Returns the value of the option with the specified <code>name</code> on the <code>target</code> object provided.
  	     *
  	     * @param {string} name - the name of the {@link Option} whose value on <code>target</code> is to be returned
  	     * @param {Object} target - the object from which the value of the named {@link Option} is to be returned
  	     * @return {*} The value of the {@link Option} with <code>name</code> on <code>target</code>.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'get',
  	    value: function get(name, target) {
  	      return OptionManager._get(this._options[name], target);
  	    }
  
  	    /**
  	     * Returns a copy of all of the available options on the <code>target</code> object provided.
  	     *
  	     * @param {Object} target - the object from which the option name/value pairs are to be returned
  	     * @return {Object.<string, *>} A hash containing the name/value pairs of all options on <code>target</code>.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'getAll',
  	    value: function getAll(target) {
  	      var options = this._options;
  	      var result = {};
  
  	      for (var name in options) {
  	        if (Utilities.hasOwn(options, name)) {
  	          result[name] = OptionManager._get(options[name], target);
  	        }
  	      }
  
  	      return result;
  	    }
  
  	    /**
  	     * Sets the value of the option with the specified <code>name</code> on the <code>target</code> object provided to
  	     * <code>value</code>.
  	     *
  	     * This method will throw an error if <code>name</code> does not match an available option.
  	     *
  	     * If <code>value</code> is <code>null</code> and the {@link Option} has a default value configured, then that default
  	     * value will be used instead. If the {@link Option} also has a value transformer configured, it will be used to
  	     * transform whichever value was determined to be used.
  	     *
  	     * This method returns whether the value of the underlying field on <code>target</code> was changed as a result.
  	     *
  	     * @param {string} name - the name of the {@link Option} whose value is to be set
  	     * @param {*} value - the value to be set for the named {@link Option} on <code>target</code>
  	     * @param {Object} target - the object on which <code>value</code> is to be set for the named {@link Option}
  	     * @return {boolean} <code>true</code> if the underlying field on <code>target</code> was changed; otherwise
  	     * <code>false</code>.
  	     * @throws {Error} If no {@link Option} is being managed with <code>name</code>.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'set',
  	    value: function set(name, value, target) {
  	      var option = this._options[name];
  	      if (!option) {
  	        throw new Error('Invalid option: ' + name);
  	      }
  
  	      return OptionManager._set(option, value, target);
  	    }
  
  	    /**
  	     * Sets all of the specified <code>options</code> on the <code>target</code> object provided to their corresponding
  	     * values.
  	     *
  	     * This method will throw an error if any of the names within <code>options</code> does not match an available option.
  	     *
  	     * If any value within <code>options</code> is <code>null</code> and the corresponding {@link Option} has a default
  	     * value configured, then that default value will be used instead. If an {@link Option} also has a value transformer
  	     * configured, it will be used to transform whichever value was determined to be used.
  	     *
  	     * This method returns whether the value for any of the underlying fields on <code>target</code> were changed as a
  	     * result.
  	     *
  	     * @param {Object.<string, *>} options - the name/value pairs of options to be set
  	     * @param {Object} target - the object on which the options are to be set
  	     * @return {boolean} <code>true</code> if any of the underlying fields on <code>target</code> were changed; otherwise
  	     * <code>false</code>.
  	     * @throws {Error} If no {@link Option} is being managed with for any of the names within <code>options</code>.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'setAll',
  	    value: function setAll(options, target) {
  	      if (!options) {
  	        return false;
  	      }
  
  	      var changed = false;
  
  	      for (var name in options) {
  	        if (Utilities.hasOwn(options, name) && this.set(name, options[name], target)) {
  	          changed = true;
  	        }
  	      }
  
  	      return changed;
  	    }
  
  	    /**
  	     * Returns a copy of the available options for this {@link OptionManager}.
  	     *
  	     * @return {Option[]} The available options.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'options',
  	    get: function get() {
  	      return _Object$values(this._options);
  	    }
  	  }]);
  
  	  return OptionManager;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	/**
  	 * A basic manager for {@link Service} implementations that are mapped to simple names.
  	 *
  	 * @public
  	 */
  	var ServiceManager = function () {
  
  	  /**
  	   * Creates a new instance of {@link ServiceManager}.
  	   *
  	   * @public
  	   */
  	  function ServiceManager() {
  	    _classCallCheck(this, ServiceManager);
  
  	    this._services = {};
  	  }
  
  	  /**
  	   * Returns the {@link Service} being managed with the specified <code>name</code>.
  	   *
  	   * @param {string} name - the name of the {@link Service} to be returned
  	   * @return {Service} The {@link Service} is being managed with <code>name</code>.
  	   * @throws {Error} If no {@link Service} is being managed with <code>name</code>.
  	   * @public
  	   */
  
  
  	  _createClass(ServiceManager, [{
  	    key: "getService",
  	    value: function getService(name) {
  	      var service = this._services[name];
  	      if (!service) {
  	        throw new Error("Service is not being managed with name: " + name);
  	      }
  
  	      return service;
  	    }
  
  	    /**
  	     * Sets the {@link Service} implementation to be managed for the specified <code>name</code> to the
  	     * <code>service</code> provided.
  	     *
  	     * @param {string} name - the name of the {@link Service} to be managed with <code>name</code>
  	     * @param {Service} service - the {@link Service} implementation to be managed
  	     * @return {void}
  	     * @throws {Error} If a {@link Service} is already being managed with the same <code>name</code>.
  	     * @public
  	     */
  
  	  }, {
  	    key: "setService",
  	    value: function setService(name, service) {
  	      if (this._services[name]) {
  	        throw new Error("Service is already managed with name: " + name);
  	      }
  
  	      if (service) {
  	        this._services[name] = service;
  	      }
  	    }
  	  }]);
  
  	  return ServiceManager;
  	}();
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	var optionManager = new OptionManager([new Option('background', 'white'), new Option('backgroundAlpha', 1, Utilities.abs), new Option('element'), new Option('foreground', 'black'), new Option('foregroundAlpha', 1, Utilities.abs), new Option('level', 'L', Utilities.toUpperCase), new Option('mime', 'image/png'), new Option('padding', null, Utilities.abs), new Option('size', 100, Utilities.abs), new Option('value', '')]);
  	var serviceManager = new ServiceManager();
  
  	/**
  	 * Enables configuration of a QR code generator which uses HTML5 <code>canvas</code> for rendering.
  	 *
  	 * @public
  	 */
  
  	var QRious$1 = function () {
  	  _createClass(QRious, null, [{
  	    key: 'use',
  
  
  	    /**
  	     * Configures the <code>service</code> provided to be used by all {@link QRious} instances.
  	     *
  	     * @param {Service} service - the {@link Service} to be configured
  	     * @return {void}
  	     * @throws {Error} If a {@link Service} has already been configured with the same name.
  	     * @public
  	     * @static
  	     */
  	    value: function use(service) {
  	      serviceManager.setService(service.getName(), service);
  	    }
  
  	    /**
  	     * Creates a new instance of {@link QRious} based on the <code>options</code> provided.
  	     *
  	     * @param {QRious~Options} [options] - the options to be used
  	     * @throws {Error} If any <code>options</code> are invalid.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'DEFAULTS',
  
  
  	    /**
  	     * Returns the default options for {@link QRious}.
  	     *
  	     * @return {QRious~Options} The default options.
  	     * @deprecated Since 2.3.0
  	     * @public
  	     * @static
  	     */
  	    get: function get() {
  	      var result = {};
  
  	      optionManager.options.forEach(function (option) {
  	        result[option.name] = option.defaultValue;
  	      });
  
  	      return result;
  	    }
  
  	    /**
  	     * Returns the current version of {@link QRious}.
  	     *
  	     * @return {string} The current version.
  	     * @public
  	     * @static
  	     */
  
  	  }, {
  	    key: 'VERSION',
  	    get: function get() {
  	      return '2.3.0';
  	    }
  	  }]);
  
  	  function QRious(options) {
  	    _classCallCheck(this, QRious);
  
  	    optionManager.applyDefaults(this);
  	    optionManager.setAll(options, this);
  
  	    var element = optionManager.get('element', this);
  	    var elementService = serviceManager.getService('element');
  	    var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas();
  	    var image = element && elementService.isImage(element) ? element : elementService.createImage();
  
  	    this._canvasRenderer = new CanvasRenderer(this, canvas, true);
  	    this._imageRenderer = new ImageRenderer(this, image, image === element);
  
  	    this.update();
  	  }
  
  	  /**
  	   * Returns all of the options configured for this {@link QRious}.
  	   *
  	   * Any changes made to the returned object will not be reflected in the options themselves or their corresponding
  	   * underlying fields.
  	   *
  	   * @return {Object.<string, *>} A copy of the applied options.
  	   * @public
  	   */
  
  
  	  _createClass(QRious, [{
  	    key: 'get',
  	    value: function get() {
  	      return optionManager.getAll(this);
  	    }
  
  	    /**
  	     * Sets all of the specified <code>options</code> and automatically updates this {@link QRious} if any of the
  	     * underlying fields are changed as a result.
  	     *
  	     * This is the preferred method for updating multiple options at one time to avoid unnecessary updates between
  	     * changes.
  	     *
  	     * @param {QRious~Options} options - the options to be set
  	     * @return {void}
  	     * @throws {Error} If any <code>options</code> are invalid.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'set',
  	    value: function set(options) {
  	      if (optionManager.setAll(options, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the image data URI for the generated QR code using the <code>mime</code> provided.
  	     *
  	     * @param {string} [mime] - the MIME type for the image
  	     * @return {string} The image data URI for the QR code.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'toDataURL',
  	    value: function toDataURL(mime) {
  	      return this.canvas.toDataURL(mime || this.mime);
  	    }
  
  	    /**
  	     * Updates this {@link QRious} by generating a new {@link Frame} and re-rendering the QR code.
  	     *
  	     * @return {void}
  	     * @protected
  	     */
  
  	  }, {
  	    key: 'update',
  	    value: function update() {
  	      var frame = new Frame({
  	        level: this.level,
  	        value: this.value
  	      });
  
  	      this._canvasRenderer.render(frame);
  	      this._imageRenderer.render(frame);
  	    }
  
  	    /**
  	     * Returns the background color for the QR code.
  	     *
  	     * @return {string} The background color.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'background',
  	    get: function get() {
  	      return optionManager.get('background', this);
  	    }
  
  	    /**
  	     * Sets the background color for the QR code to <code>background</code> and automatically updates this {@link QRious}
  	     * if the underlying field is changed as a result.
  	     *
  	     * @param {string} [background="white"] - the background color to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(background) {
  	      if (optionManager.set('background', background, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the background alpha for the QR code.
  	     *
  	     * @return {number} The background alpha.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'backgroundAlpha',
  	    get: function get() {
  	      return optionManager.get('backgroundAlpha', this);
  	    }
  
  	    /**
  	     * Sets the background alpha for the QR code to <code>backgroundAlpha</code> and automatically updates this
  	     * {@link QRious} if the underlying field is changed as a result.
  	     *
  	     * @param {number} [backgroundAlpha=1] - the background alpha to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(backgroundAlpha) {
  	      if (optionManager.set('backgroundAlpha', backgroundAlpha, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the <code>canvas</code> element being used to render the QR code for this {@link QRious}.
  	     *
  	     * @return {*} The <code>canvas</code> element.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'canvas',
  	    get: function get() {
  	      return this._canvasRenderer.getElement();
  	    }
  
  	    /**
  	     * Returns the foreground color for the QR code.
  	     *
  	     * @return {string} The foreground color.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'foreground',
  	    get: function get() {
  	      return optionManager.get('foreground', this);
  	    }
  
  	    /**
  	     * Sets the foreground color for the QR code to <code>foreground</code> and automatically updates this {@link QRious}
  	     * if the underlying field is changed as a result.
  	     *
  	     * @param {string} [foreground="black"] - the foreground color to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(foreground) {
  	      if (optionManager.set('foreground', foreground, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the foreground alpha for the QR code.
  	     *
  	     * @return {number} The foreground alpha.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'foregroundAlpha',
  	    get: function get() {
  	      return optionManager.get('foregroundAlpha', this);
  	    }
  
  	    /**
  	     * Sets the foreground alpha for the QR code to <code>foregroundAlpha</code> and automatically updates this
  	     * {@link QRious} if the underlying field is changed as a result.
  	     *
  	     * @param {number} [foregroundAlpha=1] - the foreground alpha to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(foregroundAlpha) {
  	      if (optionManager.set('foregroundAlpha', foregroundAlpha, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the <code>img</code> element being used to render the QR code for this {@link QRious}.
  	     *
  	     * @return {*} The <code>img</code> element.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'image',
  	    get: function get() {
  	      return this._imageRenderer.getElement();
  	    }
  
  	    /**
  	     * Returns the error correction level for the QR code.
  	     *
  	     * @return {string} The ECC level.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'level',
  	    get: function get() {
  	      return optionManager.get('level', this);
  	    }
  
  	    /**
  	     * Sets the error correction level for the QR code to <code>level</code> and automatically updates this {@link QRious}
  	     * if the underlying field is changed as a result.
  	     *
  	     * <code>level</code> will be transformed to upper case to aid mapping to known ECC level blocks.
  	     *
  	     * @param {string} [level="L"] - the ECC level to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(level) {
  	      if (optionManager.set('level', level, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the MIME type for the image rendered for the QR code.
  	     *
  	     * @return {string} The image MIME type.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'mime',
  	    get: function get() {
  	      return optionManager.get('mime', this);
  	    }
  
  	    /**
  	     * Sets the MIME type for the image rendered for the QR code to <code>mime</code> and automatically updates this
  	     * {@link QRious} if the underlying field is changed as a result.
  	     *
  	     * @param {string} [mime="image/png"] - the image MIME type to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(mime) {
  	      if (optionManager.set('mime', mime, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the padding for the QR code.
  	     *
  	     * @return {number} The padding in pixels.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'padding',
  	    get: function get() {
  	      return optionManager.get('padding', this);
  	    }
  
  	    /**
  	     * Sets the padding for the QR code to <code>padding</code> and automatically updates this {@link QRious} if the
  	     * underlying field is changed as a result.
  	     *
  	     * <code>padding</code> will be transformed to ensure that it is always an absolute positive numbers (e.g.
  	     * <code>-10</code> would become <code>10</code>).
  	     *
  	     * @param {number} [padding] - the padding in pixels to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(padding) {
  	      if (optionManager.set('padding', padding, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the size of the QR code.
  	     *
  	     * @return {number} The size in pixels.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'size',
  	    get: function get() {
  	      return optionManager.get('size', this);
  	    }
  
  	    /**
  	     * Sets the size of the QR code to <code>size</code> and automatically updates this {@link QRious} if the underlying
  	     * field is changed as a result.
  	     *
  	     * <code>size</code> will be transformed to ensure that it is always an absolute positive numbers (e.g.
  	     * <code>-100</code> would become <code>100</code>).
  	     *
  	     * @param {number} [size=100] - the size in pixels to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(size) {
  	      if (optionManager.set('size', size, this)) {
  	        this.update();
  	      }
  	    }
  
  	    /**
  	     * Returns the value of the QR code.
  	     *
  	     * @return {string} The value.
  	     * @public
  	     */
  
  	  }, {
  	    key: 'value',
  	    get: function get() {
  	      return optionManager.get('value', this);
  	    }
  
  	    /**
  	     * Sets the value of the QR code to <code>value</code> and automatically updates this {@link QRious} if the underlying
  	     * field is changed as a result.
  	     *
  	     * @param {string} [value=""] - the value to be set
  	     * @public
  	     */
  	    ,
  	    set: function set(value) {
  	      if (optionManager.set('value', value, this)) {
  	        this.update();
  	      }
  	    }
  	  }]);
  
  	  return QRious;
  	}();
  
  
  
  	/**
  	 * The options used by {@link QRious}.
  	 *
  	 * @typedef {Object} QRious~Options
  	 * @property {string} [background="white"] - The background color to be applied to the QR code.
  	 * @property {number} [backgroundAlpha=1] - The background alpha to be applied to the QR code.
  	 * @property {*} [element] - The element to be used to render the QR code which may either be an <code>canvas</code> or
  	 * <code>img</code>. The element(s) will be created if needed.
  	 * @property {string} [foreground="black"] - The foreground color to be applied to the QR code.
  	 * @property {number} [foregroundAlpha=1] - The foreground alpha to be applied to the QR code.
  	 * @property {string} [level="L"] - The error correction level to be applied to the QR code.
  	 * @property {string} [mime="image/png"] - The MIME type to be used to render the image for the QR code.
  	 * @property {number} [padding] - The padding for the QR code in pixels.
  	 * @property {number} [size=100] - The size of the QR code in pixels.
  	 * @property {string} [value=""] - The value to be encoded within the QR code.
  	 */
  
  	/*
  	 * QRious
  	 * Copyright (C) 2017 Alasdair Mercer
  	 * Copyright (C) 2010 Tom Zerucha
  	 *
  	 * This program is free software: you can redistribute it and/or modify
  	 * it under the terms of the GNU General Public License as published by
  	 * the Free Software Foundation, either version 3 of the License, or
  	 * (at your option) any later version.
  	 *
  	 * This program is distributed in the hope that it will be useful,
  	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  	 * GNU General Public License for more details.
  	 *
  	 * You should have received a copy of the GNU General Public License
  	 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  	 */
  
  	QRious$1.use(new BrowserElementService());
  
  	return QRious$1;
  
  })));
  
  //# sourceMappingURL=qrious.js.map
  
  /***/ }),
  
  /***/ 902:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CoinListComponentModule; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_transaction_details_eth_transaction_details_eth_module__ = __webpack_require__(892);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__coin_coin_module__ = __webpack_require__(903);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__loader_loader_module__ = __webpack_require__(102);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__coin_list__ = __webpack_require__(905);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  
  
  
  
  
  
  var CoinListComponentModule = /** @class */ (function () {
      function CoinListComponentModule() {
      }
      CoinListComponentModule = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"])({
              declarations: [__WEBPACK_IMPORTED_MODULE_5__coin_list__["a" /* CoinListComponent */]],
              imports: [
                  __WEBPACK_IMPORTED_MODULE_1_ionic_angular__["e" /* IonicModule */],
                  __WEBPACK_IMPORTED_MODULE_3__coin_coin_module__["a" /* CoinComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_2__components_transaction_details_eth_transaction_details_eth_module__["a" /* TransactionDetailsEthComponentModule */],
                  __WEBPACK_IMPORTED_MODULE_4__loader_loader_module__["a" /* LoaderComponentModule */]
              ],
              exports: [__WEBPACK_IMPORTED_MODULE_5__coin_list__["a" /* CoinListComponent */]]
          })
      ], CoinListComponentModule);
      return CoinListComponentModule;
  }());
  
  //# sourceMappingURL=coin-list.module.js.map
  
  /***/ }),
  
  /***/ 903:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CoinComponentModule; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__coin__ = __webpack_require__(904);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  
  
  
  var CoinComponentModule = /** @class */ (function () {
      function CoinComponentModule() {
      }
      CoinComponentModule = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"])({
              declarations: [__WEBPACK_IMPORTED_MODULE_2__coin__["a" /* CoinComponent */]],
              imports: [__WEBPACK_IMPORTED_MODULE_1_ionic_angular__["e" /* IonicModule */]],
              exports: [__WEBPACK_IMPORTED_MODULE_2__coin__["a" /* CoinComponent */]]
          })
      ], CoinComponentModule);
      return CoinComponentModule;
  }());
  
  //# sourceMappingURL=coin.module.js.map
  
  /***/ }),
  
  /***/ 904:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CoinComponent; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__providers_api_api__ = __webpack_require__(19);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__providers_currency_currency__ = __webpack_require__(24);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__providers_redir_redir__ = __webpack_require__(55);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__providers_transactions_transactions__ = __webpack_require__(54);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  var __metadata = (this && this.__metadata) || function (k, v) {
      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  };
  
  
  
  
  
  var CoinComponent = /** @class */ (function () {
      function CoinComponent(apiProvider, currencyProvider, redirProvider, txProvider) {
          this.apiProvider = apiProvider;
          this.currencyProvider = currencyProvider;
          this.redirProvider = redirProvider;
          this.txProvider = txProvider;
          this.timeHidden = true;
      }
      // tslint:disable-next-line:use-life-cycle-interface
      CoinComponent.prototype.ngOnInit = function () {
          this.time = new Date(this.coin.blockTime).getTime() / 1000;
          this.confirmations = this.blockTipHeight - this.coin.height + 1;
      };
      CoinComponent.prototype.revealTimeReceived = function (txid) {
          var _this = this;
          this.txProvider.getTx(txid).subscribe(function (tx) {
              _this.coin.time = new Date(tx.blockTime).getTime() / 1000;
              _this.timeHidden = false;
          });
      };
      CoinComponent.prototype.goToTx = function (txId) {
          this.redirProvider.redir('transaction', {
              txId: txId,
              chain: this.chainNetwork.chain,
              network: this.chainNetwork.network
          });
      };
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], CoinComponent.prototype, "coin", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], CoinComponent.prototype, "blockTipHeight", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], CoinComponent.prototype, "chainNetwork", void 0);
      CoinComponent = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"])({
              selector: 'coin',template:/*ion-inline-start:"/home/enrique/smart/sapi-insight/src/components/coin/coin.html"*/'<ion-grid>\n  <ion-row *ngIf="coin?.mintTxid">\n    <ion-col col-7>\n      <div class="ellipsis">\n        <span *ngIf="coin.height >= -1">\n          <a (click)="goToTx(coin.mintTxid)">{{ coin.mintTxid }}</a>\n        </span>\n        <span ion-text color="danger" *ngIf="coin.height === -3">\n          Invalid\n        </span>\n      </div>\n    </ion-col>\n    <ion-col col-5 text-right>\n      <ion-chip item-end color="warning" *ngIf="confirmations === -1">\n        <ion-label>\n          Unconfirmed\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="primary" *ngIf="confirmations === 1">\n        <ion-label>\n          1 Confirmation\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="primary" *ngIf="confirmations > 1">\n        <ion-label>\n          {{ confirmations }} Confirmations\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="default" class="size-fixed">\n        <ion-label>\n          {{ currencyProvider.getConvertedNumber(coin.value, chainNetwork.chain) | number:\'1.0-8\' }}\n          {{ currencyProvider.currencySymbol }}\n        </ion-label>\n      </ion-chip>\n    </ion-col>\n    <ion-note>\n      <ion-col col-1>\n        <span translate *ngIf="timeHidden"> \n          <a (click)="revealTimeReceived(coin.mintTxid)"> Tx Details </a> \n        </span>\n        <span class="time" translate *ngIf="!timeHidden"> \n          Mined on <time>{{ coin.time * 1000 | date:\'medium\' }}</time>\n        </span>\n      </ion-col>\n    </ion-note>\n  </ion-row>\n\n  <ion-row *ngIf="coin?.spentTxid">\n    <ion-col col-7>\n      <div class="ellipsis">\n        <span *ngIf="coin.height >= -1">\n          <a (click)="goToTx(coin.spentTxid)">{{ coin.spentTxid }}</a>\n        </span>\n        <span *ngIf="coin.height === -2">\n          Unspent\n        </span>\n        <span ion-text color="danger" *ngIf="coin.height === -3">\n          Invalid\n        </span>\n        <span ion-text color="danger" *ngIf="coin.height === -4">\n          Error\n        </span>\n      </div>\n    </ion-col>\n    <ion-col col-5 text-right>\n      <ion-chip item-end color="warning" *ngIf="confirmations === -1">\n        <ion-label>\n          Unconfirmed\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="primary" *ngIf="confirmations === 1">\n        <ion-label>\n          1 Confirmation\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end color="primary" *ngIf="confirmations > 1">\n        <ion-label>\n          {{ confirmations }} Confirmations\n        </ion-label>\n      </ion-chip>\n      <ion-chip item-end class="size-fixed">\n        <ion-label color="danger">\n          - {{ currencyProvider.getConvertedNumber(coin.value, chainNetwork.chain) | number:\'1.0-8\' }}\n          {{ currencyProvider.currencySymbol }}\n        </ion-label>\n      </ion-chip>\n    </ion-col>\n    <ion-note>\n      <ion-col col-1>\n        <span translate *ngIf="timeHidden"> \n          <a (click)="revealTimeReceived(coin.spentTxid)"> Tx Details </a> \n        </span>\n        <span class="time" translate *ngIf="!timeHidden"> \n          Mined on <time>{{ coin.time * 1000 | date:\'medium\' }}</time>\n        </span>\n      </ion-col>\n    </ion-note>\n  </ion-row>\n</ion-grid>'/*ion-inline-end:"/home/enrique/smart/sapi-insight/src/components/coin/coin.html"*/
          }),
          __metadata("design:paramtypes", [__WEBPACK_IMPORTED_MODULE_1__providers_api_api__["a" /* ApiProvider */],
              __WEBPACK_IMPORTED_MODULE_2__providers_currency_currency__["a" /* CurrencyProvider */],
              __WEBPACK_IMPORTED_MODULE_3__providers_redir_redir__["a" /* RedirProvider */],
              __WEBPACK_IMPORTED_MODULE_4__providers_transactions_transactions__["a" /* TxsProvider */]])
      ], CoinComponent);
      return CoinComponent;
  }());
  
  //# sourceMappingURL=coin.js.map
  
  /***/ }),
  
  /***/ 905:
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CoinListComponent; });
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_ionic_angular__ = __webpack_require__(11);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_lodash__ = __webpack_require__(78);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_lodash___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash__);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__providers_address_address__ = __webpack_require__(173);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__providers_blocks_blocks__ = __webpack_require__(50);
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__providers_transactions_transactions__ = __webpack_require__(54);
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  var __metadata = (this && this.__metadata) || function (k, v) {
      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  };
  
  
  
  
  
  
  var CoinListComponent = /** @class */ (function () {
      function CoinListComponent(addrProvider, blocksProvider, txsProvider, events) {
          this.addrProvider = addrProvider;
          this.blocksProvider = blocksProvider;
          this.txsProvider = txsProvider;
          this.events = events;
          this.txids = {};
          this.txs = [];
          this.coins = [];
          this.mostRecentOrderSelected = true;
          this.limit = 10;
          this.chunkSize = 100;
      }
      CoinListComponent.prototype.ngOnInit = function () {
          if (this.txs && this.txs.length === 0) {
              this.loading = true;
              // this.blocksProvider
              //   .getCurrentHeight(this.chainNetwork)
              //   .subscribe(data => {
              //     this.blockTipHeight = data.height;
              //   });
              // this.addrProvider
              //   .getAddressActivity(this.addrStr)
              //   .subscribe(
              //     data => {
              //       const toAppCoin: any = this.txsProvider.toAppCoin;               
              //       const formattedData = data.map(toAppCoin);
              //       this.txs = this.processData(formattedData);                
              //       this.txs = _.sortBy(this.txs, ['height']).reverse(); // newest txs by default
              //       this.events.publish('CoinList', { length: this.txs.length });
              //       this.showTransactions = true;
              //       this.loading = false;
              //     },
              //     () => {
              //       this.loading = false;
              //       this.showTransactions = false;
              //     }
              //   );
          }
      };
      CoinListComponent.prototype.sortBy = function (order) {
          if (this.mostRecentOrderSelected && order === 'Most Recent') {
              return this.txs;
          }
          else if (!this.mostRecentOrderSelected && order === 'Oldest') {
              return this.txs;
          }
          this.txs =
              order === 'Most Recent'
                  ? __WEBPACK_IMPORTED_MODULE_2_lodash___default.a.sortBy(this.txs, ['height']).reverse()
                  : __WEBPACK_IMPORTED_MODULE_2_lodash___default.a.sortBy(this.txs, ['height']);
          this.mostRecentOrderSelected = order === 'Most Recent';
      };
      CoinListComponent.prototype.processData = function (data) {
          var txs = [];
          data.forEach(function (tx) {
              var mintHeight = tx.mintHeight, mintTxid = tx.mintTxid, value = tx.value, spentHeight = tx.spentHeight, spentTxid = tx.spentTxid;
              txs.push({ height: spentHeight, spentTxid: spentTxid, value: value });
              txs.push({ height: mintHeight, mintTxid: mintTxid, value: value });
          });
          return txs;
      };
      CoinListComponent.prototype.loadMore = function (infiniteScroll) {
          this.limit += this.chunkSize;
          this.chunkSize *= 2;
          infiniteScroll.complete();
      };
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", String)
      ], CoinListComponent.prototype, "addrStr", void 0);
      __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
          __metadata("design:type", Object)
      ], CoinListComponent.prototype, "chainNetwork", void 0);
      CoinListComponent = __decorate([
          Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"])({
              selector: 'coin-list',template:/*ion-inline-start:"/home/enrique/smart/sapi-insight/src/components/coin-list/coin-list.html"*/'<loader *ngIf="loading" [type]="\'tx-list\'"></loader>\n\n<div *ngIf="!loading">\n  <ion-grid>\n    <div> Sort by: \n      <span [ngClass]="mostRecentOrderSelected ? \'orderSelected\' : \'orderUnselected\'" (click)="sortBy(\'Most Recent\')"> Most Recent </span> \n      | <span [ngClass]="mostRecentOrderSelected ? \'orderUnselected\' : \'orderSelected\'" (click)="sortBy(\'Oldest\')"> Oldest </span> \n    </div>\n    <ion-row *ngFor="let tx of txs; let i = index">\n      <ion-col col-12 *ngIf="i < limit && (tx.spentTxid !== \'\' || tx.mintTxid)">\n        <coin [blockTipHeight]="blockTipHeight" [coin]="tx"></coin>\n        <!-- <transaction-details-eth *ngIf="chainNetwork.chain === \'ETH\'" [tx]="tx" [showCoins]="true"></transaction-details-eth> -->\n      </ion-col>\n    </ion-row>\n    <ion-row *ngIf="limit < txs.length">\n      <ion-infinite-scroll (ionInfinite)="loadMore($event)">\n        <loader [type]="\'tx-list\'"></loader>\n      </ion-infinite-scroll>\n    </ion-row>\n    <ion-row *ngIf="txs.length === 0" class="no-txs">\n      <ion-col col-12>\n        There are no transactions involving this address.\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n</div>'/*ion-inline-end:"/home/enrique/smart/sapi-insight/src/components/coin-list/coin-list.html"*/
          }),
          __metadata("design:paramtypes", [__WEBPACK_IMPORTED_MODULE_3__providers_address_address__["a" /* AddressProvider */],
              __WEBPACK_IMPORTED_MODULE_4__providers_blocks_blocks__["a" /* BlocksProvider */],
              __WEBPACK_IMPORTED_MODULE_5__providers_transactions_transactions__["a" /* TxsProvider */],
              __WEBPACK_IMPORTED_MODULE_1_ionic_angular__["c" /* Events */]])
      ], CoinListComponent);
      return CoinListComponent;
  }());
  
  //# sourceMappingURL=coin-list.js.map
  
  /***/ })
  
  });
  //# sourceMappingURL=0.js.map