gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated (9c735a0e -> e404f5e6)


From: gnunet
Subject: [taler-wallet-core] branch master updated (9c735a0e -> e404f5e6)
Date: Tue, 07 Apr 2020 16:47:23 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a change to branch master
in repository wallet-core.

    from 9c735a0e fix i18n build task
     new 06372f54 deps
     new 322359e5 readme
     new e404f5e6 add test case for i18n, fix react i18n bug

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 README                  |  19 +-
 contrib/po2ts           |   2 +-
 package.json            |  17 +-
 src/i18n/strings.ts     | 669 ++++++++++++++++++++++++------------------------
 src/webex/i18n-test.tsx |  69 +++++
 src/webex/i18n.tsx      | 132 ++++------
 yarn.lock               | 517 +++++++++++++++++++++++++++++++++----
 7 files changed, 937 insertions(+), 488 deletions(-)
 create mode 100644 src/webex/i18n-test.tsx

diff --git a/README b/README
index 3393faf3..c3e511cc 100644
--- a/README
+++ b/README
@@ -5,7 +5,7 @@ This package implements a wallet for GNU Taler in TypeScript.
 
 It can be run on different platforms:
 1. As a cross-browser extension, written for the WebExtension API
-2. As a Node.JS package
+2. As a Node.js package
 
 
 Dependencies
@@ -14,29 +14,14 @@ Dependencies
 Dependencies are managed as NPM dependencies.  For performance reasons,
 we use `yarn' as a replacement for `npm' in the build system.
 
-For cryptographic operations, the wallet uses an emscripten-compiled
-library.  The binary files for this library are in `./emscripten'.
-The instructions for building this binary from scratch can be found
-in the libtaler-emscripten repository:
-
-https://git.taler.net/libtalerutil-emscripten.git/
-
 
 pre-configure step
 ==================
 
-`make submodules/init && make submodules/update`
-`ln -sf build-scripts/configure configure`
-`ln -sf build-scripts/configure.py configure.py`
-
-or, at your choice:
+When building from source, run
 
 `./bootstrap`
 
-In the following steps you can ommit
-`--prefix=$PREFIX` if you have set
-the environment variable PREFIX to an
-existing path on your system.
 
 Building from source (Web Extension)
 ======================================
diff --git a/contrib/po2ts b/contrib/po2ts
index 4d349663..a135da61 100755
--- a/contrib/po2ts
+++ b/contrib/po2ts
@@ -36,7 +36,7 @@ if (!m) {
 }
 
 const lang = m[1];
-const pojson = po2json.parseFileSync(filename);
+const pojson = po2json.parseFileSync(filename, { format: "jed1.x", fuzzy: true 
});
 const s =
   "strings['" + lang + "'] = " + JSON.stringify(pojson, null, "  ") + ";\n";
 console.log(s);
diff --git a/package.json b/package.json
index eac8d69c..92a797bb 100644
--- a/package.json
+++ b/package.json
@@ -34,11 +34,15 @@
     "@rollup/plugin-json": "^4.0.2",
     "@rollup/plugin-replace": "^2.3.1",
     "@types/chrome": "^0.0.103",
+    "@types/enzyme": "^3.10.5",
+    "@types/enzyme-adapter-react-16": "^1.0.6",
     "@types/react": "^16.9.6",
     "@types/react-dom": "^16.9.6",
-    "@typescript-eslint/eslint-plugin": "^2.26.0",
-    "@typescript-eslint/parser": "^2.26.0",
+    "@typescript-eslint/eslint-plugin": "^2.27.0",
+    "@typescript-eslint/parser": "^2.27.0",
     "ava": "^3.6.0",
+    "enzyme": "^3.11.0",
+    "enzyme-adapter-react-16": "^1.15.2",
     "eslint": "^6.8.0",
     "eslint-config-airbnb-typescript": "^7.2.0",
     "eslint-plugin-import": "^2.20.2",
@@ -56,7 +60,9 @@
     "rollup": "^2.3.3",
     "rollup-plugin-commonjs": "^10.1.0",
     "rollup-plugin-node-resolve": "^5.2.0",
+    "rollup-plugin-sourcemaps": "^0.5.0",
     "rollup-plugin-terser": "^5.3.0",
+    "source-map-resolve": "^0.6.0",
     "structured-clone": "^0.2.2",
     "typedoc": "^0.17.4",
     "typescript": "^3.8.3"
@@ -71,9 +77,14 @@
   },
   "ava": {
     "files": [
-      "src/**/*-test.{js,ts}"
+      "src/**/*-test.*"
     ],
     "typescript": {
+      "extensions": [
+        "js",
+        "ts",
+        "tsx"
+      ],
       "rewritePaths": {
         "src/": "dist/node/"
       }
diff --git a/src/i18n/strings.ts b/src/i18n/strings.ts
index 6d9161f2..748b9656 100644
--- a/src/i18n/strings.ts
+++ b/src/i18n/strings.ts
@@ -16,353 +16,358 @@
 
 export const strings: { [s: string]: any } = {};
 strings["de"] = {
-  "Invalid Wire": [null, ""],
-  "Invalid Test Wire Detail": [null, ""],
-  "Test Wire Acct #%1$s on %2$s": [null, ""],
-  "Unknown Wire Detail": [null, ""],
-  Operation: [null, ""],
-  "time (ms/op)": [null, ""],
-  "The total price is %1$s (plus %2$s fees).": [null, ""],
-  "The total price is %1$s.": [null, ""],
-  Retry: [null, ""],
-  Balance: [null, "Saldo"],
-  History: [null, "Verlauf"],
-  Debug: [null, "Debug"],
-  "%1$s incoming": [null, ""],
-  "%1$s being spent": [null, ""],
-  "Error: could not retrieve balance information.": [null, ""],
-  "Invalid ": [null, ""],
-  "Fees ": [null, ""],
-  "Refresh sessions has completed": [null, ""],
-  "Order Refused": [null, ""],
-  "Order redirected": [null, ""],
-  "Payment aborted": [null, ""],
-  "Payment Sent": [null, ""],
-  "Order accepted": [null, ""],
-  "Reserve balance updated": [null, ""],
-  "Payment refund": [null, ""],
-  "Tip Accepted": [null, ""],
-  "Tip Declined": [null, ""],
-  "%1$s": [null, ""],
-  "Your wallet has no events recorded.": [
-    null,
-    "Ihre Geldbörse verzeichnet keine Vorkommnisse.",
-  ],
-  "Wire to bank account": [null, ""],
-  "Could not get details for withdraw operation:": [null, ""],
-  "Chose different exchange provider": [null, ""],
-  "Please select an exchange.  You can review the details before after your 
selection.": [
-    null,
-    "",
-  ],
-  "Select %1$s": [null, ""],
-  "Select custom exchange": [null, ""],
-  "You are about to withdraw %1$s from your bank account into your wallet.": [
-    null,
-    "",
-  ],
-  "Accept fees and withdraw": [null, ""],
-  "Cancel withdraw operation": [null, ""],
-  "Rounding loss:": [null, ""],
-  "Earliest expiration (for deposit): %1$s": [null, ""],
-  "# Coins": [null, ""],
-  Value: [null, ""],
-  "Refresh Fee": [null, ""],
-  "Deposit Fee": [null, ""],
-  "": {
-    "project-id-version": "Taler Wallet",
-    "report-msgid-bugs-to": "",
-    "pot-creation-date": "2016-11-23 00:00+0100",
-    "po-revision-date": "YEAR-MO-DA HO:MI+ZONE",
-    "last-translator": "FULL NAME <EMAIL@ADDRESS>",
-    "language-team": "LANGUAGE <address@hidden>",
-    language: "",
-    "mime-version": "1.0",
-    "content-type": "text/plain; charset=UTF-8",
-    "content-transfer-encoding": "8bit",
-    "plural-forms": "nplurals=2; plural=(n != 1);",
+  domain: "messages",
+  locale_data: {
+    messages: {
+      "": {
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
+      },
+      "Invalid Wire": [""],
+      "Invalid Test Wire Detail": [""],
+      "Test Wire Acct #%1$s on %2$s": [""],
+      "Unknown Wire Detail": [""],
+      Operation: [""],
+      "time (ms/op)": [""],
+      "The merchant %1$s offers you to purchase:": [
+        "Der Händler %1$s möchte einen Vertrag über %2$s mit Ihnen 
abschließen.",
+      ],
+      "The total price is %1$s (plus %2$s fees).": [""],
+      "The total price is %1$s.": [""],
+      Retry: [""],
+      "Confirm payment": ["Bezahlung bestätigen"],
+      Balance: ["Saldo"],
+      History: ["Verlauf"],
+      Debug: ["Debug"],
+      "You have no balance to show. Need some %1$s getting started?": [
+        "Sie haben kein Digitalgeld. Wollen Sie %1$s? abheben?",
+      ],
+      "%1$s incoming": [""],
+      "%1$s being spent": [""],
+      "Error: could not retrieve balance information.": [""],
+      "Invalid ": [""],
+      "Fees ": [""],
+      "Refresh sessions has completed": [""],
+      "Order Refused": [""],
+      "Order redirected": [""],
+      "Payment aborted": [""],
+      "Payment Sent": [""],
+      "Order accepted": [""],
+      "Reserve balance updated": [""],
+      "Payment refund": [""],
+      Withdrawn: ["Abheben bei %1$s"],
+      "Tip Accepted": [""],
+      "Tip Declined": [""],
+      "%1$s": [""],
+      "Your wallet has no events recorded.": [
+        "Ihre Geldbörse verzeichnet keine Vorkommnisse.",
+      ],
+      "Wire to bank account": [""],
+      Confirm: ["Bezahlung bestätigen"],
+      Cancel: ["Saldo"],
+      "Could not get details for withdraw operation:": [""],
+      "Chose different exchange provider": [""],
+      "Please select an exchange.  You can review the details before after 
your selection.": [
+        "",
+      ],
+      "Select %1$s": [""],
+      "Select custom exchange": [""],
+      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
+        "",
+      ],
+      "Accept fees and withdraw": [""],
+      "Cancel withdraw operation": [""],
+      "Withdrawal fees:": ["Abheben bei"],
+      "Rounding loss:": [""],
+      "Earliest expiration (for deposit): %1$s": [""],
+      "# Coins": [""],
+      Value: [""],
+      "Withdraw Fee": ["Abheben bei %1$s"],
+      "Refresh Fee": [""],
+      "Deposit Fee": [""],
+    },
   },
 };
 
 strings["en-US"] = {
-  "Invalid Wire": [null, ""],
-  "Invalid Test Wire Detail": [null, ""],
-  "Test Wire Acct #%1$s on %2$s": [null, ""],
-  "Unknown Wire Detail": [null, ""],
-  Operation: [null, ""],
-  "time (ms/op)": [null, ""],
-  "The merchant %1$s offers you to purchase:": [null, ""],
-  "The total price is %1$s (plus %2$s fees).": [null, ""],
-  "The total price is %1$s.": [null, ""],
-  Retry: [null, ""],
-  "Confirm payment": [null, ""],
-  Balance: [null, ""],
-  History: [null, ""],
-  Debug: [null, ""],
-  "You have no balance to show. Need some %1$s getting started?": [null, ""],
-  "%1$s incoming": [null, ""],
-  "%1$s being spent": [null, ""],
-  "Error: could not retrieve balance information.": [null, ""],
-  "Invalid ": [null, ""],
-  "Fees ": [null, ""],
-  "Refresh sessions has completed": [null, ""],
-  "Order Refused": [null, ""],
-  "Order redirected": [null, ""],
-  "Payment aborted": [null, ""],
-  "Payment Sent": [null, ""],
-  "Order accepted": [null, ""],
-  "Reserve balance updated": [null, ""],
-  "Payment refund": [null, ""],
-  Withdrawn: [null, ""],
-  "Tip Accepted": [null, ""],
-  "Tip Declined": [null, ""],
-  "%1$s": [null, ""],
-  "Your wallet has no events recorded.": [null, ""],
-  "Wire to bank account": [null, ""],
-  Confirm: [null, ""],
-  Cancel: [null, ""],
-  "Could not get details for withdraw operation:": [null, ""],
-  "Chose different exchange provider": [null, ""],
-  "Please select an exchange.  You can review the details before after your 
selection.": [
-    null,
-    "",
-  ],
-  "Select %1$s": [null, ""],
-  "Select custom exchange": [null, ""],
-  "You are about to withdraw %1$s from your bank account into your wallet.": [
-    null,
-    "",
-  ],
-  "Accept fees and withdraw": [null, ""],
-  "Cancel withdraw operation": [null, ""],
-  "Withdrawal fees:": [null, ""],
-  "Rounding loss:": [null, ""],
-  "Earliest expiration (for deposit): %1$s": [null, ""],
-  "# Coins": [null, ""],
-  Value: [null, ""],
-  "Withdraw Fee": [null, ""],
-  "Refresh Fee": [null, ""],
-  "Deposit Fee": [null, ""],
-  "": {
-    "project-id-version": "Taler Wallet",
-    "report-msgid-bugs-to": "",
-    "pot-creation-date": "2016-11-23 00:00+0100",
-    "po-revision-date": "YEAR-MO-DA HO:MI+ZONE",
-    "last-translator": "FULL NAME <EMAIL@ADDRESS>",
-    "language-team": "LANGUAGE <address@hidden>",
-    language: "",
-    "mime-version": "1.0",
-    "content-type": "text/plain; charset=UTF-8",
-    "content-transfer-encoding": "8bit",
-    "plural-forms": "nplurals=2; plural=(n != 1);",
+  domain: "messages",
+  locale_data: {
+    messages: {
+      "": {
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
+      },
+      "Invalid Wire": [""],
+      "Invalid Test Wire Detail": [""],
+      "Test Wire Acct #%1$s on %2$s": [""],
+      "Unknown Wire Detail": [""],
+      Operation: [""],
+      "time (ms/op)": [""],
+      "The merchant %1$s offers you to purchase:": [""],
+      "The total price is %1$s (plus %2$s fees).": [""],
+      "The total price is %1$s.": [""],
+      Retry: [""],
+      "Confirm payment": [""],
+      Balance: [""],
+      History: [""],
+      Debug: [""],
+      "You have no balance to show. Need some %1$s getting started?": [""],
+      "%1$s incoming": [""],
+      "%1$s being spent": [""],
+      "Error: could not retrieve balance information.": [""],
+      "Invalid ": [""],
+      "Fees ": [""],
+      "Refresh sessions has completed": [""],
+      "Order Refused": [""],
+      "Order redirected": [""],
+      "Payment aborted": [""],
+      "Payment Sent": [""],
+      "Order accepted": [""],
+      "Reserve balance updated": [""],
+      "Payment refund": [""],
+      Withdrawn: [""],
+      "Tip Accepted": [""],
+      "Tip Declined": [""],
+      "%1$s": [""],
+      "Your wallet has no events recorded.": [""],
+      "Wire to bank account": [""],
+      Confirm: [""],
+      Cancel: [""],
+      "Could not get details for withdraw operation:": [""],
+      "Chose different exchange provider": [""],
+      "Please select an exchange.  You can review the details before after 
your selection.": [
+        "",
+      ],
+      "Select %1$s": [""],
+      "Select custom exchange": [""],
+      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
+        "",
+      ],
+      "Accept fees and withdraw": [""],
+      "Cancel withdraw operation": [""],
+      "Withdrawal fees:": [""],
+      "Rounding loss:": [""],
+      "Earliest expiration (for deposit): %1$s": [""],
+      "# Coins": [""],
+      Value: [""],
+      "Withdraw Fee": [""],
+      "Refresh Fee": [""],
+      "Deposit Fee": [""],
+    },
   },
 };
 
 strings["fr"] = {
-  "Invalid Wire": [null, ""],
-  "Invalid Test Wire Detail": [null, ""],
-  "Test Wire Acct #%1$s on %2$s": [null, ""],
-  "Unknown Wire Detail": [null, ""],
-  Operation: [null, ""],
-  "time (ms/op)": [null, ""],
-  "The merchant %1$s offers you to purchase:": [null, ""],
-  "The total price is %1$s (plus %2$s fees).": [null, ""],
-  "The total price is %1$s.": [null, ""],
-  Retry: [null, ""],
-  "Confirm payment": [null, ""],
-  Balance: [null, ""],
-  History: [null, ""],
-  Debug: [null, ""],
-  "You have no balance to show. Need some %1$s getting started?": [null, ""],
-  "%1$s incoming": [null, ""],
-  "%1$s being spent": [null, ""],
-  "Error: could not retrieve balance information.": [null, ""],
-  "Invalid ": [null, ""],
-  "Fees ": [null, ""],
-  "Refresh sessions has completed": [null, ""],
-  "Order Refused": [null, ""],
-  "Order redirected": [null, ""],
-  "Payment aborted": [null, ""],
-  "Payment Sent": [null, ""],
-  "Order accepted": [null, ""],
-  "Reserve balance updated": [null, ""],
-  "Payment refund": [null, ""],
-  Withdrawn: [null, ""],
-  "Tip Accepted": [null, ""],
-  "Tip Declined": [null, ""],
-  "%1$s": [null, ""],
-  "Your wallet has no events recorded.": [null, ""],
-  "Wire to bank account": [null, ""],
-  Confirm: [null, ""],
-  Cancel: [null, ""],
-  "Could not get details for withdraw operation:": [null, ""],
-  "Chose different exchange provider": [null, ""],
-  "Please select an exchange.  You can review the details before after your 
selection.": [
-    null,
-    "",
-  ],
-  "Select %1$s": [null, ""],
-  "Select custom exchange": [null, ""],
-  "You are about to withdraw %1$s from your bank account into your wallet.": [
-    null,
-    "",
-  ],
-  "Accept fees and withdraw": [null, ""],
-  "Cancel withdraw operation": [null, ""],
-  "Withdrawal fees:": [null, ""],
-  "Rounding loss:": [null, ""],
-  "Earliest expiration (for deposit): %1$s": [null, ""],
-  "# Coins": [null, ""],
-  Value: [null, ""],
-  "Withdraw Fee": [null, ""],
-  "Refresh Fee": [null, ""],
-  "Deposit Fee": [null, ""],
-  "": {
-    "project-id-version": "Taler Wallet",
-    "report-msgid-bugs-to": "",
-    "pot-creation-date": "2016-11-23 00:00+0100",
-    "po-revision-date": "YEAR-MO-DA HO:MI+ZONE",
-    "last-translator": "FULL NAME <EMAIL@ADDRESS>",
-    "language-team": "LANGUAGE <address@hidden>",
-    language: "",
-    "mime-version": "1.0",
-    "content-type": "text/plain; charset=UTF-8",
-    "content-transfer-encoding": "8bit",
-    "plural-forms": "nplurals=2; plural=(n != 1);",
+  domain: "messages",
+  locale_data: {
+    messages: {
+      "": {
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
+      },
+      "Invalid Wire": [""],
+      "Invalid Test Wire Detail": [""],
+      "Test Wire Acct #%1$s on %2$s": [""],
+      "Unknown Wire Detail": [""],
+      Operation: [""],
+      "time (ms/op)": [""],
+      "The merchant %1$s offers you to purchase:": [""],
+      "The total price is %1$s (plus %2$s fees).": [""],
+      "The total price is %1$s.": [""],
+      Retry: [""],
+      "Confirm payment": [""],
+      Balance: [""],
+      History: [""],
+      Debug: [""],
+      "You have no balance to show. Need some %1$s getting started?": [""],
+      "%1$s incoming": [""],
+      "%1$s being spent": [""],
+      "Error: could not retrieve balance information.": [""],
+      "Invalid ": [""],
+      "Fees ": [""],
+      "Refresh sessions has completed": [""],
+      "Order Refused": [""],
+      "Order redirected": [""],
+      "Payment aborted": [""],
+      "Payment Sent": [""],
+      "Order accepted": [""],
+      "Reserve balance updated": [""],
+      "Payment refund": [""],
+      Withdrawn: [""],
+      "Tip Accepted": [""],
+      "Tip Declined": [""],
+      "%1$s": [""],
+      "Your wallet has no events recorded.": [""],
+      "Wire to bank account": [""],
+      Confirm: [""],
+      Cancel: [""],
+      "Could not get details for withdraw operation:": [""],
+      "Chose different exchange provider": [""],
+      "Please select an exchange.  You can review the details before after 
your selection.": [
+        "",
+      ],
+      "Select %1$s": [""],
+      "Select custom exchange": [""],
+      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
+        "",
+      ],
+      "Accept fees and withdraw": [""],
+      "Cancel withdraw operation": [""],
+      "Withdrawal fees:": [""],
+      "Rounding loss:": [""],
+      "Earliest expiration (for deposit): %1$s": [""],
+      "# Coins": [""],
+      Value: [""],
+      "Withdraw Fee": [""],
+      "Refresh Fee": [""],
+      "Deposit Fee": [""],
+    },
   },
 };
 
 strings["it"] = {
-  "Invalid Wire": [null, ""],
-  "Invalid Test Wire Detail": [null, ""],
-  "Test Wire Acct #%1$s on %2$s": [null, ""],
-  "Unknown Wire Detail": [null, ""],
-  Operation: [null, ""],
-  "time (ms/op)": [null, ""],
-  "The merchant %1$s offers you to purchase:": [null, ""],
-  "The total price is %1$s (plus %2$s fees).": [null, ""],
-  "The total price is %1$s.": [null, ""],
-  Retry: [null, ""],
-  "Confirm payment": [null, ""],
-  Balance: [null, ""],
-  History: [null, ""],
-  Debug: [null, ""],
-  "You have no balance to show. Need some %1$s getting started?": [null, ""],
-  "%1$s incoming": [null, ""],
-  "%1$s being spent": [null, ""],
-  "Error: could not retrieve balance information.": [null, ""],
-  "Invalid ": [null, ""],
-  "Fees ": [null, ""],
-  "Refresh sessions has completed": [null, ""],
-  "Order Refused": [null, ""],
-  "Order redirected": [null, ""],
-  "Payment aborted": [null, ""],
-  "Payment Sent": [null, ""],
-  "Order accepted": [null, ""],
-  "Reserve balance updated": [null, ""],
-  "Payment refund": [null, ""],
-  Withdrawn: [null, ""],
-  "Tip Accepted": [null, ""],
-  "Tip Declined": [null, ""],
-  "%1$s": [null, ""],
-  "Your wallet has no events recorded.": [null, ""],
-  "Wire to bank account": [null, ""],
-  Confirm: [null, ""],
-  Cancel: [null, ""],
-  "Could not get details for withdraw operation:": [null, ""],
-  "Chose different exchange provider": [null, ""],
-  "Please select an exchange.  You can review the details before after your 
selection.": [
-    null,
-    "",
-  ],
-  "Select %1$s": [null, ""],
-  "Select custom exchange": [null, ""],
-  "You are about to withdraw %1$s from your bank account into your wallet.": [
-    null,
-    "",
-  ],
-  "Accept fees and withdraw": [null, ""],
-  "Cancel withdraw operation": [null, ""],
-  "Withdrawal fees:": [null, ""],
-  "Rounding loss:": [null, ""],
-  "Earliest expiration (for deposit): %1$s": [null, ""],
-  "# Coins": [null, ""],
-  Value: [null, ""],
-  "Withdraw Fee": [null, ""],
-  "Refresh Fee": [null, ""],
-  "Deposit Fee": [null, ""],
-  "": {
-    "project-id-version": "Taler Wallet",
-    "report-msgid-bugs-to": "",
-    "pot-creation-date": "2016-11-23 00:00+0100",
-    "po-revision-date": "YEAR-MO-DA HO:MI+ZONE",
-    "last-translator": "FULL NAME <EMAIL@ADDRESS>",
-    "language-team": "LANGUAGE <address@hidden>",
-    language: "",
-    "mime-version": "1.0",
-    "content-type": "text/plain; charset=UTF-8",
-    "content-transfer-encoding": "8bit",
-    "plural-forms": "nplurals=2; plural=(n != 1);",
+  domain: "messages",
+  locale_data: {
+    messages: {
+      "": {
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
+      },
+      "Invalid Wire": [""],
+      "Invalid Test Wire Detail": [""],
+      "Test Wire Acct #%1$s on %2$s": [""],
+      "Unknown Wire Detail": [""],
+      Operation: [""],
+      "time (ms/op)": [""],
+      "The merchant %1$s offers you to purchase:": [""],
+      "The total price is %1$s (plus %2$s fees).": [""],
+      "The total price is %1$s.": [""],
+      Retry: [""],
+      "Confirm payment": [""],
+      Balance: [""],
+      History: [""],
+      Debug: [""],
+      "You have no balance to show. Need some %1$s getting started?": [""],
+      "%1$s incoming": [""],
+      "%1$s being spent": [""],
+      "Error: could not retrieve balance information.": [""],
+      "Invalid ": [""],
+      "Fees ": [""],
+      "Refresh sessions has completed": [""],
+      "Order Refused": [""],
+      "Order redirected": [""],
+      "Payment aborted": [""],
+      "Payment Sent": [""],
+      "Order accepted": [""],
+      "Reserve balance updated": [""],
+      "Payment refund": [""],
+      Withdrawn: [""],
+      "Tip Accepted": [""],
+      "Tip Declined": [""],
+      "%1$s": [""],
+      "Your wallet has no events recorded.": [""],
+      "Wire to bank account": [""],
+      Confirm: [""],
+      Cancel: [""],
+      "Could not get details for withdraw operation:": [""],
+      "Chose different exchange provider": [""],
+      "Please select an exchange.  You can review the details before after 
your selection.": [
+        "",
+      ],
+      "Select %1$s": [""],
+      "Select custom exchange": [""],
+      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
+        "",
+      ],
+      "Accept fees and withdraw": [""],
+      "Cancel withdraw operation": [""],
+      "Withdrawal fees:": [""],
+      "Rounding loss:": [""],
+      "Earliest expiration (for deposit): %1$s": [""],
+      "# Coins": [""],
+      Value: [""],
+      "Withdraw Fee": [""],
+      "Refresh Fee": [""],
+      "Deposit Fee": [""],
+    },
   },
 };
 
 strings["sv"] = {
-  "Invalid Wire": [null, ""],
-  "Invalid Test Wire Detail": [null, ""],
-  "Test Wire Acct #%1$s on %2$s": [null, ""],
-  Operation: [null, ""],
-  "time (ms/op)": [null, ""],
-  Retry: [null, ""],
-  "Confirm payment": [null, "Godkän betalning"],
-  Balance: [null, "Balans"],
-  History: [null, "Historia"],
-  Debug: [null, ""],
-  "%1$s being spent": [null, ""],
-  "Error: could not retrieve balance information.": [null, ""],
-  "Invalid ": [null, ""],
-  "Fees ": [null, ""],
-  "Refresh sessions has completed": [null, ""],
-  "Order Refused": [null, ""],
-  "Order redirected": [null, ""],
-  "Payment aborted": [null, ""],
-  "Payment Sent": [null, ""],
-  "Order accepted": [null, ""],
-  "Reserve balance updated": [null, ""],
-  "Payment refund": [null, ""],
-  "Tip Accepted": [null, ""],
-  "Tip Declined": [null, ""],
-  "%1$s": [null, ""],
-  "Your wallet has no events recorded.": [null, "plånboken"],
-  "Wire to bank account": [null, "Övervisa till bank konto"],
-  Confirm: [null, "Bekräfta"],
-  Cancel: [null, "Avbryt"],
-  "Could not get details for withdraw operation:": [null, ""],
-  "Please select an exchange.  You can review the details before after your 
selection.": [
-    null,
-    "",
-  ],
-  "Select custom exchange": [null, ""],
-  "Accept fees and withdraw": [null, "Acceptera avgifter och utbetala"],
-  "Cancel withdraw operation": [null, ""],
-  "Withdrawal fees:": [null, "Utbetalnings avgifter:"],
-  "Rounding loss:": [null, ""],
-  "Earliest expiration (for deposit): %1$s": [null, ""],
-  "# Coins": [null, "# Mynt"],
-  Value: [null, "Värde"],
-  "Withdraw Fee": [null, "Utbetalnings avgift"],
-  "Refresh Fee": [null, "Återhämtnings avgift"],
-  "Deposit Fee": [null, "Depostitions avgift"],
-  "": {
-    "project-id-version": "Taler Wallet",
-    "report-msgid-bugs-to": "",
-    "pot-creation-date": "2016-11-23 00:00+0100",
-    "po-revision-date": "YEAR-MO-DA HO:MI+ZONE",
-    "last-translator": "Flo Reitz <EMAIL@ADDRESS>",
-    "language-team": "LANGUAGE <address@hidden>",
-    language: "",
-    "mime-version": "1.0",
-    "content-type": "text/plain; charset=UTF-8",
-    "content-transfer-encoding": "8bit",
-    "plural-forms": "nplurals=2; plural=(n != 1);",
+  domain: "messages",
+  locale_data: {
+    messages: {
+      "": {
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
+      },
+      "Invalid Wire": [""],
+      "Invalid Test Wire Detail": [""],
+      "Test Wire Acct #%1$s on %2$s": [""],
+      "Unknown Wire Detail": ["visa mer"],
+      Operation: [""],
+      "time (ms/op)": [""],
+      "The merchant %1$s offers you to purchase:": [
+        "Säljaren %1$s erbjuder följande:",
+      ],
+      "The total price is %1$s (plus %2$s fees).": [
+        "Det totala priset är %1$s (plus %2$s avgifter).\n",
+      ],
+      "The total price is %1$s.": ["Det totala priset är %1$s."],
+      Retry: [""],
+      "Confirm payment": ["Godkän betalning"],
+      Balance: ["Balans"],
+      History: ["Historia"],
+      Debug: [""],
+      "You have no balance to show. Need some %1$s getting started?": [
+        "Du har ingen balans att visa. Behöver du\n %1$s att börja?\n",
+      ],
+      "%1$s incoming": ["%1$s inkommande"],
+      "%1$s being spent": [""],
+      "Error: could not retrieve balance information.": [""],
+      "Invalid ": [""],
+      "Fees ": [""],
+      "Refresh sessions has completed": [""],
+      "Order Refused": [""],
+      "Order redirected": [""],
+      "Payment aborted": [""],
+      "Payment Sent": [""],
+      "Order accepted": [""],
+      "Reserve balance updated": [""],
+      "Payment refund": [""],
+      Withdrawn: ["Utbetalnings avgift"],
+      "Tip Accepted": [""],
+      "Tip Declined": [""],
+      "%1$s": [""],
+      "Your wallet has no events recorded.": ["plånboken"],
+      "Wire to bank account": ["Övervisa till bank konto"],
+      Confirm: ["Bekräfta"],
+      Cancel: ["Avbryt"],
+      "Could not get details for withdraw operation:": [""],
+      "Chose different exchange provider": ["Ändra tjänsteleverantörer"],
+      "Please select an exchange.  You can review the details before after 
your selection.": [
+        "",
+      ],
+      "Select %1$s": ["Välj %1$s"],
+      "Select custom exchange": [""],
+      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
+        "Du är på väg att ta ut\n %1$s från ditt bankkonto till din 
plånbok.\n",
+      ],
+      "Accept fees and withdraw": ["Acceptera avgifter och utbetala"],
+      "Cancel withdraw operation": [""],
+      "Withdrawal fees:": ["Utbetalnings avgifter:"],
+      "Rounding loss:": [""],
+      "Earliest expiration (for deposit): %1$s": [""],
+      "# Coins": ["# Mynt"],
+      Value: ["Värde"],
+      "Withdraw Fee": ["Utbetalnings avgift"],
+      "Refresh Fee": ["Återhämtnings avgift"],
+      "Deposit Fee": ["Depostitions avgift"],
+    },
   },
 };
diff --git a/src/webex/i18n-test.tsx b/src/webex/i18n-test.tsx
new file mode 100644
index 00000000..4a1c4025
--- /dev/null
+++ b/src/webex/i18n-test.tsx
@@ -0,0 +1,69 @@
+/*
+ This file is part of GNU Taler
+ (C) 2020 Taler Systems SA
+
+ GNU Taler 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, or (at your option) any later version.
+
+ GNU Taler 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
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+import test from "ava";
+import { internalSetStrings, str, Translate } from "./i18n";
+import { strings } from "../i18n/strings";
+import React from "react";
+import { render } from "enzyme";
+import { configure } from "enzyme";
+import Adapter from "enzyme-adapter-react-16";
+
+configure({ adapter: new Adapter() });
+
+const testStrings = {
+  domain: "messages",
+  locale_data: {
+    messages: {
+      str1: ["foo1"],
+      str2: [""],
+      "str3 %1$s / %2$s": ["foo3 %2$s ; %1$s"],
+      "": {
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
+      },
+    },
+  },
+};
+
+test("str translation", (t) => {
+  // Alias, so we nly use the function for lookups, not for string extranction.
+  const strAlias = str;
+  const TranslateAlias = Translate;
+  internalSetStrings(testStrings);
+  t.is(strAlias`str1`, "foo1");
+  t.is(strAlias`str2`, "str2");
+  const a = "a";
+  const b = "b";
+  t.is(strAlias`str3 ${a} / ${b}`, "foo3 b ; a");
+  const r = render(<TranslateAlias>str1</TranslateAlias>);
+  t.is(r.text(), "foo1");
+
+  const r2 = render(
+    <TranslateAlias>
+      str3 <span>{a}</span> / <span>{b}</span>
+    </TranslateAlias>,
+  );
+  t.is(r2.text(), "foo3 b ; a");
+
+  t.pass();
+});
+
+test("existing str translation", (t) => {
+  internalSetStrings(strings);
+  t.pass();
+});
diff --git a/src/webex/i18n.tsx b/src/webex/i18n.tsx
index 4c111a05..6b5c2318 100644
--- a/src/webex/i18n.tsx
+++ b/src/webex/i18n.tsx
@@ -28,7 +28,7 @@ import * as jedLib from "jed";
 
 import * as React from "react";
 
-const jed = setupJed();
+let jed = setupJed();
 
 const enableTracing = false;
 
@@ -54,6 +54,14 @@ function setupJed(): any {
   return new jedLib.Jed(strings[lang]);
 }
 
+/**
+ * Use different translations for testing.  Should not be used outside
+ * of test cases.
+ */
+export function internalSetStrings(langStrings: any): void {
+  jed = new jedLib.Jed(langStrings);
+}
+
 /**
  * Convert template strings to a msgid
  */
@@ -110,6 +118,37 @@ interface TranslateProps {
   wrapProps?: any;
 }
 
+function getTranslatedChildren(
+  translation: string,
+  children: React.ReactNode,
+): React.ReactNode[] {
+  const tr = translation.split(/%(\d+)\$s/);
+  const childArray = React.Children.toArray(children);
+  // Merge consecutive string children.
+  const placeholderChildren = [];
+  for (let i = 0; i < childArray.length; i++) {
+    const x = childArray[i];
+    if (x === undefined) {
+      continue;
+    } else if (typeof x === "string") {
+      continue;
+    } else {
+      placeholderChildren.push(x);
+    }
+  }
+  const result = [];
+  for (let i = 0; i < tr.length; i++) {
+    if (i % 2 == 0) {
+      // Text
+      result.push(tr[i]);
+    } else {
+      const childIdx = Number.parseInt(tr[i]) - 1;
+      result.push(placeholderChildren[childIdx]);
+    }
+  }
+  return result;
+}
+
 /**
  * Translate text node children of this component.
  * If a child component might produce a text node, it must be wrapped
@@ -125,35 +164,8 @@ interface TranslateProps {
 export class Translate extends React.Component<TranslateProps, {}> {
   render(): JSX.Element {
     const s = stringifyChildren(this.props.children);
-    const tr = jed
-      .ngettext(s, s, 1)
-      .split(/%(\d+)\$s/)
-      .filter((e: any, i: number) => i % 2 === 0);
-    const childArray = React.Children.toArray(this.props.children);
-    for (let i = 0; i < childArray.length - 1; ++i) {
-      if (
-        typeof childArray[i] === "string" &&
-        typeof childArray[i + 1] === "string"
-      ) {
-        childArray[i + 1] = (childArray[i] as string).concat(
-          childArray[i + 1] as string,
-        );
-        childArray.splice(i, 1);
-      }
-    }
-    const result = [];
-    while (childArray.length > 0) {
-      const x = childArray.shift();
-      if (x === undefined) {
-        continue;
-      }
-      if (typeof x === "string") {
-        const t = tr.shift();
-        result.push(t);
-      } else {
-        result.push(x);
-      }
-    }
+    const translation: string = jed.ngettext(s, s, 1);
+    const result = getTranslatedChildren(translation, this.props.children);
     if (!this.props.wrap) {
       return <div>{result}</div>;
     }
@@ -216,34 +228,8 @@ export class TranslatePlural extends React.Component<
 > {
   render(): JSX.Element {
     const s = stringifyChildren(this.props.children);
-    const tr = jed
-      .ngettext(s, s, 1)
-      .split(/%(\d+)\$s/)
-      .filter((e: any, i: number) => i % 2 === 0);
-    const childArray = React.Children.toArray(this.props.children);
-    for (let i = 0; i < childArray.length - 1; ++i) {
-      if (
-        typeof childArray[i] === "string" &&
-        typeof childArray[i + 1] === "string"
-      ) {
-        childArray[i + i] = ((childArray[i] as string) +
-          childArray[i + 1]) as string;
-        childArray.splice(i, 1);
-      }
-    }
-    const result = [];
-    while (childArray.length > 0) {
-      const x = childArray.shift();
-      if (x === undefined) {
-        continue;
-      }
-      if (typeof x === "string") {
-        const t = tr.shift();
-        result.push(t);
-      } else {
-        result.push(x);
-      }
-    }
+    const translation = jed.ngettext(s, s, 1);
+    const result = getTranslatedChildren(translation, this.props.children);
     return <div>{result}</div>;
   }
 }
@@ -257,34 +243,8 @@ export class TranslateSingular extends React.Component<
 > {
   render(): JSX.Element {
     const s = stringifyChildren(this.props.children);
-    const tr = jed
-      .ngettext(s, s, 1)
-      .split(/%(\d+)\$s/)
-      .filter((e: any, i: number) => i % 2 === 0);
-    const childArray = React.Children.toArray(this.props.children);
-    for (let i = 0; i < childArray.length - 1; ++i) {
-      if (
-        typeof childArray[i] === "string" &&
-        typeof childArray[i + 1] === "string"
-      ) {
-        childArray[i + i] = ((childArray[i] as string) +
-          childArray[i + 1]) as string;
-        childArray.splice(i, 1);
-      }
-    }
-    const result = [];
-    while (childArray.length > 0) {
-      const x = childArray.shift();
-      if (x === undefined) {
-        continue;
-      }
-      if (typeof x === "string") {
-        const t = tr.shift();
-        result.push(t);
-      } else {
-        result.push(x);
-      }
-    }
+    const translation = jed.ngettext(s, s, this.props.target);
+    const result = getTranslatedChildren(translation, this.props.children);
     return <div>{result}</div>;
   }
 }
diff --git a/yarn.lock b/yarn.lock
index a877779b..c6b1061a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -273,7 +273,7 @@
     "@rollup/pluginutils" "^3.0.4"
     magic-string "^0.25.5"
 
-"@rollup/pluginutils@^3.0.4":
+"@rollup/pluginutils@^3.0.1", "@rollup/pluginutils@^3.0.4":
   version "3.0.8"
   resolved 
"https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.0.8.tgz#4e94d128d94b90699e517ef045422960d18c8fde";
   integrity 
sha512-rYGeAc4sxcZ+kPG/Tw4/fwJODC3IXHYDH4qusdN/b6aLw5LPUbzpecYbEJh4sVQGPFJxd2dBU4kc1H3oy9/bnw==
@@ -292,6 +292,13 @@
   dependencies:
     defer-to-connect "^1.0.1"
 
+"@types/cheerio@*":
+  version "0.22.17"
+  resolved 
"https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.17.tgz#e54f71c3135f71ebc16c8dc62edad533872c9e72";
+  integrity 
sha512-izlm+hbqWN9csuB9GSMfCnAyd3/57XZi3rfz1B0C4QBGVMp+9xQ7+9KYnep+ySfUrCWql4lGzkLf0XmprXcz9g==
+  dependencies:
+    "@types/node" "*"
+
 "@types/chrome@^0.0.103":
   version "0.0.103"
   resolved 
"https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.103.tgz#604f3d94ab4465cc8cde302c4916f4955eb7e8b6";
@@ -305,6 +312,21 @@
   resolved 
"https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0";
   integrity 
sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
 
+"@types/enzyme-adapter-react-16@^1.0.6":
+  version "1.0.6"
+  resolved 
"https://registry.yarnpkg.com/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.6.tgz#8aca7ae2fd6c7137d869b6616e696d21bb8b0cec";
+  integrity 
sha512-VonDkZ15jzqDWL8mPFIQnnLtjwebuL9YnDkqeCDYnB4IVgwUm0mwKkqhrxLL6mb05xm7qqa3IE95m8CZE9imCg==
+  dependencies:
+    "@types/enzyme" "*"
+
+"@types/enzyme@*", "@types/enzyme@^3.10.5":
+  version "3.10.5"
+  resolved 
"https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.10.5.tgz#fe7eeba3550369eed20e7fb565bfb74eec44f1f0";
+  integrity 
sha512-R+phe509UuUYy9Tk0YlSbipRpfVtIzb/9BHn5pTEtjJTF5LXvUjrIQcZvNyANNEyFrd2YGs196PniNT1fgvOQA==
+  dependencies:
+    "@types/cheerio" "*"
+    "@types/react" "*"
+
 "@types/eslint-visitor-keys@^1.0.0":
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d";
@@ -398,26 +420,16 @@
   dependencies:
     "@types/node" "*"
 
-"@typescript-eslint/eslint-plugin@^2.26.0":
-  version "2.26.0"
-  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz#04c96560c8981421e5a9caad8394192363cc423f";
-  integrity 
sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==
+"@typescript-eslint/eslint-plugin@^2.27.0":
+  version "2.27.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.27.0.tgz#e479cdc4c9cf46f96b4c287755733311b0d0ba4b";
+  integrity 
sha512-/my+vVHRN7zYgcp0n4z5A6HAK7bvKGBiswaM5zIlOQczsxj/aiD7RcgD+dvVFuwFaGh5+kM7XA6Q6PN0bvb1tw==
   dependencies:
-    "@typescript-eslint/experimental-utils" "2.26.0"
+    "@typescript-eslint/experimental-utils" "2.27.0"
     functional-red-black-tree "^1.0.1"
     regexpp "^3.0.0"
     tsutils "^3.17.1"
 
-"@typescript-eslint/experimental-utils@2.26.0":
-  version "2.26.0"
-  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz#063390c404d9980767d76274df386c0aa675d91d";
-  integrity 
sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==
-  dependencies:
-    "@types/json-schema" "^7.0.3"
-    "@typescript-eslint/typescript-estree" "2.26.0"
-    eslint-scope "^5.0.0"
-    eslint-utils "^2.0.0"
-
 "@typescript-eslint/experimental-utils@2.27.0":
   version "2.27.0"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a";
@@ -428,7 +440,7 @@
     eslint-scope "^5.0.0"
     eslint-utils "^2.0.0"
 
-"@typescript-eslint/parser@^2.24.0":
+"@typescript-eslint/parser@^2.24.0", "@typescript-eslint/parser@^2.27.0":
   version "2.27.0"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.27.0.tgz#d91664335b2c46584294e42eb4ff35838c427287";
   integrity 
sha512-HFUXZY+EdwrJXZo31DW4IS1ujQW3krzlRjBrFRrJcMDh0zCu107/nRfhk/uBasO8m0NVDbBF5WZKcIUMRO7vPg==
@@ -438,29 +450,6 @@
     "@typescript-eslint/typescript-estree" "2.27.0"
     eslint-visitor-keys "^1.1.0"
 
-"@typescript-eslint/parser@^2.26.0":
-  version "2.26.0"
-  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f";
-  integrity 
sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==
-  dependencies:
-    "@types/eslint-visitor-keys" "^1.0.0"
-    "@typescript-eslint/experimental-utils" "2.26.0"
-    "@typescript-eslint/typescript-estree" "2.26.0"
-    eslint-visitor-keys "^1.1.0"
-
-"@typescript-eslint/typescript-estree@2.26.0":
-  version "2.26.0"
-  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz#d8132cf1ee8a72234f996519a47d8a9118b57d56";
-  integrity 
sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==
-  dependencies:
-    debug "^4.1.1"
-    eslint-visitor-keys "^1.1.0"
-    glob "^7.1.6"
-    is-glob "^4.0.1"
-    lodash "^4.17.15"
-    semver "^6.3.0"
-    tsutils "^3.17.1"
-
 "@typescript-eslint/typescript-estree@2.27.0":
   version "2.27.0"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz#a288e54605412da8b81f1660b56c8b2e42966ce8";
@@ -492,6 +481,22 @@ aggregate-error@^3.0.0:
     clean-stack "^2.0.0"
     indent-string "^4.0.0"
 
+airbnb-prop-types@^2.15.0:
+  version "2.15.0"
+  resolved 
"https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz#5287820043af1eb469f5b0af0d6f70da6c52aaef";
+  integrity 
sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==
+  dependencies:
+    array.prototype.find "^2.1.0"
+    function.prototype.name "^1.1.1"
+    has "^1.0.3"
+    is-regex "^1.0.4"
+    object-is "^1.0.1"
+    object.assign "^4.1.0"
+    object.entries "^1.1.0"
+    prop-types "^15.7.2"
+    prop-types-exact "^1.2.0"
+    react-is "^16.9.0"
+
 ajv@^6.10.0, ajv@^6.10.2:
   version "6.12.0"
   resolved 
"https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7";
@@ -594,6 +599,11 @@ aria-query@^3.0.0:
     ast-types-flow "0.0.7"
     commander "^2.11.0"
 
+array-filter@^1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83";
+  integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=
+
 array-find-index@^1.0.1:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1";
@@ -613,7 +623,15 @@ array-union@^2.1.0:
   resolved 
"https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d";
   integrity 
sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
 
-array.prototype.flat@^1.2.1:
+array.prototype.find@^2.1.0:
+  version "2.1.1"
+  resolved 
"https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c";
+  integrity 
sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.4"
+
+array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3:
   version "1.2.3"
   resolved 
"https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b";
   integrity 
sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
@@ -651,6 +669,11 @@ astral-regex@^2.0.0:
   resolved 
"https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31";
   integrity 
sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
 
+atob@^2.1.2:
+  version "2.1.2"
+  resolved 
"https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9";
+  integrity 
sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
 ava@^3.6.0:
   version "3.6.0"
   resolved 
"https://registry.yarnpkg.com/ava/-/ava-3.6.0.tgz#1fa57f8601a81d11b4771ba701428d9972659dfd";
@@ -741,6 +764,11 @@ blueimp-md5@^2.10.0:
   resolved 
"https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.12.0.tgz#be7367938a889dec3ffbb71138617c117e9c130a";
   integrity 
sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ==
 
+boolbase@~1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
+  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
 boxen@^4.2.0:
   version "4.2.0"
   resolved 
"https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64";
@@ -852,6 +880,18 @@ chardet@^0.7.0:
   resolved 
"https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e";
   integrity 
sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
 
+cheerio@^1.0.0-rc.3:
+  version "1.0.0-rc.3"
+  resolved 
"https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6";
+  integrity 
sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==
+  dependencies:
+    css-select "~1.2.0"
+    dom-serializer "~0.1.1"
+    entities "~1.1.1"
+    htmlparser2 "^3.9.1"
+    lodash "^4.15.0"
+    parse5 "^3.0.1"
+
 chokidar@^3.3.1:
   version "3.3.1"
   resolved 
"https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450";
@@ -974,7 +1014,7 @@ color-name@~1.1.4:
   resolved 
"https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2";
   integrity 
sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
 
-commander@^2.11.0, commander@^2.20.0, commander@~2.20.3:
+commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
   version "2.20.3"
   resolved 
"https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33";
   integrity 
sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -1075,6 +1115,21 @@ crypto-random-string@^2.0.0:
   resolved 
"https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5";
   integrity 
sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
 
+css-select@~1.2.0:
+  version "1.2.0"
+  resolved 
"https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858";
+  integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
+  dependencies:
+    boolbase "~1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "~1.0.1"
+
+css-what@2.1:
+  version "2.1.3"
+  resolved 
"https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2";
+  integrity 
sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+
 csstype@^2.2.0:
   version "2.6.7"
   resolved 
"https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5";
@@ -1125,6 +1180,11 @@ decamelize@^1.2.0:
   resolved 
"https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290";
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved 
"https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545";
+  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
 decompress-response@^3.3.0:
   version "3.3.0"
   resolved 
"https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3";
@@ -1189,6 +1249,11 @@ dir-glob@^3.0.1:
   dependencies:
     path-type "^4.0.0"
 
+discontinuous-range@1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a";
+  integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=
+
 doctrine@1.5.0:
   version "1.5.0"
   resolved 
"https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa";
@@ -1211,6 +1276,55 @@ doctrine@^3.0.0:
   dependencies:
     esutils "^2.0.2"
 
+dom-serializer@0:
+  version "0.2.2"
+  resolved 
"https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51";
+  integrity 
sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+  dependencies:
+    domelementtype "^2.0.1"
+    entities "^2.0.0"
+
+dom-serializer@~0.1.1:
+  version "0.1.1"
+  resolved 
"https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0";
+  integrity 
sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
+  dependencies:
+    domelementtype "^1.3.0"
+    entities "^1.1.1"
+
+domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
+  version "1.3.1"
+  resolved 
"https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f";
+  integrity 
sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+  version "2.0.1"
+  resolved 
"https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d";
+  integrity 
sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
+
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved 
"https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803";
+  integrity 
sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+  dependencies:
+    domelementtype "1"
+
+domutils@1.5.1:
+  version "1.5.1"
+  resolved 
"https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf";
+  integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved 
"https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a";
+  integrity 
sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
 dot-prop@^5.2.0:
   version "5.2.0"
   resolved 
"https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb";
@@ -1252,6 +1366,79 @@ end-of-stream@^1.1.0:
   dependencies:
     once "^1.4.0"
 
+entities@^1.1.1, entities@~1.1.1:
+  version "1.1.2"
+  resolved 
"https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56";
+  integrity 
sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4";
+  integrity 
sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
+
+enzyme-adapter-react-16@^1.15.2:
+  version "1.15.2"
+  resolved 
"https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz#b16db2f0ea424d58a808f9df86ab6212895a4501";
+  integrity 
sha512-SkvDrb8xU3lSxID8Qic9rB8pvevDbLybxPK6D/vW7PrT0s2Cl/zJYuXvsd1EBTz0q4o3iqG3FJhpYz3nUNpM2Q==
+  dependencies:
+    enzyme-adapter-utils "^1.13.0"
+    enzyme-shallow-equal "^1.0.1"
+    has "^1.0.3"
+    object.assign "^4.1.0"
+    object.values "^1.1.1"
+    prop-types "^15.7.2"
+    react-is "^16.12.0"
+    react-test-renderer "^16.0.0-0"
+    semver "^5.7.0"
+
+enzyme-adapter-utils@^1.13.0:
+  version "1.13.0"
+  resolved 
"https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz#01c885dde2114b4690bf741f8dc94cee3060eb78";
+  integrity 
sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ==
+  dependencies:
+    airbnb-prop-types "^2.15.0"
+    function.prototype.name "^1.1.2"
+    object.assign "^4.1.0"
+    object.fromentries "^2.0.2"
+    prop-types "^15.7.2"
+    semver "^5.7.1"
+
+enzyme-shallow-equal@^1.0.1:
+  version "1.0.1"
+  resolved 
"https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz#7afe03db3801c9b76de8440694096412a8d9d49e";
+  integrity 
sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ==
+  dependencies:
+    has "^1.0.3"
+    object-is "^1.0.2"
+
+enzyme@^3.11.0:
+  version "3.11.0"
+  resolved 
"https://registry.yarnpkg.com/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28";
+  integrity 
sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==
+  dependencies:
+    array.prototype.flat "^1.2.3"
+    cheerio "^1.0.0-rc.3"
+    enzyme-shallow-equal "^1.0.1"
+    function.prototype.name "^1.1.2"
+    has "^1.0.3"
+    html-element-map "^1.2.0"
+    is-boolean-object "^1.0.1"
+    is-callable "^1.1.5"
+    is-number-object "^1.0.4"
+    is-regex "^1.0.5"
+    is-string "^1.0.5"
+    is-subset "^0.1.1"
+    lodash.escape "^4.0.1"
+    lodash.isequal "^4.5.0"
+    object-inspect "^1.7.0"
+    object-is "^1.0.2"
+    object.assign "^4.1.0"
+    object.entries "^1.1.1"
+    object.values "^1.1.1"
+    raf "^3.4.1"
+    rst-selector-parser "^2.2.3"
+    string.prototype.trim "^1.2.1"
+
 equal-length@^1.0.0:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c";
@@ -1264,7 +1451,7 @@ error-ex@^1.2.0, error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
-es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5:
+es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, 
es-abstract@^1.17.5:
   version "1.17.5"
   resolved 
"https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9";
   integrity 
sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
@@ -1701,11 +1888,25 @@ function-bind@^1.1.1:
   resolved 
"https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
   integrity 
sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 
+function.prototype.name@^1.1.1, function.prototype.name@^1.1.2:
+  version "1.1.2"
+  resolved 
"https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45";
+  integrity 
sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    functions-have-names "^1.2.0"
+
 functional-red-black-tree@^1.0.1:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327";
   integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
 
+functions-have-names@^1.2.0:
+  version "1.2.1"
+  resolved 
"https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91";
+  integrity 
sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==
+
 gensync@^1.0.0-beta.1:
   version "1.0.0-beta.1"
   resolved 
"https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269";
@@ -1892,11 +2093,30 @@ hosted-git-info@^2.1.4:
   resolved 
"https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c";
   integrity 
sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==
 
+html-element-map@^1.2.0:
+  version "1.2.0"
+  resolved 
"https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22";
+  integrity 
sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw==
+  dependencies:
+    array-filter "^1.0.0"
+
 html-escaper@^2.0.0:
   version "2.0.2"
   resolved 
"https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453";
   integrity 
sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
 
+htmlparser2@^3.9.1:
+  version "3.10.1"
+  resolved 
"https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f";
+  integrity 
sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+  dependencies:
+    domelementtype "^1.3.1"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^3.1.1"
+
 http-cache-semantics@^4.0.0:
   version "4.0.3"
   resolved 
"https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5";
@@ -1973,7 +2193,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2:
+inherits@2, inherits@^2.0.1, inherits@^2.0.3:
   version "2.0.4"
   resolved 
"https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c";
   integrity 
sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -2033,6 +2253,11 @@ is-binary-path@~2.1.0:
   dependencies:
     binary-extensions "^2.0.0"
 
+is-boolean-object@^1.0.1:
+  version "1.0.1"
+  resolved 
"https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e";
+  integrity 
sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==
+
 is-callable@^1.1.4, is-callable@^1.1.5:
   version "1.1.5"
   resolved 
"https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab";
@@ -2100,6 +2325,11 @@ is-npm@^4.0.0:
   resolved 
"https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d";
   integrity 
sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
 
+is-number-object@^1.0.4:
+  version "1.0.4"
+  resolved 
"https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197";
+  integrity 
sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==
+
 is-number@^7.0.0:
   version "7.0.0"
   resolved 
"https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b";
@@ -2139,7 +2369,7 @@ is-reference@^1.1.2:
   dependencies:
     "@types/estree" "0.0.39"
 
-is-regex@^1.0.5:
+is-regex@^1.0.4, is-regex@^1.0.5:
   version "1.0.5"
   resolved 
"https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae";
   integrity 
sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
@@ -2156,6 +2386,11 @@ is-string@^1.0.5:
   resolved 
"https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6";
   integrity 
sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
 
+is-subset@^0.1.1:
+  version "0.1.1"
+  resolved 
"https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6";
+  integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=
+
 is-symbol@^1.0.2:
   version "1.0.3"
   resolved 
"https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937";
@@ -2411,11 +2646,21 @@ lodash.clonedeep@^4.5.0:
   resolved 
"https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef";
   integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
 
+lodash.escape@^4.0.1:
+  version "4.0.1"
+  resolved 
"https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98";
+  integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=
+
 lodash.flattendeep@^4.4.0:
   version "4.4.0"
   resolved 
"https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2";
   integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=
 
+lodash.isequal@^4.5.0:
+  version "4.5.0"
+  resolved 
"https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0";
+  integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
+
 lodash.islength@^4.0.1:
   version "4.0.1"
   resolved 
"https://registry.yarnpkg.com/lodash.islength/-/lodash.islength-4.0.1.tgz#4e9868d452575d750affd358c979543dc20ed577";
@@ -2426,7 +2671,7 @@ lodash.merge@^4.6.1:
   resolved 
"https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a";
   integrity 
sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
 
-lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
+lodash@^4.15.0, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
   version "4.17.15"
   resolved 
"https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548";
   integrity 
sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -2576,6 +2821,11 @@ moment@^2.18.1:
   resolved 
"https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b";
   integrity 
sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
 
+moo@^0.5.0:
+  version "0.5.1"
+  resolved 
"https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4";
+  integrity 
sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==
+
 ms@2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8";
@@ -2596,6 +2846,17 @@ natural-compare@^1.4.0:
   resolved 
"https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7";
   integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
+nearley@^2.7.10:
+  version "2.19.1"
+  resolved 
"https://registry.yarnpkg.com/nearley/-/nearley-2.19.1.tgz#4af4006e16645ff800e9f993c3af039857d9dbdc";
+  integrity 
sha512-xq47GIUGXxU9vQg7g/y1o1xuKnkO7ev4nRWqftmQrLkfnE/FjRqDaGOUakM8XHPn/6pW3bGjU2wgoJyId90rqg==
+  dependencies:
+    commander "^2.19.0"
+    moo "^0.5.0"
+    railroad-diagrams "^1.0.0"
+    randexp "0.4.6"
+    semver "^5.4.1"
+
 neo-async@^2.6.0:
   version "2.6.1"
   resolved 
"https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c";
@@ -2641,6 +2902,13 @@ normalize-url@^4.1.0:
   resolved 
"https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129";
   integrity 
sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
 
+nth-check@~1.0.1:
+  version "1.0.2"
+  resolved 
"https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c";
+  integrity 
sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+  dependencies:
+    boolbase "~1.0.0"
+
 nyc@^15.0.1:
   version "15.0.1"
   resolved 
"https://registry.yarnpkg.com/nyc/-/nyc-15.0.1.tgz#bd4d5c2b17f2ec04370365a5ca1fc0ed26f9f93d";
@@ -2683,6 +2951,11 @@ object-inspect@^1.7.0:
   resolved 
"https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67";
   integrity 
sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
 
+object-is@^1.0.1, object-is@^1.0.2:
+  version "1.0.2"
+  resolved 
"https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4";
+  integrity 
sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==
+
 object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
   version "1.1.1"
   resolved 
"https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e";
@@ -2698,7 +2971,7 @@ object.assign@^4.1.0:
     has-symbols "^1.0.0"
     object-keys "^1.0.11"
 
-object.entries@^1.1.1:
+object.entries@^1.1.0, object.entries@^1.1.1:
   version "1.1.1"
   resolved 
"https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b";
   integrity 
sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==
@@ -2894,6 +3167,13 @@ parse-ms@^2.1.0:
   resolved 
"https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d";
   integrity 
sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==
 
+parse5@^3.0.1:
+  version "3.0.3"
+  resolved 
"https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c";
+  integrity 
sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==
+  dependencies:
+    "@types/node" "*"
+
 path-exists@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
@@ -2936,6 +3216,11 @@ path-type@^4.0.0:
   resolved 
"https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b";
   integrity 
sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved 
"https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+  integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
 picomatch@^2.0.4, picomatch@^2.0.5:
   version "2.1.1"
   resolved 
"https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5";
@@ -3034,6 +3319,15 @@ progress@^2.0.0, progress@^2.0.3:
   resolved 
"https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8";
   integrity 
sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
+prop-types-exact@^1.2.0:
+  version "1.2.0"
+  resolved 
"https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869";
+  integrity 
sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==
+  dependencies:
+    has "^1.0.3"
+    object.assign "^4.1.0"
+    reflect.ownkeys "^0.2.0"
+
 prop-types@^15.6.2, prop-types@^15.7.2:
   version "15.7.2"
   resolved 
"https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5";
@@ -3068,6 +3362,26 @@ qrcode-generator@^1.4.3:
   resolved 
"https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz#63f771224854759329a99048806a53ed278740e7";
   integrity 
sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==
 
+raf@^3.4.1:
+  version "3.4.1"
+  resolved 
"https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39";
+  integrity 
sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
+  dependencies:
+    performance-now "^2.1.0"
+
+railroad-diagrams@^1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e";
+  integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=
+
+randexp@0.4.6:
+  version "0.4.6"
+  resolved 
"https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3";
+  integrity 
sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==
+  dependencies:
+    discontinuous-range "1.0.0"
+    ret "~0.1.10"
+
 rc@^1.2.8:
   version "1.2.8"
   resolved 
"https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
@@ -3088,11 +3402,26 @@ react-dom@^16.13.1:
     prop-types "^15.6.2"
     scheduler "^0.19.1"
 
+react-is@^16.12.0, react-is@^16.8.6, react-is@^16.9.0:
+  version "16.13.1"
+  resolved 
"https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4";
+  integrity 
sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
 react-is@^16.8.1:
   version "16.12.0"
   resolved 
"https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c";
   integrity 
sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==
 
+react-test-renderer@^16.0.0-0:
+  version "16.13.1"
+  resolved 
"https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1";
+  integrity 
sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ==
+  dependencies:
+    object-assign "^4.1.1"
+    prop-types "^15.6.2"
+    react-is "^16.8.6"
+    scheduler "^0.19.1"
+
 react@^16.13.1:
   version "16.13.1"
   resolved 
"https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e";
@@ -3129,6 +3458,15 @@ read-pkg@^5.2.0:
     parse-json "^5.0.0"
     type-fest "^0.6.0"
 
+readable-stream@^3.1.1:
+  version "3.6.0"
+  resolved 
"https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198";
+  integrity 
sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
 readdirp@~3.3.0:
   version "3.3.0"
   resolved 
"https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17";
@@ -3143,6 +3481,11 @@ rechoir@^0.6.2:
   dependencies:
     resolve "^1.1.6"
 
+reflect.ownkeys@^0.2.0:
+  version "0.2.0"
+  resolved 
"https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460";
+  integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=
+
 regenerator-runtime@^0.13.4:
   version "0.13.5"
   resolved 
"https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697";
@@ -3215,6 +3558,11 @@ resolve-from@^5.0.0:
   resolved 
"https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69";
   integrity 
sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
 
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved 
"https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a";
+  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
 resolve@^1.1.6, resolve@^1.10.0:
   version "1.12.0"
   resolved 
"https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6";
@@ -3251,6 +3599,11 @@ restore-cursor@^3.1.0:
     onetime "^5.1.0"
     signal-exit "^3.0.2"
 
+ret@~0.1.10:
+  version "0.1.15"
+  resolved 
"https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
+  integrity 
sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
 reusify@^1.0.0:
   version "1.0.4"
   resolved 
"https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76";
@@ -3292,6 +3645,14 @@ rollup-plugin-node-resolve@^5.2.0:
     resolve "^1.11.1"
     rollup-pluginutils "^2.8.1"
 
+rollup-plugin-sourcemaps@^0.5.0:
+  version "0.5.0"
+  resolved 
"https://registry.yarnpkg.com/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.5.0.tgz#898e8411c9b5b7b524b4d96c3b41d5c43f9da77e";
+  integrity 
sha512-xp2vvRvgnYiXydgf/JFFFgYxrqMaQaOrK/g6yZvgwT9R1TSYjD3HKku1pD7iQNjQHkl5yGpokvJLp7cP/lR+aQ==
+  dependencies:
+    "@rollup/pluginutils" "^3.0.1"
+    source-map-resolve "^0.5.3"
+
 rollup-plugin-terser@^5.3.0:
   version "5.3.0"
   resolved 
"https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz#9c0dd33d5771df9630cd027d6a2559187f65885e";
@@ -3317,6 +3678,14 @@ rollup@^2.3.3:
   optionalDependencies:
     fsevents "~2.1.2"
 
+rst-selector-parser@^2.2.3:
+  version "2.2.3"
+  resolved 
"https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91";
+  integrity sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=
+  dependencies:
+    lodash.flattendeep "^4.4.0"
+    nearley "^2.7.10"
+
 run-async@^2.4.0:
   version "2.4.0"
   resolved 
"https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8";
@@ -3336,7 +3705,7 @@ rxjs@^6.5.3:
   dependencies:
     tslib "^1.9.0"
 
-safe-buffer@^5.0.1:
+safe-buffer@^5.0.1, safe-buffer@~5.2.0:
   version "5.2.0"
   resolved 
"https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519";
   integrity 
sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
@@ -3366,7 +3735,7 @@ semver-diff@^3.1.1:
   dependencies:
     semver "^6.3.0"
 
-"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1:
+"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, 
semver@^5.7.0, semver@^5.7.1:
   version "5.7.1"
   resolved 
"https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7";
   integrity 
sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -3460,6 +3829,25 @@ slice-ansi@^3.0.0:
     astral-regex "^2.0.0"
     is-fullwidth-code-point "^3.0.0"
 
+source-map-resolve@^0.5.3:
+  version "0.5.3"
+  resolved 
"https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a";
+  integrity 
sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+  dependencies:
+    atob "^2.1.2"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-resolve@^0.6.0:
+  version "0.6.0"
+  resolved 
"https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2";
+  integrity 
sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==
+  dependencies:
+    atob "^2.1.2"
+    decode-uri-component "^0.2.0"
+
 source-map-support@^0.5.12, source-map-support@^0.5.16, 
source-map-support@~0.5.12:
   version "0.5.16"
   resolved 
"https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042";
@@ -3468,6 +3856,11 @@ source-map-support@^0.5.12, source-map-support@^0.5.16, 
source-map-support@~0.5.
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved 
"https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3";
+  integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+
 source-map@^0.5.0:
   version "0.5.7"
   resolved 
"https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
@@ -3563,6 +3956,15 @@ string.prototype.matchall@^4.0.2:
     regexp.prototype.flags "^1.3.0"
     side-channel "^1.0.2"
 
+string.prototype.trim@^1.2.1:
+  version "1.2.1"
+  resolved 
"https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782";
+  integrity 
sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
+
 string.prototype.trimend@^1.0.0:
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373";
@@ -3597,6 +3999,13 @@ string.prototype.trimstart@^1.0.0:
     define-properties "^1.1.3"
     es-abstract "^1.17.5"
 
+string_decoder@^1.1.1:
+  version "1.3.0"
+  resolved 
"https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e";
+  integrity 
sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+  dependencies:
+    safe-buffer "~5.2.0"
+
 strip-ansi@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f";
@@ -3887,6 +4296,11 @@ uri-js@^4.2.2:
   dependencies:
     punycode "^2.1.0"
 
+urix@^0.1.0:
+  version "0.1.0"
+  resolved 
"https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72";
+  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
 url-parse-lax@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c";
@@ -3894,6 +4308,11 @@ url-parse-lax@^3.0.0:
   dependencies:
     prepend-http "^2.0.0"
 
+util-deprecate@^1.0.1:
+  version "1.0.2"
+  resolved 
"https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
 uuid@^3.3.3:
   version "3.4.0"
   resolved 
"https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee";

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]