summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-08-27 11:28:26 -0300
committerSebastian <sebasjm@gmail.com>2021-08-27 11:28:39 -0300
commiteae88828683ec05d438dd4908d86b73e67e9707d (patch)
treebf8e494c40c0f6f03a5a35fdf19c609fe7d75a7a
parentf4cbd85008d14a78433b9495cce48903192e2e0d (diff)
downloadmerchant-backoffice-eae88828683ec05d438dd4908d86b73e67e9707d.tar.gz
merchant-backoffice-eae88828683ec05d438dd4908d86b73e67e9707d.tar.bz2
merchant-backoffice-eae88828683ec05d438dd4908d86b73e67e9707d.zip
merchant backend pages
-rw-r--r--packages/backend/.gitignore8
-rw-r--r--packages/backend/.linaria-cache/src/pages/OfferTip.linaria.css2
-rw-r--r--packages/backend/.storybook/.babelrc25
-rw-r--r--packages/backend/.storybook/main.js82
-rw-r--r--packages/backend/.storybook/preview.js73
-rwxr-xr-xpackages/backend/contrib/po2ts42
-rw-r--r--packages/backend/copyleft-header.js15
-rw-r--r--packages/backend/package.json142
-rw-r--r--packages/backend/rollup.config.js100
-rw-r--r--packages/backend/src/assets/empty.pngbin0 -> 2785 bytes
-rw-r--r--packages/backend/src/assets/icons/android-chrome-192x192.pngbin0 -> 14058 bytes
-rw-r--r--packages/backend/src/assets/icons/android-chrome-512x512.pngbin0 -> 51484 bytes
-rw-r--r--packages/backend/src/assets/icons/apple-touch-icon.pngbin0 -> 12746 bytes
-rw-r--r--packages/backend/src/assets/icons/favicon-16x16.pngbin0 -> 626 bytes
-rw-r--r--packages/backend/src/assets/icons/favicon-32x32.pngbin0 -> 1487 bytes
-rw-r--r--packages/backend/src/assets/icons/languageicon.svg48
-rw-r--r--packages/backend/src/assets/icons/mstile-150x150.pngbin0 -> 9050 bytes
-rw-r--r--packages/backend/src/context/backend.ts82
-rw-r--r--packages/backend/src/context/config.ts32
-rw-r--r--packages/backend/src/context/fetch.ts40
-rw-r--r--packages/backend/src/context/instance.ts35
-rw-r--r--packages/backend/src/context/listener.ts35
-rw-r--r--packages/backend/src/context/translation.ts59
-rw-r--r--packages/backend/src/css/pure-min.css973
-rw-r--r--packages/backend/src/css/style.css62
-rw-r--r--packages/backend/src/custom.d.ts40
-rw-r--r--packages/backend/src/declaration.d.ts1384
-rw-r--r--packages/backend/src/hooks/async.ts76
-rw-r--r--packages/backend/src/hooks/backend.ts262
-rw-r--r--packages/backend/src/hooks/index.ts110
-rw-r--r--packages/backend/src/hooks/instance.ts187
-rw-r--r--packages/backend/src/hooks/listener.ts68
-rw-r--r--packages/backend/src/hooks/notification.ts43
-rw-r--r--packages/backend/src/hooks/notifications.ts48
-rw-r--r--packages/backend/src/hooks/order.ts217
-rw-r--r--packages/backend/src/hooks/product.ts199
-rw-r--r--packages/backend/src/hooks/tips.ts159
-rw-r--r--packages/backend/src/hooks/transfer.ts150
-rw-r--r--packages/backend/src/i18n/de.po1057
-rw-r--r--packages/backend/src/i18n/en.po1057
-rw-r--r--packages/backend/src/i18n/es.po1065
-rw-r--r--packages/backend/src/i18n/fr.po1057
-rw-r--r--packages/backend/src/i18n/index.tsx203
-rw-r--r--packages/backend/src/i18n/it.po1057
-rw-r--r--packages/backend/src/i18n/poheader27
-rw-r--r--packages/backend/src/i18n/strings-prelude19
-rw-r--r--packages/backend/src/i18n/strings.ts3445
-rw-r--r--packages/backend/src/i18n/sv.po1057
-rw-r--r--packages/backend/src/i18n/taler-merchant-backoffice.pot1054
-rw-r--r--packages/backend/src/index.tsx67
-rw-r--r--packages/backend/src/pages/DepletedTip.stories.tsx40
-rw-r--r--packages/backend/src/pages/DepletedTip.tsx45
-rw-r--r--packages/backend/src/pages/OfferRefund.stories.tsx40
-rw-r--r--packages/backend/src/pages/OfferRefund.tsx103
-rw-r--r--packages/backend/src/pages/OfferTip.stories.tsx40
-rw-r--r--packages/backend/src/pages/OfferTip.tsx113
-rw-r--r--packages/backend/src/pages/RequestPayment.stories.tsx40
-rw-r--r--packages/backend/src/pages/RequestPayment.tsx125
-rw-r--r--packages/backend/src/pages/ShowOrderDetails.stories.tsx40
-rw-r--r--packages/backend/src/pages/ShowOrderDetails.tsx125
-rw-r--r--packages/backend/src/utils/amount.ts69
-rw-r--r--packages/backend/src/utils/constants.ts47
-rw-r--r--packages/backend/src/utils/table.ts37
-rw-r--r--packages/backend/src/utils/types.ts31
-rw-r--r--packages/backend/tests/__mocks__/browserMocks.ts42
-rw-r--r--packages/backend/tests/__mocks__/fileMocks.ts24
-rw-r--r--packages/backend/tests/__mocks__/fileTransformer.js31
-rw-r--r--packages/backend/tests/__mocks__/setupTests.ts28
-rw-r--r--packages/backend/tests/funcitons/regex.test.ts87
-rw-r--r--packages/backend/tests/util.ts62
-rw-r--r--packages/backend/tsconfig.back.json23
-rw-r--r--packages/backend/tsconfig.json61
-rw-r--r--packages/backend/tsconfig.tsbuildinfo2147
-rw-r--r--pnpm-lock.yaml716
74 files changed, 20031 insertions, 48 deletions
diff --git a/packages/backend/.gitignore b/packages/backend/.gitignore
new file mode 100644
index 0000000..db8559a
--- /dev/null
+++ b/packages/backend/.gitignore
@@ -0,0 +1,8 @@
+/build
+/size-plugin.json
+/storybook-static
+/docs
+/single
+/coverage
+/dist
+/.rollup.cache
diff --git a/packages/backend/.linaria-cache/src/pages/OfferTip.linaria.css b/packages/backend/.linaria-cache/src/pages/OfferTip.linaria.css
new file mode 100644
index 0000000..9ba2add
--- /dev/null
+++ b/packages/backend/.linaria-cache/src/pages/OfferTip.linaria.css
@@ -0,0 +1,2 @@
+.d54jv91{background-color:red;}
+/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9wYWdlcy9PZmZlclRpcC50c3giXSwibmFtZXMiOlsiLmQ1NGp2OTEiXSwibWFwcGluZ3MiOiJBQTJCTUEiLCJmaWxlIjoic3JjL3BhZ2VzL09mZmVyVGlwLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFRhbGVyXG4gKEMpIDIwMjEgVGFsZXIgU3lzdGVtcyBTLkEuXG5cbiBHTlUgVGFsZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGVcbiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlXG4gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblxuIEdOVSBUYWxlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTllcbiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUlxuIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuXG4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aFxuIEdOVSBUYWxlcjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz5cbiAqL1xuXG4vKipcbipcbiogQGF1dGhvciBTZWJhc3RpYW4gSmF2aWVyIE1hcmNoYW5vIChzZWJhc2ptKVxuKi9cbmltcG9ydCB7IHJlbmRlciwgaCwgVk5vZGUsIEZyYWdtZW50IH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3ByZWFjdC9ob29rcyc7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tIFwiQGxpbmFyaWEvcmVhY3RcIlxuaW1wb3J0IFwiLi4vY3NzL3B1cmUtbWluLmNzc1wiXG5pbXBvcnQgXCIuLi9jc3Mvc3R5bGUuY3NzXCJcblxuXG5jb25zdCBEaXZSZWQgPSBzdHlsZWQuZGl2YFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XG5gO1xuXG5leHBvcnQgZnVuY3Rpb24gT2ZmZXJUaXAoKTogVk5vZGUge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNoZWNrVXJsID0gXCJ7eyYgdGlwX3N0YXR1c191cmwgfX1cIjtcbiAgICBjb25zdCBkZWxheU1zID0gNTAwO1xuICAgIGZ1bmN0aW9uIGNoZWNrKCkge1xuICAgICAgbGV0IHJldHJpZWQgPSBmYWxzZTtcbiAgICAgIGZ1bmN0aW9uIHJldHJ5T25jZSgpIHtcbiAgICAgICAgaWYgKCFyZXRyaWVkKSB7XG4gICAgICAgICAgcmV0cmllZCA9IHRydWU7XG4gICAgICAgICAgY2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocmVxLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICBpZiAocmVxLnN0YXR1cyA9PT0gNDEwKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRUaW1lb3V0KHJldHJ5T25jZSwgZGVsYXlNcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0VGltZW91dChyZXRyeU9uY2UsIGRlbGF5TXMpO1xuICAgICAgfVxuICAgICAgLy8gcmVxLm9wZW4oXCJHRVRcIiwgY2hlY2tVcmwpO1xuICAgICAgcmVxLnNlbmQoKTtcbiAgICB9XG5cbiAgICAvLyBzZXRUaW1lb3V0KGNoZWNrLCBkZWxheU1zKTtcbiAgfSlcbiAgcmV0dXJuIDxGcmFnbWVudD5cbiAgPHNlY3Rpb24gaWQ9XCJtYWluXCIgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgPGgxPkNvbGxlY3QgVGFsZXIgdGlwPC9oMT5cbiAgICA8ZGl2IGNsYXNzPVwidGFsZXItaW5zdGFsbGVkLWhpZGVcIj5cbiAgICAgIDxwPlxuICAgICAgICBTY2FuIHRoaXMgUVIgY29kZSB3aXRoIHlvdXIgVGFsZXIgbW9iaWxlIHdhbGxldDpcbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJxclwiPlxuICAgICAgICB7Lyoge3t7dGFsZXJfdGlwX3FyY29kZV9zdmd9fX0gKi99XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwPlxuICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAvLyB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICd7e3RhbGVyX3JlZnVuZF91cml9fSdcbiAgICAgICAgfX0+XG4gICAgICAgICAgT3Igb3BlbiB5b3VyIFRhbGxlciB3YWxsZXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vd2FsbGV0LnRhbGVyLm5ldC9cIj5Eb24ndCBoYXZlIGEgVGFsZXIgd2FsbGV0IHlldD8gSW5zdGFsbCBpdCE8L2E+XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gICAgPGhyIC8+XG4gICAgPERpdlJlZD5cbiAgICAgIHRoaXMgYmFja2dyb3VuZCBpcyByZWRhc2RzYVxuICAgIDwvRGl2UmVkPlxuICA8L3NlY3Rpb24+XG4gIDxGb290ZXIgLz5cbiAgPC9GcmFnbWVudD5cbn1cblxuZnVuY3Rpb24gRm9vdGVyKCkge1xuICByZXR1cm4gPGRpdiBjbGFzcz1cInRhbGVyYmFyXCI+XG4gICAgPHA+WW91IGNhbiBsZWFybiBtb3JlIGFib3V0IEdOVSBUYWxlciBvbiBvdXIgPGEgaHJlZj1cImh0dHBzOi8vdGFsZXIubmV0L1wiPndlYnNpdGU8L2E+LjxiciAvPlxuICAgICAgQ29weXJpZ2h0ICZjb3B5OyAyMDE0Jm1kYXNoOzIwMjEgVGFsZXIgU3lzdGVtcyBTQTwvcD5cbiAgPC9kaXY+XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIFRpdGxlKCk6IFZOb2RlIHtcbiAgcmV0dXJuIDx0aXRsZT5UaXAgYXZhaWxhYmxlPC90aXRsZT5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1haW4oKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcmVuZGVyKDxPZmZlclRpcCAvPiwgZG9jdW1lbnQuYm9keSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiZ290IGVycm9yXCIsIGUpO1xuICAgIGRvY3VtZW50LmJvZHkuaW5uZXJUZXh0ID0gYEZhdGFsIGVycm9yOiBcIiR7ZS5tZXNzYWdlfVwiLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGJ1ZyBhdCBodHRwczovL2J1Z3MuZ251bmV0Lm9yZy8uYDtcbiAgfVxufVxuXG4iXX0=*/ \ No newline at end of file
diff --git a/packages/backend/.storybook/.babelrc b/packages/backend/.storybook/.babelrc
new file mode 100644
index 0000000..610b6f3
--- /dev/null
+++ b/packages/backend/.storybook/.babelrc
@@ -0,0 +1,25 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+ /**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
+{
+ "presets": [
+ "preact-cli/babel"
+ ]
+} \ No newline at end of file
diff --git a/packages/backend/.storybook/main.js b/packages/backend/.storybook/main.js
new file mode 100644
index 0000000..5497a65
--- /dev/null
+++ b/packages/backend/.storybook/main.js
@@ -0,0 +1,82 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+
+module.exports = {
+ "stories": [
+ "../src/**/*.stories.mdx",
+ "../src/**/*.stories.@(js|jsx|ts|tsx)"
+ ],
+ "addons": [
+ "@storybook/preset-scss",
+ "@storybook/addon-a11y",
+ "@storybook/addon-essentials" //docs, control, actions, viewpot, toolbar, background
+ ],
+ // sb does not yet support new jsx transform by default
+ // https://github.com/storybookjs/storybook/issues/12881
+ // https://github.com/storybookjs/storybook/issues/12952
+ babel: async (options) => ({
+ ...options,
+ presets: [
+ ...options.presets,
+ [
+ '@babel/preset-react', {
+ runtime: 'automatic',
+ },
+ 'preset-react-jsx-transform'
+ ],
+ "@linaria",
+ ],
+ }),
+ webpackFinal: (config) => {
+ // should be removed after storybook 6.3
+ // https://github.com/storybookjs/storybook/issues/12853#issuecomment-821576113
+ config.resolve.alias = {
+ react: "preact/compat",
+ "react-dom": "preact/compat",
+ };
+
+ // we need to add @linaria loader AFTER the babel-loader
+ // https://github.com/callstack/linaria/blob/master/docs/BUNDLERS_INTEGRATION.md#webpack
+ config.module.rules[0] = {
+ ...(config.module.rules[0]),
+ loader: undefined, // Disable the predefined babel-loader on the rule
+ use: [
+ {
+ ...(config.module.rules[0].use[0]),
+ loader: 'babel-loader',
+ },
+ {
+ loader: '@linaria/webpack-loader',
+ options: {
+ sourceMap: true, //always true since this is dev
+ babelOptions: {
+ presets: config.module.rules[0].use[0].options.presets,
+ }
+ // Pass the current babel options to linaria's babel instance
+ }
+ }
+ ]
+ };
+
+ return config;
+ },
+} \ No newline at end of file
diff --git a/packages/backend/.storybook/preview.js b/packages/backend/.storybook/preview.js
new file mode 100644
index 0000000..a9cc4c3
--- /dev/null
+++ b/packages/backend/.storybook/preview.js
@@ -0,0 +1,73 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 { ConfigContextProvider } from '../src/context/config'
+import { InstanceContextProvider } from '../src/context/instance'
+import { TranslationProvider } from '../src/context/translation'
+import { BackendContextProvider } from '../src/context/backend'
+import { h } from 'preact';
+
+const mockConfig = {
+ backendURL: 'http://demo.taler.net',
+ currency: 'TESTKUDOS'
+}
+
+const mockInstance = {
+ id: 'instance-id',
+ token: 'instance-token',
+ admin: false,
+}
+
+const mockBackend = {
+ url: 'http://merchant.url',
+ token: 'default-token',
+ triedToLog: false,
+}
+
+export const parameters = {
+ controls: { expanded: true },
+ // actions: { argTypesRegex: "^on.*" },
+}
+
+export const globalTypes = {
+ locale: {
+ name: 'Locale',
+ description: 'Internationalization locale',
+ defaultValue: 'en',
+ toolbar: {
+ icon: 'globe',
+ items: [
+ { value: 'en', right: 'πŸ‡ΊπŸ‡Έ', title: 'English' },
+ { value: 'es', right: 'πŸ‡ͺπŸ‡Έ', title: 'Spanish' },
+ ],
+ },
+ },
+};
+
+export const decorators = [
+ (Story, { globals }) => <TranslationProvider initial='en' forceLang={globals.locale}>
+ <Story />
+ </TranslationProvider>,
+ (Story) => <ConfigContextProvider value={mockConfig}>
+ <Story />
+ </ConfigContextProvider>,
+ (Story) => <InstanceContextProvider value={mockInstance}>
+ <Story />
+ </InstanceContextProvider>,
+ (Story) => <BackendContextProvider defaultUrl={mockBackend.url}>
+ <Story />
+ </BackendContextProvider>,
+];
diff --git a/packages/backend/contrib/po2ts b/packages/backend/contrib/po2ts
new file mode 100755
index 0000000..a135da6
--- /dev/null
+++ b/packages/backend/contrib/po2ts
@@ -0,0 +1,42 @@
+#!/usr/bin/env node
+/*
+ This file is part of GNU Taler
+ (C) 2020 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+ * Convert a <lang>.po file into a JavaScript / TypeScript expression.
+ */
+
+const po2json = require("po2json");
+
+const filename = process.argv[2];
+
+if (!filename) {
+ console.error("error: missing filename");
+ process.exit(1);
+}
+
+const m = filename.match(/([a-zA-Z0-9-_]+).po/);
+
+if (!m) {
+ console.error("error: unexpected filename (expected <lang>.po)");
+ process.exit(1);
+}
+
+const lang = m[1];
+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/packages/backend/copyleft-header.js b/packages/backend/copyleft-header.js
new file mode 100644
index 0000000..0794cb8
--- /dev/null
+++ b/packages/backend/copyleft-header.js
@@ -0,0 +1,15 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
diff --git a/packages/backend/package.json b/packages/backend/package.json
new file mode 100644
index 0000000..6a78f5f
--- /dev/null
+++ b/packages/backend/package.json
@@ -0,0 +1,142 @@
+{
+ "private": true,
+ "name": "merchant-backend",
+ "version": "0.0.4",
+ "license": "MIT",
+ "scripts": {
+ "build": "rollup -c",
+ "compile": "tsc",
+ "dev": "rollup -c -w",
+ "lint-check": "eslint '{src,tests}/**/*.{js,jsx,ts,tsx}'",
+ "lint-fix": "eslint --fix '{src,tests}/**/*.{js,jsx,ts,tsx}'",
+ "test": "jest ./tests",
+ "dev-test": "jest ./tests --watch",
+ "typedoc": "typedoc src",
+ "clean": "rimraf build storybook-static docs single",
+ "serve-dist": "sirv --port ${PORT:=8080} --cors --single dist",
+ "build-storybook": "build-storybook",
+ "storybook": "start-storybook -p 6006"
+ },
+ "engines": {
+ "node": ">=12",
+ "pnpm": ">=5"
+ },
+ "eslintConfig": {
+ "parser": "@typescript-eslint/parser",
+ "extends": [
+ "preact",
+ "plugin:@typescript-eslint/recommended"
+ ],
+ "plugins": [
+ "header"
+ ],
+ "rules": {
+ "header/header": [
+ 2,
+ "copyleft-header.js"
+ ]
+ },
+ "ignorePatterns": [
+ "build/"
+ ]
+ },
+ "dependencies": {
+ "@gnu-taler/taler-util": "0.8.3",
+ "axios": "^0.21.1",
+ "date-fns": "^2.21.1",
+ "history": "4.10.1",
+ "jed": "^1.1.1",
+ "preact": "^10.5.13",
+ "preact-router": "^3.2.1",
+ "qrcode-generator": "^1.4.4",
+ "swr": "^0.5.5",
+ "yup": "^0.32.9"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.13.16",
+ "@babel/plugin-transform-react-jsx-source": "^7.12.13",
+ "@creativebulma/bulma-tooltip": "^1.2.0",
+ "@gnu-taler/pogen": "^0.0.5",
+ "@linaria/babel-preset": "^3.0.0-beta.4",
+ "@linaria/core": "^3.0.0-beta.4",
+ "@linaria/react": "^3.0.0-beta.7",
+ "@linaria/rollup": "^3.0.0-beta.7",
+ "@linaria/shaker": "^3.0.0-beta.7",
+ "@linaria/webpack-loader": "^3.0.0-beta.7",
+ "@rollup/plugin-alias": "^3.1.5",
+ "@rollup/plugin-babel": "^5.3.0",
+ "@rollup/plugin-commonjs": "^20.0.0",
+ "@rollup/plugin-html": "^0.2.3",
+ "@rollup/plugin-image": "^2.1.1",
+ "@rollup/plugin-json": "^4.1.0",
+ "@rollup/plugin-replace": "^3.0.0",
+ "@rollup/plugin-typescript": "^8.2.5",
+ "@storybook/addon-a11y": "^6.2.9",
+ "@storybook/addon-actions": "^6.2.9",
+ "@storybook/addon-essentials": "^6.2.9",
+ "@storybook/addon-links": "^6.2.9",
+ "@storybook/preact": "^6.2.9",
+ "@storybook/preset-scss": "^1.0.3",
+ "@testing-library/preact": "^2.0.1",
+ "@testing-library/preact-hooks": "^1.1.0",
+ "@types/enzyme": "^3.10.8",
+ "@types/history": "^4.7.8",
+ "@types/jest": "^26.0.23",
+ "@types/mocha": "^8.2.2",
+ "@typescript-eslint/eslint-plugin": "^4.22.0",
+ "@typescript-eslint/parser": "^4.22.0",
+ "babel-loader": "^8.2.2",
+ "base64-inline-loader": "^1.1.1",
+ "bulma": "^0.9.2",
+ "bulma-checkbox": "^1.1.1",
+ "bulma-radio": "^1.1.1",
+ "bulma-responsive-tables": "^1.2.3",
+ "bulma-switch-control": "^1.1.1",
+ "bulma-timeline": "^3.0.4",
+ "bulma-upload-control": "^1.2.0",
+ "dotenv": "^8.2.0",
+ "enzyme": "^3.11.0",
+ "enzyme-adapter-preact-pure": "^3.1.0",
+ "eslint": "^7.25.0",
+ "eslint-config-preact": "^1.1.4",
+ "eslint-plugin-header": "^3.1.1",
+ "html-webpack-inline-chunk-plugin": "^1.1.1",
+ "html-webpack-inline-source-plugin": "0.0.10",
+ "html-webpack-skip-assets-plugin": "^1.0.1",
+ "inline-chunk-html-plugin": "^1.1.1",
+ "jest": "^26.6.3",
+ "jest-preset-preact": "^4.0.2",
+ "po2json": "^0.4.5",
+ "preact-cli": "^3.0.5",
+ "preact-render-to-json": "^3.6.6",
+ "preact-render-to-string": "^5.1.19",
+ "rimraf": "^3.0.2",
+ "rollup": "^2.56.3",
+ "rollup-plugin-bundle-html": "^0.2.2",
+ "rollup-plugin-css-only": "^3.1.0",
+ "sass": "^1.32.13",
+ "sass-loader": "10.1.1",
+ "script-ext-html-webpack-plugin": "^2.1.5",
+ "sirv-cli": "^1.0.11",
+ "tslib": "^2.3.1",
+ "typedoc": "^0.20.36",
+ "typescript": "^4.2.4"
+ },
+ "jest": {
+ "preset": "jest-preset-preact",
+ "transformIgnorePatterns": [
+ "node_modules/.pnpm/(?!(@gnu-taler\\+taler-util))",
+ "\\.pnp\\.[^\\/]+$"
+ ],
+ "setupFiles": [
+ "<rootDir>/tests/__mocks__/browserMocks.ts",
+ "<rootDir>/tests/__mocks__/setupTests.ts"
+ ],
+ "moduleNameMapper": {
+ "\\.(css|less)$": "identity-obj-proxy"
+ },
+ "transform": {
+ "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|po)$": "<rootDir>/tests/__mocks__/fileTransformer.js"
+ }
+ }
+}
diff --git a/packages/backend/rollup.config.js b/packages/backend/rollup.config.js
new file mode 100644
index 0000000..9051adc
--- /dev/null
+++ b/packages/backend/rollup.config.js
@@ -0,0 +1,100 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+// rollup.config.js
+import linaria from '@linaria/rollup';
+import nodeResolve from "@rollup/plugin-node-resolve";
+import alias from "@rollup/plugin-alias";
+import image from '@rollup/plugin-image';
+import json from "@rollup/plugin-json";
+import ts from "@rollup/plugin-typescript";
+import replace from "@rollup/plugin-replace";
+import css from 'rollup-plugin-css-only';
+import html from '@rollup/plugin-html';
+
+
+
+const template = async ({
+ files,
+ title
+}) => {
+ const scripts = (files.js || []).map(({ code }) => `<script>${code}</script>`).join('\n');
+ const css = (files.css || []).map(({ source }) => `<style>${source}</style>`).join('\n');
+ return `
+<!doctype html>
+<html>
+ <head>
+ <title>${title}</title>
+ ${css}
+ </head>
+ <body>
+ ${scripts}
+ <script>page.mountIntoBody()</script>
+ </body>
+</html>`;
+};
+
+const makePlugins = (name) => [
+ alias({
+ entries: [
+ { find: 'react', replacement: 'preact/compat' },
+ { find: 'react-dom', replacement: 'preact/compat' }
+ ]
+ }),
+
+ replace({
+ "process.env.NODE_ENV": JSON.stringify("production"),
+ preventAssignment: true,
+ }),
+
+ nodeResolve({
+ browser: true,
+ preferBuiltins: true,
+ }),
+
+ json(),
+ image(),
+
+ linaria({
+ sourceMap: process.env.NODE_ENV !== 'production',
+ }),
+ css(),
+ ts({
+ sourceMap: false,
+ outputToFilesystem: false,
+ }),
+ html({ template, fileName: name }),
+];
+
+
+const pageDefinition = (name) => ({
+ input: `src/pages/${name}.tsx`,
+ output: {
+ file: `dist/pages/${name}.js`,
+ format: "iife",
+ exports: 'named',
+ name: 'page',
+ },
+ plugins: makePlugins(`${name}.html`),
+});
+
+export default [
+ pageDefinition("OfferTip"),
+ pageDefinition("OfferRefund"),
+ pageDefinition("DepletedTip"),
+ pageDefinition("RequestPayment"),
+ pageDefinition("ShowOrderDetails"),
+]
diff --git a/packages/backend/src/assets/empty.png b/packages/backend/src/assets/empty.png
new file mode 100644
index 0000000..5120d31
--- /dev/null
+++ b/packages/backend/src/assets/empty.png
Binary files differ
diff --git a/packages/backend/src/assets/icons/android-chrome-192x192.png b/packages/backend/src/assets/icons/android-chrome-192x192.png
new file mode 100644
index 0000000..93ebe2e
--- /dev/null
+++ b/packages/backend/src/assets/icons/android-chrome-192x192.png
Binary files differ
diff --git a/packages/backend/src/assets/icons/android-chrome-512x512.png b/packages/backend/src/assets/icons/android-chrome-512x512.png
new file mode 100644
index 0000000..52d1623
--- /dev/null
+++ b/packages/backend/src/assets/icons/android-chrome-512x512.png
Binary files differ
diff --git a/packages/backend/src/assets/icons/apple-touch-icon.png b/packages/backend/src/assets/icons/apple-touch-icon.png
new file mode 100644
index 0000000..254e4bb
--- /dev/null
+++ b/packages/backend/src/assets/icons/apple-touch-icon.png
Binary files differ
diff --git a/packages/backend/src/assets/icons/favicon-16x16.png b/packages/backend/src/assets/icons/favicon-16x16.png
new file mode 100644
index 0000000..e81177d
--- /dev/null
+++ b/packages/backend/src/assets/icons/favicon-16x16.png
Binary files differ
diff --git a/packages/backend/src/assets/icons/favicon-32x32.png b/packages/backend/src/assets/icons/favicon-32x32.png
new file mode 100644
index 0000000..40e9b5b
--- /dev/null
+++ b/packages/backend/src/assets/icons/favicon-32x32.png
Binary files differ
diff --git a/packages/backend/src/assets/icons/languageicon.svg b/packages/backend/src/assets/icons/languageicon.svg
new file mode 100644
index 0000000..22d58da
--- /dev/null
+++ b/packages/backend/src/assets/icons/languageicon.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 2411.2 2794" style="enable-background:new 0 0 2411.2 2794;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{fill-rule:evenodd;clip-rule:evenodd;}
+ .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
+</style>
+<g id="Layer_2">
+</g>
+<g id="Layer_x5F_1_x5F_1">
+ <g>
+ <polygon points="1204.6,359.2 271.8,30 271.8,2060.1 1204.6,1758.3 "/>
+ <polygon class="st0" points="1182.2,358.1 2150.6,29 2150.6,2059 1182.2,1757.3 "/>
+ <polygon class="st0" points="30,2415.4 1182.2,2031.4 1182.2,357.9 30,742 "/>
+ <polygon points="1707.2,2440.7 1870.5,2709.4 1956.6,2459.8 "/>
+ <g>
+ <path d="M421.7,934.8c-6.1-6,8,49.1,27.6,68.9c34.8,35.1,61.9,39.6,76.4,40.2c32,1.3,71.5-8,94.9-17.8
+ c22.7-9.7,62.4-30,77.5-59.6c3.2-6.3,11.9-17,6.4-43.2c-4.2-20.2-17-27.3-32.7-26.2c-15.7,1.1-63.2,13.7-86.1,20.8
+ c-23,7-70.3,21.4-90.9,25.8C474.3,948.2,429,941.7,421.7,934.8z"/>
+ <path d="M1003.1,1593.7c-9.1-3.3-196.9-81.1-223.6-93.9c-21.8-10.5-75.2-33.1-100.4-43.3c70.8-109.2,115.5-191.6,121.5-204.1
+ c11-23,86-169.6,87.7-178.7c1.7-9.1,3.8-42.9,2.2-51c-1.7-8.2-29.1,7.6-66.4,20.2c-37.4,12.6-108.4,58.8-135.8,64.6
+ c-27.5,5.7-115.5,39.1-160.5,54c-45,14.9-130.2,40.9-165.2,50.4c-35.1,9.5-65.7,10.2-85.3,16.2c0,0,2.6,27.5,7.8,35.7
+ c5.2,8.2,23.7,28.4,45.3,34.1c21.6,5.7,57.3,3.4,73.6-0.3c16.3-3.8,44.4-17.5,48.2-23.6c3.8-6.1-2-24.9,4.5-30.6
+ c6.5-5.6,92.2-25.7,124.6-35.4c32.4-10,156.3-52.6,173.1-50.5c-5.3,17.7-105,215.1-137.1,274c-32.1,58.9-218.6,318-258.3,363.6
+ c-30.1,34.7-103.2,123.5-128.5,143.6c6.4,1.8,51.6-2.1,59.9-7.2c51.3-31.6,136.9-138.1,164.4-170.5
+ c81.9-96,153.8-196.8,210.8-283.4h0.1c11.1,4.6,100.9,77.8,124.4,94c23.4,16.2,115.9,67.8,136,76.4c20,8.7,97.1,44.2,100.3,32.2
+ C1029.4,1668,1012.2,1597.1,1003.1,1593.7z"/>
+ </g>
+ <path class="st1" d="M569,2572c18,11,35,20,54,29c38,19,81,39,122,54c56,21,112,38,168,51c31,7,65,13,98,18c3,0,92,11,110,11h90
+ c35-3,68-5,103-10c28-4,59-9,89-16c22-5,45-10,67-17c21-6,45-14,68-22c15-5,31-12,47-18c13-6,29-13,44-19c18-8,39-19,59-29
+ c16-8,34-18,51-28c13-7,43-30,59-30c18,0,30,16,30,30c0,29-39,38-57,51c-19,13-42,23-62,34c-40,21-81,39-120,54
+ c-51,19-107,37-157,49c-19,4-38,9-57,12c-10,2-114,18-143,18h-132c-35-3-72-7-107-12c-31-5-64-11-95-18c-24-5-50-12-73-19
+ c-40-11-79-25-117-40c-69-26-141-60-209-105c-12-8-13-16-13-25c0-15,11-29,29-29C531,2546,563,2569,569,2572z"/>
+ <path class="st1" d="M1151,2009L61,2372V764l1090-363V2009z M1212,354v1680c-1,5-3,10-7,15c-2,3-6,7-9,8c-25,10-1151,388-1166,388
+ c-12,0-23-8-29-21c0-1-1-2-1-4V739c2-5,3-12,7-16c8-11,22-13,31-16c17-6,1126-378,1142-378C1190,329,1212,336,1212,354z"/>
+ <path class="st1" d="M2120,2017l-907-282V380l907-308V2017z M2181,32v2023c-1,23-17,33-32,33c-13,0-107-32-123-37
+ c-126-39-253-78-378-117c-28-9-57-18-84-27c-24-7-50-15-74-23c-107-33-216-66-323-102c-4-1-14-15-14-18V351c2-5,4-11,9-15
+ c8-9,351-123,486-168c36-13,487-168,501-168C2167,0,2181,13,2181,32z"/>
+ <polygon points="2411.2,2440.7 1199.5,2054.5 1204.6,373.2 2411.2,757.2 "/>
+ <g>
+ <path class="st2" d="M1800.3,1124.6L1681.4,1412l218.6,66.3L1800.3,1124.6z M1729,853.2l156.1,47.3l284.4,1025l-160.3-48.7
+ l-57.6-210.4L1620.2,1566l-71.3,171.4l-160.4-48.7L1729,853.2z"/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/packages/backend/src/assets/icons/mstile-150x150.png b/packages/backend/src/assets/icons/mstile-150x150.png
new file mode 100644
index 0000000..9cfb889
--- /dev/null
+++ b/packages/backend/src/assets/icons/mstile-150x150.png
Binary files differ
diff --git a/packages/backend/src/context/backend.ts b/packages/backend/src/context/backend.ts
new file mode 100644
index 0000000..a920d6f
--- /dev/null
+++ b/packages/backend/src/context/backend.ts
@@ -0,0 +1,82 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createContext, h, VNode } from 'preact'
+import { useCallback, useContext, useState } from 'preact/hooks'
+import { useBackendDefaultToken, useBackendURL } from '../hooks';
+
+interface BackendContextType {
+ url: string;
+ token?: string;
+ triedToLog: boolean;
+ resetBackend: () => void;
+ clearAllTokens: () => void;
+ addTokenCleaner: (c: () => void) => void;
+ updateLoginStatus: (url: string, token?: string) => void;
+}
+
+const BackendContext = createContext<BackendContextType>({
+ url: '',
+ token: undefined,
+ triedToLog: false,
+ resetBackend: () => null,
+ clearAllTokens: () => null,
+ addTokenCleaner: () => null,
+ updateLoginStatus: () => null,
+})
+
+function useBackendContextState(defaultUrl?: string): BackendContextType {
+ const [url, triedToLog, changeBackend, resetBackend] = useBackendURL(defaultUrl);
+ const [token, _updateToken] = useBackendDefaultToken();
+ const updateToken = (t?: string) => {
+ _updateToken(t)
+ }
+
+ const tokenCleaner = useCallback(() => { updateToken(undefined) }, [])
+ const [cleaners, setCleaners] = useState([tokenCleaner])
+ const addTokenCleaner = (c: () => void) => setCleaners(cs => [...cs, c])
+ const addTokenCleanerMemo = useCallback((c: () => void) => { addTokenCleaner(c) }, [tokenCleaner])
+
+ const clearAllTokens = () => {
+ cleaners.forEach(c => c())
+ for (let i = 0; i < localStorage.length; i++) {
+ const k = localStorage.key(i)
+ if (k && /^backend-token/.test(k)) localStorage.removeItem(k)
+ }
+ resetBackend()
+ }
+
+ const updateLoginStatus = (url: string, token?: string) => {
+ changeBackend(url);
+ if (token) updateToken(token);
+ };
+
+
+ return { url, token, triedToLog, updateLoginStatus, resetBackend, clearAllTokens, addTokenCleaner: addTokenCleanerMemo }
+}
+
+export const BackendContextProvider = ({ children, defaultUrl }: { children: any, defaultUrl?: string }): VNode => {
+ const value = useBackendContextState(defaultUrl)
+
+ return h(BackendContext.Provider, { value, children });
+}
+
+export const useBackendContext = (): BackendContextType => useContext(BackendContext);
diff --git a/packages/backend/src/context/config.ts b/packages/backend/src/context/config.ts
new file mode 100644
index 0000000..5cd7723
--- /dev/null
+++ b/packages/backend/src/context/config.ts
@@ -0,0 +1,32 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createContext } from 'preact'
+import { useContext } from 'preact/hooks'
+
+interface Type {
+ currency: string;
+ version: string;
+}
+const Context = createContext<Type>(null!)
+
+export const ConfigContextProvider = Context.Provider
+export const useConfigContext = (): Type => useContext(Context);
diff --git a/packages/backend/src/context/fetch.ts b/packages/backend/src/context/fetch.ts
new file mode 100644
index 0000000..52a4f9c
--- /dev/null
+++ b/packages/backend/src/context/fetch.ts
@@ -0,0 +1,40 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { h, createContext, VNode, ComponentChildren } from 'preact'
+import { useContext } from 'preact/hooks'
+import useSWR, { trigger, useSWRInfinite, cache, mutate } from 'swr';
+
+interface Type {
+ useSWR: typeof useSWR,
+ useSWRInfinite: typeof useSWRInfinite,
+}
+
+const Context = createContext<Type>({} as any)
+
+export const useFetchContext = (): Type => useContext(Context);
+export const FetchContextProvider = ({ children }: { children: ComponentChildren }): VNode => {
+ return h(Context.Provider, { value: { useSWR, useSWRInfinite }, children });
+}
+
+export const FetchContextProviderTesting = ({ children, data }: { children: ComponentChildren, data:any }): VNode => {
+ return h(Context.Provider, { value: { useSWR: () => data, useSWRInfinite }, children });
+}
diff --git a/packages/backend/src/context/instance.ts b/packages/backend/src/context/instance.ts
new file mode 100644
index 0000000..fecf364
--- /dev/null
+++ b/packages/backend/src/context/instance.ts
@@ -0,0 +1,35 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createContext } from 'preact'
+import { useContext } from 'preact/hooks'
+
+interface Type {
+ id: string;
+ token?: string;
+ admin?: boolean;
+ changeToken: (t?:string) => void;
+}
+
+const Context = createContext<Type>({} as any)
+
+export const InstanceContextProvider = Context.Provider
+export const useInstanceContext = (): Type => useContext(Context);
diff --git a/packages/backend/src/context/listener.ts b/packages/backend/src/context/listener.ts
new file mode 100644
index 0000000..659db0a
--- /dev/null
+++ b/packages/backend/src/context/listener.ts
@@ -0,0 +1,35 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createContext } from 'preact'
+import { useContext } from 'preact/hooks'
+
+interface Type {
+ id: string;
+ token?: string;
+ admin?: boolean;
+ changeToken: (t?:string) => void;
+}
+
+const Context = createContext<Type>({} as any)
+
+export const ListenerContextProvider = Context.Provider
+export const useListenerContext = (): Type => useContext(Context);
diff --git a/packages/backend/src/context/translation.ts b/packages/backend/src/context/translation.ts
new file mode 100644
index 0000000..952a1e3
--- /dev/null
+++ b/packages/backend/src/context/translation.ts
@@ -0,0 +1,59 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createContext, h, VNode } from 'preact'
+import { useContext, useEffect } from 'preact/hooks'
+import { useLang } from '../hooks'
+import * as jedLib from "jed";
+import { strings } from "../i18n/strings";
+
+interface Type {
+ lang: string;
+ handler: any;
+ changeLanguage: (l: string) => void;
+}
+const initial = {
+ lang: 'en',
+ handler: null,
+ changeLanguage: () => {
+ // do not change anything
+ }
+}
+const Context = createContext<Type>(initial)
+
+interface Props {
+ initial?: string,
+ children: any,
+ forceLang?: string
+}
+
+export const TranslationProvider = ({ initial, children, forceLang }: Props): VNode => {
+ const [lang, changeLanguage] = useLang(initial)
+ useEffect(() => {
+ if (forceLang) {
+ changeLanguage(forceLang)
+ }
+ })
+ const handler = new jedLib.Jed(strings[lang]);
+ return h(Context.Provider, { value: { lang, handler, changeLanguage }, children });
+}
+
+export const useTranslationContext = (): Type => useContext(Context); \ No newline at end of file
diff --git a/packages/backend/src/css/pure-min.css b/packages/backend/src/css/pure-min.css
new file mode 100644
index 0000000..77217b5
--- /dev/null
+++ b/packages/backend/src/css/pure-min.css
@@ -0,0 +1,973 @@
+/*!
+ Pure v2.0.3
+ Copyright 2013 Yahoo!
+ Licensed under the BSD License.
+ https://github.com/pure-cs s/pure/blob/master/LICENSE.md
+*/
+/*!
+ normalize.cs s v | MIT License | git.io/normalize
+ Copyright (c) Nicolas Gallagher and Jonathan Neal
+*/
+/*! normalize.cs s v8.0.1 | MIT License | github.com/necolas/normalize.cs s */
+
+.talerbar {
+ text-align: center;
+}
+
+html {
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+}
+body {
+ margin: 0;
+}
+main {
+ display: block;
+}
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+hr {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+pre {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+a {
+ background-color: transparent;
+}
+abbr[title] {
+ border-bottom: none;
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+b,
+strong {
+ font-weight: bolder;
+}
+code,
+kbd,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -0.25em;
+}
+sup {
+ top: -0.5em;
+}
+img {
+ border-style: none;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ font-size: 100%;
+ line-height: 1.15;
+ margin: 0;
+}
+button,
+input {
+ overflow: visible;
+}
+button,
+select {
+ text-transform: none;
+}
+[type="button"],
+[type="reset"],
+[type="submit"],
+button {
+ -webkit-appearance: button;
+}
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner,
+button::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring,
+button:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+fieldset {
+ padding: 0.35em 0.75em 0.625em;
+}
+legend {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: inherit;
+ display: table;
+ max-width: 100%;
+ padding: 0;
+ white-space: normal;
+}
+progress {
+ vertical-align: baseline;
+}
+textarea {
+ overflow: auto;
+}
+[type="checkbox"],
+[type="radio"] {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 0;
+}
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+[type="search"] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ font: inherit;
+}
+details {
+ display: block;
+}
+summary {
+ display: list-item;
+}
+template {
+ display: none;
+}
+[hidden] {
+ display: none;
+}
+html {
+ font-family: sans-serif;
+}
+.hidden,
+[hidden] {
+ display: none !important;
+}
+.pure-img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+}
+.pure-g {
+ letter-spacing: -0.31em;
+ text-rendering: optimizespeed;
+ font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -ms-flex-line-pack: start;
+ align-content: flex-start;
+}
+@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+ table .pure-g {
+ display: block;
+ }
+}
+.opera-only :-o-prefocus,
+.pure-g {
+ word-spacing: -0.43em;
+}
+.pure-u {
+ display: inline-block;
+ letter-spacing: normal;
+ word-spacing: normal;
+ vertical-align: top;
+ text-rendering: auto;
+}
+.pure-g [class*="pure-u"] {
+ font-family: sans-serif;
+}
+.pure-u-1,
+.pure-u-1-1,
+.pure-u-1-12,
+.pure-u-1-2,
+.pure-u-1-24,
+.pure-u-1-3,
+.pure-u-1-4,
+.pure-u-1-5,
+.pure-u-1-6,
+.pure-u-1-8,
+.pure-u-10-24,
+.pure-u-11-12,
+.pure-u-11-24,
+.pure-u-12-24,
+.pure-u-13-24,
+.pure-u-14-24,
+.pure-u-15-24,
+.pure-u-16-24,
+.pure-u-17-24,
+.pure-u-18-24,
+.pure-u-19-24,
+.pure-u-2-24,
+.pure-u-2-3,
+.pure-u-2-5,
+.pure-u-20-24,
+.pure-u-21-24,
+.pure-u-22-24,
+.pure-u-23-24,
+.pure-u-24-24,
+.pure-u-3-24,
+.pure-u-3-4,
+.pure-u-3-5,
+.pure-u-3-8,
+.pure-u-4-24,
+.pure-u-4-5,
+.pure-u-5-12,
+.pure-u-5-24,
+.pure-u-5-5,
+.pure-u-5-6,
+.pure-u-5-8,
+.pure-u-6-24,
+.pure-u-7-12,
+.pure-u-7-24,
+.pure-u-7-8,
+.pure-u-8-24,
+.pure-u-9-24 {
+ display: inline-block;
+ letter-spacing: normal;
+ word-spacing: normal;
+ vertical-align: top;
+ text-rendering: auto;
+}
+.pure-u-1-24 {
+ width: 4.1667%;
+}
+.pure-u-1-12,
+.pure-u-2-24 {
+ width: 8.3333%;
+}
+.pure-u-1-8,
+.pure-u-3-24 {
+ width: 12.5%;
+}
+.pure-u-1-6,
+.pure-u-4-24 {
+ width: 16.6667%;
+}
+.pure-u-1-5 {
+ width: 20%;
+}
+.pure-u-5-24 {
+ width: 20.8333%;
+}
+.pure-u-1-4,
+.pure-u-6-24 {
+ width: 25%;
+}
+.pure-u-7-24 {
+ width: 29.1667%;
+}
+.pure-u-1-3,
+.pure-u-8-24 {
+ width: 33.3333%;
+}
+.pure-u-3-8,
+.pure-u-9-24 {
+ width: 37.5%;
+}
+.pure-u-2-5 {
+ width: 40%;
+}
+.pure-u-10-24,
+.pure-u-5-12 {
+ width: 41.6667%;
+}
+.pure-u-11-24 {
+ width: 45.8333%;
+}
+.pure-u-1-2,
+.pure-u-12-24 {
+ width: 50%;
+}
+.pure-u-13-24 {
+ width: 54.1667%;
+}
+.pure-u-14-24,
+.pure-u-7-12 {
+ width: 58.3333%;
+}
+.pure-u-3-5 {
+ width: 60%;
+}
+.pure-u-15-24,
+.pure-u-5-8 {
+ width: 62.5%;
+}
+.pure-u-16-24,
+.pure-u-2-3 {
+ width: 66.6667%;
+}
+.pure-u-17-24 {
+ width: 70.8333%;
+}
+.pure-u-18-24,
+.pure-u-3-4 {
+ width: 75%;
+}
+.pure-u-19-24 {
+ width: 79.1667%;
+}
+.pure-u-4-5 {
+ width: 80%;
+}
+.pure-u-20-24,
+.pure-u-5-6 {
+ width: 83.3333%;
+}
+.pure-u-21-24,
+.pure-u-7-8 {
+ width: 87.5%;
+}
+.pure-u-11-12,
+.pure-u-22-24 {
+ width: 91.6667%;
+}
+.pure-u-23-24 {
+ width: 95.8333%;
+}
+.pure-u-1,
+.pure-u-1-1,
+.pure-u-24-24,
+.pure-u-5-5 {
+ width: 100%;
+}
+.pure-button {
+ display: inline-block;
+ line-height: normal;
+ white-space: nowrap;
+ vertical-align: middle;
+ text-align: center;
+ cursor: pointer;
+ -webkit-user-drag: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.pure-button::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+.pure-button-group {
+ letter-spacing: -0.31em;
+ text-rendering: optimizespeed;
+}
+.opera-only :-o-prefocus,
+.pure-button-group {
+ word-spacing: -0.43em;
+}
+.pure-button-group .pure-button {
+ letter-spacing: normal;
+ word-spacing: normal;
+ vertical-align: top;
+ text-rendering: auto;
+}
+.pure-button {
+ font-family: inherit;
+ font-size: 100%;
+ padding: 0.5em 1em;
+ color: rgba(0, 0, 0, 0.8);
+ border: none transparent;
+ background-color: #e6e6e6;
+ text-decoration: none;
+ border-radius: 2px;
+}
+.pure-button-hover,
+.pure-button:focus,
+.pure-button:hover {
+ background-image: -webkit-gradient(
+ linear,
+ left top,
+ left bottom,
+ from(transparent),
+ color-stop(40%, rgba(0, 0, 0, 0.05)),
+ to(rgba(0, 0, 0, 0.1))
+ );
+ background-image: linear-gradient(
+ transparent,
+ rgba(0, 0, 0, 0.05) 40%,
+ rgba(0, 0, 0, 0.1)
+ );
+}
+.pure-button:focus {
+ outline: 0;
+}
+.pure-button-active,
+.pure-button:active {
+ -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset,
+ 0 0 6px rgba(0, 0, 0, 0.2) inset;
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset,
+ 0 0 6px rgba(0, 0, 0, 0.2) inset;
+ border-color: #000;
+}
+.pure-button-disabled,
+.pure-button-disabled:active,
+.pure-button-disabled:focus,
+.pure-button-disabled:hover,
+.pure-button[disabled] {
+ border: none;
+ background-image: none;
+ opacity: 0.4;
+ cursor: not-allowed;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ pointer-events: none;
+}
+.pure-button-hidden {
+ display: none;
+}
+.pure-button-primary,
+.pure-button-selected,
+a.pure-button-primary,
+a.pure-button-selected {
+ background-color: #0078e7;
+ color: #fff;
+}
+.pure-button-group .pure-button {
+ margin: 0;
+ border-radius: 0;
+ border-right: 1px solid rgba(0, 0, 0, 0.2);
+}
+.pure-button-group .pure-button:first-child {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+.pure-button-group .pure-button:last-child {
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ border-right: none;
+}
+.pure-form input[type="color"],
+.pure-form input[type="date"],
+.pure-form input[type="datetime-local"],
+.pure-form input[type="datetime"],
+.pure-form input[type="email"],
+.pure-form input[type="month"],
+.pure-form input[type="number"],
+.pure-form input[type="password"],
+.pure-form input[type="search"],
+.pure-form input[type="tel"],
+.pure-form input[type="text"],
+.pure-form input[type="time"],
+.pure-form input[type="url"],
+.pure-form input[type="week"],
+.pure-form select,
+.pure-form textarea {
+ padding: 0.5em 0.6em;
+ display: inline-block;
+ border: 1px solid #ccc;
+ -webkit-box-shadow: inset 0 1px 3px #ddd;
+ box-shadow: inset 0 1px 3px #ddd;
+ border-radius: 4px;
+ vertical-align: middle;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.pure-form input:not([type]) {
+ padding: 0.5em 0.6em;
+ display: inline-block;
+ border: 1px solid #ccc;
+ -webkit-box-shadow: inset 0 1px 3px #ddd;
+ box-shadow: inset 0 1px 3px #ddd;
+ border-radius: 4px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.pure-form input[type="color"] {
+ padding: 0.2em 0.5em;
+}
+.pure-form input[type="color"]:focus,
+.pure-form input[type="date"]:focus,
+.pure-form input[type="datetime-local"]:focus,
+.pure-form input[type="datetime"]:focus,
+.pure-form input[type="email"]:focus,
+.pure-form input[type="month"]:focus,
+.pure-form input[type="number"]:focus,
+.pure-form input[type="password"]:focus,
+.pure-form input[type="search"]:focus,
+.pure-form input[type="tel"]:focus,
+.pure-form input[type="text"]:focus,
+.pure-form input[type="time"]:focus,
+.pure-form input[type="url"]:focus,
+.pure-form input[type="week"]:focus,
+.pure-form select:focus,
+.pure-form textarea:focus {
+ outline: 0;
+ border-color: #129fea;
+}
+.pure-form input:not([type]):focus {
+ outline: 0;
+ border-color: #129fea;
+}
+.pure-form input[type="checkbox"]:focus,
+.pure-form input[type="file"]:focus,
+.pure-form input[type="radio"]:focus {
+ outline: thin solid #129fea;
+ outline: 1px auto #129fea;
+}
+.pure-form .pure-checkbox,
+.pure-form .pure-radio {
+ margin: 0.5em 0;
+ display: block;
+}
+.pure-form input[type="color"][disabled],
+.pure-form input[type="date"][disabled],
+.pure-form input[type="datetime-local"][disabled],
+.pure-form input[type="datetime"][disabled],
+.pure-form input[type="email"][disabled],
+.pure-form input[type="month"][disabled],
+.pure-form input[type="number"][disabled],
+.pure-form input[type="password"][disabled],
+.pure-form input[type="search"][disabled],
+.pure-form input[type="tel"][disabled],
+.pure-form input[type="text"][disabled],
+.pure-form input[type="time"][disabled],
+.pure-form input[type="url"][disabled],
+.pure-form input[type="week"][disabled],
+.pure-form select[disabled],
+.pure-form textarea[disabled] {
+ cursor: not-allowed;
+ background-color: #eaeded;
+ color: #cad2d3;
+}
+.pure-form input:not([type])[disabled] {
+ cursor: not-allowed;
+ background-color: #eaeded;
+ color: #cad2d3;
+}
+.pure-form input[readonly],
+.pure-form select[readonly],
+.pure-form textarea[readonly] {
+ background-color: #eee;
+ color: #777;
+ border-color: #ccc;
+}
+.pure-form input:focus:invalid,
+.pure-form select:focus:invalid,
+.pure-form textarea:focus:invalid {
+ color: #b94a48;
+ border-color: #e9322d;
+}
+.pure-form input[type="checkbox"]:focus:invalid:focus,
+.pure-form input[type="file"]:focus:invalid:focus,
+.pure-form input[type="radio"]:focus:invalid:focus {
+ outline-color: #e9322d;
+}
+.pure-form select {
+ height: 2.25em;
+ border: 1px solid #ccc;
+ background-color: #fff;
+}
+.pure-form select[multiple] {
+ height: auto;
+}
+.pure-form label {
+ margin: 0.5em 0 0.2em;
+}
+.pure-form fieldset {
+ margin: 0;
+ padding: 0.35em 0 0.75em;
+ border: 0;
+}
+.pure-form legend {
+ display: block;
+ width: 100%;
+ padding: 0.3em 0;
+ margin-bottom: 0.3em;
+ color: #333;
+ border-bottom: 1px solid #e5e5e5;
+}
+.pure-form-stacked input[type="color"],
+.pure-form-stacked input[type="date"],
+.pure-form-stacked input[type="datetime-local"],
+.pure-form-stacked input[type="datetime"],
+.pure-form-stacked input[type="email"],
+.pure-form-stacked input[type="file"],
+.pure-form-stacked input[type="month"],
+.pure-form-stacked input[type="number"],
+.pure-form-stacked input[type="password"],
+.pure-form-stacked input[type="search"],
+.pure-form-stacked input[type="tel"],
+.pure-form-stacked input[type="text"],
+.pure-form-stacked input[type="time"],
+.pure-form-stacked input[type="url"],
+.pure-form-stacked input[type="week"],
+.pure-form-stacked label,
+.pure-form-stacked select,
+.pure-form-stacked textarea {
+ display: block;
+ margin: 0.25em 0;
+}
+.pure-form-stacked input:not([type]) {
+ display: block;
+ margin: 0.25em 0;
+}
+.pure-form-aligned input,
+.pure-form-aligned select,
+.pure-form-aligned textarea,
+.pure-form-message-inline {
+ display: inline-block;
+ vertical-align: middle;
+}
+.pure-form-aligned textarea {
+ vertical-align: top;
+}
+.pure-form-aligned .pure-control-group {
+ margin-bottom: 0.5em;
+}
+.pure-form-aligned .pure-control-group label {
+ text-align: right;
+ display: inline-block;
+ vertical-align: middle;
+ width: 10em;
+ margin: 0 1em 0 0;
+}
+.pure-form-aligned .pure-controls {
+ margin: 1.5em 0 0 11em;
+}
+.pure-form .pure-input-rounded,
+.pure-form input.pure-input-rounded {
+ border-radius: 2em;
+ padding: 0.5em 1em;
+}
+.pure-form .pure-group fieldset {
+ margin-bottom: 10px;
+}
+.pure-form .pure-group input,
+.pure-form .pure-group textarea {
+ display: block;
+ padding: 10px;
+ margin: 0 0 -1px;
+ border-radius: 0;
+ position: relative;
+ top: -1px;
+}
+.pure-form .pure-group input:focus,
+.pure-form .pure-group textarea:focus {
+ z-index: 3;
+}
+.pure-form .pure-group input:first-child,
+.pure-form .pure-group textarea:first-child {
+ top: 1px;
+ border-radius: 4px 4px 0 0;
+ margin: 0;
+}
+.pure-form .pure-group input:first-child:last-child,
+.pure-form .pure-group textarea:first-child:last-child {
+ top: 1px;
+ border-radius: 4px;
+ margin: 0;
+}
+.pure-form .pure-group input:last-child,
+.pure-form .pure-group textarea:last-child {
+ top: -2px;
+ border-radius: 0 0 4px 4px;
+ margin: 0;
+}
+.pure-form .pure-group button {
+ margin: 0.35em 0;
+}
+.pure-form .pure-input-1 {
+ width: 100%;
+}
+.pure-form .pure-input-3-4 {
+ width: 75%;
+}
+.pure-form .pure-input-2-3 {
+ width: 66%;
+}
+.pure-form .pure-input-1-2 {
+ width: 50%;
+}
+.pure-form .pure-input-1-3 {
+ width: 33%;
+}
+.pure-form .pure-input-1-4 {
+ width: 25%;
+}
+.pure-form-message-inline {
+ display: inline-block;
+ padding-left: 0.3em;
+ color: #666;
+ vertical-align: middle;
+ font-size: 0.875em;
+}
+.pure-form-message {
+ display: block;
+ color: #666;
+ font-size: 0.875em;
+}
+@media only screen and (max-width: 480px) {
+ .pure-form button[type="submit"] {
+ margin: 0.7em 0 0;
+ }
+ .pure-form input:not([type]),
+ .pure-form input[type="color"],
+ .pure-form input[type="date"],
+ .pure-form input[type="datetime-local"],
+ .pure-form input[type="datetime"],
+ .pure-form input[type="email"],
+ .pure-form input[type="month"],
+ .pure-form input[type="number"],
+ .pure-form input[type="password"],
+ .pure-form input[type="search"],
+ .pure-form input[type="tel"],
+ .pure-form input[type="text"],
+ .pure-form input[type="time"],
+ .pure-form input[type="url"],
+ .pure-form input[type="week"],
+ .pure-form label {
+ margin-bottom: 0.3em;
+ display: block;
+ }
+ .pure-group input:not([type]),
+ .pure-group input[type="color"],
+ .pure-group input[type="date"],
+ .pure-group input[type="datetime-local"],
+ .pure-group input[type="datetime"],
+ .pure-group input[type="email"],
+ .pure-group input[type="month"],
+ .pure-group input[type="number"],
+ .pure-group input[type="password"],
+ .pure-group input[type="search"],
+ .pure-group input[type="tel"],
+ .pure-group input[type="text"],
+ .pure-group input[type="time"],
+ .pure-group input[type="url"],
+ .pure-group input[type="week"] {
+ margin-bottom: 0;
+ }
+ .pure-form-aligned .pure-control-group label {
+ margin-bottom: 0.3em;
+ text-align: left;
+ display: block;
+ width: 100%;
+ }
+ .pure-form-aligned .pure-controls {
+ margin: 1.5em 0 0 0;
+ }
+ .pure-form-message,
+ .pure-form-message-inline {
+ display: block;
+ font-size: 0.75em;
+ padding: 0.2em 0 0.8em;
+ }
+}
+.pure-menu {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.pure-menu-fixed {
+ position: fixed;
+ left: 0;
+ top: 0;
+ z-index: 3;
+}
+.pure-menu-item,
+.pure-menu-list {
+ position: relative;
+}
+.pure-menu-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.pure-menu-item {
+ padding: 0;
+ margin: 0;
+ height: 100%;
+}
+.pure-menu-heading,
+.pure-menu-link {
+ display: block;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.pure-menu-horizontal {
+ width: 100%;
+ white-space: nowrap;
+}
+.pure-menu-horizontal .pure-menu-list {
+ display: inline-block;
+}
+.pure-menu-horizontal .pure-menu-heading,
+.pure-menu-horizontal .pure-menu-item,
+.pure-menu-horizontal .pure-menu-separator {
+ display: inline-block;
+ vertical-align: middle;
+}
+.pure-menu-item .pure-menu-item {
+ display: block;
+}
+.pure-menu-children {
+ display: none;
+ position: absolute;
+ left: 100%;
+ top: 0;
+ margin: 0;
+ padding: 0;
+ z-index: 3;
+}
+.pure-menu-horizontal .pure-menu-children {
+ left: 0;
+ top: auto;
+ width: inherit;
+}
+.pure-menu-active > .pure-menu-children,
+.pure-menu-allow-hover:hover > .pure-menu-children {
+ display: block;
+ position: absolute;
+}
+.pure-menu-has-children > .pure-menu-link:after {
+ padding-left: 0.5em;
+ content: "\25B8";
+ font-size: small;
+}
+.pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after {
+ content: "\25BE";
+}
+.pure-menu-scrollable {
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+.pure-menu-scrollable .pure-menu-list {
+ display: block;
+}
+.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list {
+ display: inline-block;
+}
+.pure-menu-horizontal.pure-menu-scrollable {
+ white-space: nowrap;
+ overflow-y: hidden;
+ overflow-x: auto;
+ padding: 0.5em 0;
+}
+.pure-menu-horizontal .pure-menu-children .pure-menu-separator,
+.pure-menu-separator {
+ background-color: #ccc;
+ height: 1px;
+ margin: 0.3em 0;
+}
+.pure-menu-horizontal .pure-menu-separator {
+ width: 1px;
+ height: 1.3em;
+ margin: 0 0.3em;
+}
+.pure-menu-horizontal .pure-menu-children .pure-menu-separator {
+ display: block;
+ width: auto;
+}
+.pure-menu-heading {
+ text-transform: uppercase;
+ color: #565d64;
+}
+.pure-menu-link {
+ color: #777;
+}
+.pure-menu-children {
+ background-color: #fff;
+}
+.pure-menu-disabled,
+.pure-menu-heading,
+.pure-menu-link {
+ padding: 0.5em 1em;
+}
+.pure-menu-disabled {
+ opacity: 0.5;
+}
+.pure-menu-disabled .pure-menu-link:hover {
+ background-color: transparent;
+}
+.pure-menu-active > .pure-menu-link,
+.pure-menu-link:focus,
+.pure-menu-link:hover {
+ background-color: #eee;
+}
+.pure-menu-selected > .pure-menu-link,
+.pure-menu-selected > .pure-menu-link:visited {
+ color: #000;
+}
+.pure-table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ empty-cells: show;
+ border: 1px solid #cbcbcb;
+}
+.pure-table caption {
+ color: #000;
+ font: italic 85%/1 arial, sans-serif;
+ padding: 1em 0;
+ text-align: center;
+}
+.pure-table td,
+.pure-table th {
+ border-left: 1px solid #cbcbcb;
+ border-width: 0 0 0 1px;
+ font-size: inherit;
+ margin: 0;
+ overflow: visible;
+ padding: 0.5em 1em;
+}
+.pure-table thead {
+ background-color: #e0e0e0;
+ color: #000;
+ text-align: left;
+ vertical-align: bottom;
+}
+.pure-table td {
+ background-color: transparent;
+}
+.pure-table-odd td {
+ background-color: #f2f2f2;
+}
+.pure-table-striped tr:nth-child(2n-1) td {
+ background-color: #f2f2f2;
+}
+.pure-table-bordered td {
+ border-bottom: 1px solid #cbcbcb;
+}
+.pure-table-bordered tbody > tr:last-child > td {
+ border-bottom-width: 0;
+}
+.pure-table-horizontal td,
+.pure-table-horizontal th {
+ border-width: 0 0 1px 0;
+ border-bottom: 1px solid #cbcbcb;
+}
+.pure-table-horizontal tbody > tr:last-child > td {
+ border-bottom-width: 0;
+}
diff --git a/packages/backend/src/css/style.css b/packages/backend/src/css/style.css
new file mode 100644
index 0000000..e03b632
--- /dev/null
+++ b/packages/backend/src/css/style.css
@@ -0,0 +1,62 @@
+/*!
+ Pure v2.0.3
+ Copyright 2013 Yahoo!
+ Licensed under the BSD License.
+ https://github.com/pure-ss/pure/blob/master/LICENSE.md
+*/
+/*!
+ normalize.cs v | MIT License | git.io/normalize
+ Copyright (c) Nicolas Gallagher and Jonathan Neal
+*/
+/*! normalize.ss v8.0.1 | MIT License | github.com/necolas/normalize.cs */
+
+.talerbar {
+ text-align: center;
+}
+.tt {
+ font-family: "Lucida Console", Monaco, monospace;
+}
+.content {
+ overflow-x: auto;
+ padding-left: 15%;
+ padding-right: 15%;
+}
+.qr {
+ margin: auto;
+ text-align: center;
+}
+.qrtext {
+ width: max-content;
+ margin: auto;
+ transition: font-size 0.2s;
+ font-family: "Lucida Console", Monaco, monospace;
+ font-size: 0.5em;
+}
+.qrtext:hover {
+ font-size: 1em;
+}
+.talerbar {
+ margin: 0;
+ bottom: 0;
+ background-color: #033;
+ color: white;
+ width: 100%;
+ padding: 1em;
+ overflow: auto;
+}
+body {
+ overflow-y: scroll;
+}
+@media (min-width: 500px) {
+ .content {
+ padding-bottom: 2em;
+ margin-right: 1em;
+ overflow-y: auto;
+ }
+}
+#main a:link,
+#main a:visited,
+#main a:hover,
+#main a:active {
+ color: black;
+} \ No newline at end of file
diff --git a/packages/backend/src/custom.d.ts b/packages/backend/src/custom.d.ts
new file mode 100644
index 0000000..d270500
--- /dev/null
+++ b/packages/backend/src/custom.d.ts
@@ -0,0 +1,40 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+declare module '*.po' {
+ const content: any;
+ export default content;
+}
+declare module 'jed' {
+ const x: any;
+ export = x;
+}
+declare module "*.jpeg" {
+ const content: any;
+ export default content;
+}
+declare module "*.png" {
+ const content: any;
+ export default content;
+}
+declare module '*.svg' {
+ const content: any;
+ export default content;
+}
+
+declare module '*.scss' {
+ const content: Record<string, string>;
+ export default content;
+}
diff --git a/packages/backend/src/declaration.d.ts b/packages/backend/src/declaration.d.ts
new file mode 100644
index 0000000..1722a3d
--- /dev/null
+++ b/packages/backend/src/declaration.d.ts
@@ -0,0 +1,1384 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+
+type HashCode = string;
+type EddsaPublicKey = string;
+type EddsaSignature = string;
+type WireTransferIdentifierRawP = string;
+type RelativeTime = Duration;
+type ImageDataUrl = string;
+
+export interface WithId {
+ id: string
+}
+
+interface Timestamp {
+ // Milliseconds since epoch, or the special
+ // value "forever" to represent an event that will
+ // never happen.
+ t_ms: number | "never";
+}
+interface Duration {
+ // Duration in milliseconds or "forever"
+ // to represent an infinite duration.
+ d_ms: number | "forever";
+}
+
+interface WithId {
+ id: string;
+}
+
+type Amount = string;
+type UUID = string;
+type Integer = number;
+
+export namespace ExchangeBackend {
+ interface WireResponse {
+
+ // Master public key of the exchange, must match the key returned in /keys.
+ master_public_key: EddsaPublicKey;
+
+ // Array of wire accounts operated by the exchange for
+ // incoming wire transfers.
+ accounts: WireAccount[];
+
+ // Object mapping names of wire methods (i.e. "sepa" or "x-taler-bank")
+ // to wire fees.
+ fees: { method: AggregateTransferFee };
+ }
+ interface WireAccount {
+ // payto:// URI identifying the account and wire method
+ payto_uri: string;
+
+ // Signature using the exchange's offline key
+ // with purpose TALER_SIGNATURE_MASTER_WIRE_DETAILS.
+ master_sig: EddsaSignature;
+ }
+ interface AggregateTransferFee {
+ // Per transfer wire transfer fee.
+ wire_fee: Amount;
+
+ // Per transfer closing fee.
+ closing_fee: Amount;
+
+ // What date (inclusive) does this fee go into effect?
+ // The different fees must cover the full time period in which
+ // any of the denomination keys are valid without overlap.
+ start_date: Timestamp;
+
+ // What date (exclusive) does this fee stop going into effect?
+ // The different fees must cover the full time period in which
+ // any of the denomination keys are valid without overlap.
+ end_date: Timestamp;
+
+ // Signature of TALER_MasterWireFeePS with
+ // purpose TALER_SIGNATURE_MASTER_WIRE_FEES.
+ sig: EddsaSignature;
+ }
+
+}
+export namespace MerchantBackend {
+ interface ErrorDetail {
+
+ // Numeric error code unique to the condition.
+ // The other arguments are specific to the error value reported here.
+ code: number;
+
+ // Human-readable description of the error, i.e. "missing parameter", "commitment violation", ...
+ // Should give a human-readable hint about the error's nature. Optional, may change without notice!
+ hint?: string;
+
+ // Optional detail about the specific input value that failed. May change without notice!
+ detail?: string;
+
+ // Name of the parameter that was bogus (if applicable).
+ parameter?: string;
+
+ // Path to the argument that was bogus (if applicable).
+ path?: string;
+
+ // Offset of the argument that was bogus (if applicable).
+ offset?: string;
+
+ // Index of the argument that was bogus (if applicable).
+ index?: string;
+
+ // Name of the object that was bogus (if applicable).
+ object?: string;
+
+ // Name of the currency than was problematic (if applicable).
+ currency?: string;
+
+ // Expected type (if applicable).
+ type_expected?: string;
+
+ // Type that was provided instead (if applicable).
+ type_actual?: string;
+ }
+
+
+ // Delivery location, loosely modeled as a subset of
+ // ISO20022's PostalAddress25.
+ interface Tax {
+ // the name of the tax
+ name: string;
+
+ // amount paid in tax
+ tax: Amount;
+ }
+
+ interface Auditor {
+ // official name
+ name: string;
+
+ // Auditor's public key
+ auditor_pub: EddsaPublicKey;
+
+ // Base URL of the auditor
+ url: string;
+ }
+ interface Exchange {
+ // the exchange's base URL
+ url: string;
+
+ // master public key of the exchange
+ master_pub: EddsaPublicKey;
+ }
+
+ interface Product {
+ // merchant-internal identifier for the product.
+ product_id?: string;
+
+ // Human-readable product description.
+ description: string;
+
+ // Map from IETF BCP 47 language tags to localized descriptions
+ description_i18n?: { [lang_tag: string]: string };
+
+ // The number of units of the product to deliver to the customer.
+ quantity: Integer;
+
+ // The unit in which the product is measured (liters, kilograms, packages, etc.)
+ unit: string;
+
+ // The price of the product; this is the total price for quantity times unit of this product.
+ price: Amount;
+
+ // An optional base64-encoded product image
+ image: ImageDataUrl;
+
+ // a list of taxes paid by the merchant for this product. Can be empty.
+ taxes: Tax[];
+
+ // time indicating when this product should be delivered
+ delivery_date?: Timestamp;
+ }
+ interface Merchant {
+ // label for a location with the business address of the merchant
+ address: Location;
+
+ // the merchant's legal name of business
+ name: string;
+
+ // label for a location that denotes the jurisdiction for disputes.
+ // Some of the typical fields for a location (such as a street address) may be absent.
+ jurisdiction: Location;
+ }
+
+ interface VersionResponse {
+ // libtool-style representation of the Merchant protocol version, see
+ // https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
+ // The format is "current:revision:age".
+ version: string;
+
+ // Name of the protocol.
+ name: "taler-merchant";
+
+ // Currency supported by this backend.
+ currency: string;
+
+ }
+ interface Location {
+ // Nation with its own government.
+ country?: string;
+
+ // Identifies a subdivision of a country such as state, region, county.
+ country_subdivision?: string;
+
+ // Identifies a subdivision within a country sub-division.
+ district?: string;
+
+ // Name of a built-up area, with defined boundaries, and a local government.
+ town?: string;
+
+ // Specific location name within the town.
+ town_location?: string;
+
+ // Identifier consisting of a group of letters and/or numbers that
+ // is added to a postal address to assist the sorting of mail.
+ post_code?: string;
+
+ // Name of a street or thoroughfare.
+ street?: string;
+
+ // Name of the building or house.
+ building_name?: string;
+
+ // Number that identifies the position of a building on a street.
+ building_number?: string;
+
+ // Free-form address lines, should not exceed 7 elements.
+ address_lines?: string[];
+ }
+ namespace Instances {
+
+ //POST /private/instances/$INSTANCE/auth
+ interface InstanceAuthConfigurationMessage {
+ // Type of authentication.
+ // "external": The mechant backend does not do
+ // any authentication checks. Instead an API
+ // gateway must do the authentication.
+ // "token": The merchant checks an auth token.
+ // See "token" for details.
+ method: "external" | "token";
+
+ // For method "external", this field is mandatory.
+ // The token MUST begin with the string "secret-token:".
+ // After the auth token has been set (with method "token"),
+ // the value must be provided in a "Authorization: Bearer $token"
+ // header.
+ token?: string;
+
+ }
+ //POST /private/instances
+ interface InstanceConfigurationMessage {
+ // The URI where the wallet will send coins. A merchant may have
+ // multiple accounts, thus this is an array. Note that by
+ // removing URIs from this list the respective account is set to
+ // inactive and thus unavailable for new contracts, but preserved
+ // in the database as existing offers and contracts may still refer
+ // to it.
+ payto_uris: string[];
+
+ // Name of the merchant instance to create (will become $INSTANCE).
+ id: string;
+
+ // Merchant name corresponding to this instance.
+ name: string;
+
+ // "Authentication" header required to authorize management access the instance.
+ // Optional, if not given authentication will be disabled for
+ // this instance (hopefully authentication checks are still
+ // done by some reverse proxy).
+ auth: InstanceAuthConfigurationMessage;
+
+ // The merchant's physical address (to be put into contracts).
+ address: Location;
+
+ // The jurisdiction under which the merchant conducts its business
+ // (to be put into contracts).
+ jurisdiction: Location;
+
+ // Maximum wire fee this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_wire_fee: Amount;
+
+ // Default factor for wire fee amortization calculations.
+ // Can be overridden by the frontend on a per-order basis.
+ default_wire_fee_amortization: Integer;
+
+ // Maximum deposit fee (sum over all coins) this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_deposit_fee: Amount;
+
+ // If the frontend does NOT specify an execution date, how long should
+ // we tell the exchange to wait to aggregate transactions before
+ // executing the wire transfer? This delay is added to the current
+ // time when we generate the advisory execution time for the exchange.
+ default_wire_transfer_delay: RelativeTime;
+
+ // If the frontend does NOT specify a payment deadline, how long should
+ // offers we make be valid by default?
+ default_pay_delay: RelativeTime;
+
+ }
+
+ // PATCH /private/instances/$INSTANCE
+ interface InstanceReconfigurationMessage {
+ // The URI where the wallet will send coins. A merchant may have
+ // multiple accounts, thus this is an array. Note that by
+ // removing URIs from this list
+ payto_uris: string[];
+
+ // Merchant name corresponding to this instance.
+ name: string;
+
+ // The merchant's physical address (to be put into contracts).
+ address: Location;
+
+ // The jurisdiction under which the merchant conducts its business
+ // (to be put into contracts).
+ jurisdiction: Location;
+
+ // Maximum wire fee this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_wire_fee: Amount;
+
+ // Default factor for wire fee amortization calculations.
+ // Can be overridden by the frontend on a per-order basis.
+ default_wire_fee_amortization: Integer;
+
+ // Maximum deposit fee (sum over all coins) this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_deposit_fee: Amount;
+
+ // If the frontend does NOT specify an execution date, how long should
+ // we tell the exchange to wait to aggregate transactions before
+ // executing the wire transfer? This delay is added to the current
+ // time when we generate the advisory execution time for the exchange.
+ default_wire_transfer_delay: RelativeTime;
+
+ // If the frontend does NOT specify a payment deadline, how long should
+ // offers we make be valid by default?
+ default_pay_delay: RelativeTime;
+
+ }
+
+ // GET /private/instances
+ interface InstancesResponse {
+ // List of instances that are present in the backend (see Instance)
+ instances: Instance[];
+ }
+
+ interface Instance {
+ // Merchant name corresponding to this instance.
+ name: string;
+
+ deleted?: boolean;
+
+ // Merchant instance this response is about ($INSTANCE)
+ id: string;
+
+ // Public key of the merchant/instance, in Crockford Base32 encoding.
+ merchant_pub: EddsaPublicKey;
+
+ // List of the payment targets supported by this instance. Clients can
+ // specify the desired payment target in /order requests. Note that
+ // front-ends do not have to support wallets selecting payment targets.
+ payment_targets: string[];
+
+ }
+
+ //GET /private/instances/$INSTANCE
+ interface QueryInstancesResponse {
+ // The URI where the wallet will send coins. A merchant may have
+ // multiple accounts, thus this is an array.
+ accounts: MerchantAccount[];
+
+ // Merchant name corresponding to this instance.
+ name: string;
+
+ // Public key of the merchant/instance, in Crockford Base32 encoding.
+ merchant_pub: EddsaPublicKey;
+
+ // The merchant's physical address (to be put into contracts).
+ address: Location;
+
+ // The jurisdiction under which the merchant conducts its business
+ // (to be put into contracts).
+ jurisdiction: Location;
+
+ // Maximum wire fee this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_wire_fee: Amount;
+
+ // Default factor for wire fee amortization calculations.
+ // Can be overridden by the frontend on a per-order basis.
+ default_wire_fee_amortization: Integer;
+
+ // Maximum deposit fee (sum over all coins) this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_deposit_fee: Amount;
+
+ // If the frontend does NOT specify an execution date, how long should
+ // we tell the exchange to wait to aggregate transactions before
+ // executing the wire transfer? This delay is added to the current
+ // time when we generate the advisory execution time for the exchange.
+ default_wire_transfer_delay: RelativeTime;
+
+ // If the frontend does NOT specify a payment deadline, how long should
+ // offers we make be valid by default?
+ default_pay_delay: RelativeTime;
+
+ // Authentication configuration.
+ // Does not contain the token when token auth is configured.
+ auth: {
+ method: "external" | "token";
+ };
+ }
+
+ interface MerchantAccount {
+
+ // payto:// URI of the account.
+ payto_uri: string;
+
+ // Hash over the wire details (including over the salt)
+ h_wire: HashCode;
+
+ // salt used to compute h_wire
+ salt: HashCode;
+
+ // true if this account is active,
+ // false if it is historic.
+ active: boolean;
+ }
+
+ // DELETE /private/instances/$INSTANCE
+
+
+ }
+
+ namespace Products {
+ // POST /private/products
+ interface ProductAddDetail {
+
+ // product ID to use.
+ product_id: string;
+
+ // Human-readable product description.
+ description: string;
+
+ // Map from IETF BCP 47 language tags to localized descriptions
+ description_i18n: { [lang_tag: string]: string };
+
+ // unit in which the product is measured (liters, kilograms, packages, etc.)
+ unit: string;
+
+ // The price for one unit of the product. Zero is used
+ // to imply that this product is not sold separately, or
+ // that the price is not fixed, and must be supplied by the
+ // front-end. If non-zero, this price MUST include applicable
+ // taxes.
+ price: Amount;
+
+ // An optional base64-encoded product image
+ image: ImageDataUrl;
+
+ // a list of taxes paid by the merchant for one unit of this product
+ taxes: Tax[];
+
+ // Number of units of the product in stock in sum in total,
+ // including all existing sales ever. Given in product-specific
+ // units.
+ // A value of -1 indicates "infinite" (i.e. for "electronic" books).
+ total_stock: Integer;
+
+ // Identifies where the product is in stock.
+ address: Location;
+
+ // Identifies when we expect the next restocking to happen.
+ next_restock?: Timestamp;
+
+ }
+ // PATCH /private/products/$PRODUCT_ID
+ interface ProductPatchDetail {
+
+ // Human-readable product description.
+ description: string;
+
+ // Map from IETF BCP 47 language tags to localized descriptions
+ description_i18n: { [lang_tag: string]: string };
+
+ // unit in which the product is measured (liters, kilograms, packages, etc.)
+ unit: string;
+
+ // The price for one unit of the product. Zero is used
+ // to imply that this product is not sold separately, or
+ // that the price is not fixed, and must be supplied by the
+ // front-end. If non-zero, this price MUST include applicable
+ // taxes.
+ price: Amount;
+
+ // An optional base64-encoded product image
+ image: ImageDataUrl;
+
+ // a list of taxes paid by the merchant for one unit of this product
+ taxes: Tax[];
+
+ // Number of units of the product in stock in sum in total,
+ // including all existing sales ever. Given in product-specific
+ // units.
+ // A value of -1 indicates "infinite" (i.e. for "electronic" books).
+ total_stock: Integer;
+
+ // Number of units of the product that were lost (spoiled, stolen, etc.)
+ total_lost: Integer;
+
+ // Identifies where the product is in stock.
+ address: Location;
+
+ // Identifies when we expect the next restocking to happen.
+ next_restock?: Timestamp;
+
+ }
+
+ // GET /private/products
+ interface InventorySummaryResponse {
+ // List of products that are present in the inventory
+ products: InventoryEntry[];
+ }
+ interface InventoryEntry {
+ // Product identifier, as found in the product.
+ product_id: string;
+
+ }
+
+ // GET /private/products/$PRODUCT_ID
+ interface ProductDetail {
+
+ // Human-readable product description.
+ description: string;
+
+ // Map from IETF BCP 47 language tags to localized descriptions
+ description_i18n: { [lang_tag: string]: string };
+
+ // unit in which the product is measured (liters, kilograms, packages, etc.)
+ unit: string;
+
+ // The price for one unit of the product. Zero is used
+ // to imply that this product is not sold separately, or
+ // that the price is not fixed, and must be supplied by the
+ // front-end. If non-zero, this price MUST include applicable
+ // taxes.
+ price: Amount;
+
+ // An optional base64-encoded product image
+ image: ImageDataUrl;
+
+ // a list of taxes paid by the merchant for one unit of this product
+ taxes: Tax[];
+
+ // Number of units of the product in stock in sum in total,
+ // including all existing sales ever. Given in product-specific
+ // units.
+ // A value of -1 indicates "infinite" (i.e. for "electronic" books).
+ total_stock: Integer;
+
+ // Number of units of the product that have already been sold.
+ total_sold: Integer;
+
+ // Number of units of the product that were lost (spoiled, stolen, etc.)
+ total_lost: Integer;
+
+ // Identifies where the product is in stock.
+ address: Location;
+
+ // Identifies when we expect the next restocking to happen.
+ next_restock?: Timestamp;
+
+ }
+
+ // POST /private/products/$PRODUCT_ID/lock
+ interface LockRequest {
+
+ // UUID that identifies the frontend performing the lock
+ // It is suggested that clients use a timeflake for this,
+ // see https://github.com/anthonynsimon/timeflake
+ lock_uuid: UUID;
+
+ // How long does the frontend intend to hold the lock
+ duration: RelativeTime;
+
+ // How many units should be locked?
+ quantity: Integer;
+
+ }
+
+ // DELETE /private/products/$PRODUCT_ID
+
+ }
+
+ namespace Orders {
+
+ type MerchantOrderStatusResponse = CheckPaymentPaidResponse |
+ CheckPaymentClaimedResponse |
+ CheckPaymentUnpaidResponse;
+ interface CheckPaymentPaidResponse {
+ // The customer paid for this contract.
+ order_status: "paid";
+
+ // Was the payment refunded (even partially)?
+ refunded: boolean;
+
+ // True if there are any approved refunds that the wallet has
+ // not yet obtained.
+ refund_pending: boolean;
+
+ // Did the exchange wire us the funds?
+ wired: boolean;
+
+ // Total amount the exchange deposited into our bank account
+ // for this contract, excluding fees.
+ deposit_total: Amount;
+
+ // Numeric error code indicating errors the exchange
+ // encountered tracking the wire transfer for this purchase (before
+ // we even got to specific coin issues).
+ // 0 if there were no issues.
+ exchange_ec: number;
+
+ // HTTP status code returned by the exchange when we asked for
+ // information to track the wire transfer for this purchase.
+ // 0 if there were no issues.
+ exchange_hc: number;
+
+ // Total amount that was refunded, 0 if refunded is false.
+ refund_amount: Amount;
+
+ // Contract terms.
+ contract_terms: ContractTerms;
+
+ // The wire transfer status from the exchange for this order if
+ // available, otherwise empty array.
+ wire_details: TransactionWireTransfer[];
+
+ // Reports about trouble obtaining wire transfer details,
+ // empty array if no trouble were encountered.
+ wire_reports: TransactionWireReport[];
+
+ // The refund details for this order. One entry per
+ // refunded coin; empty array if there are no refunds.
+ refund_details: RefundDetails[];
+
+ // Status URL, can be used as a redirect target for the browser
+ // to show the order QR code / trigger the wallet.
+ order_status_url: string;
+ }
+ interface CheckPaymentClaimedResponse {
+ // A wallet claimed the order, but did not yet pay for the contract.
+ order_status: "claimed";
+
+ // Contract terms.
+ contract_terms: ContractTerms;
+
+ }
+ interface CheckPaymentUnpaidResponse {
+ // The order was neither claimed nor paid.
+ order_status: "unpaid";
+
+ // when was the order created
+ creation_time: Timestamp;
+
+ // Order summary text.
+ summary: string;
+
+ // Total amount of the order (to be paid by the customer).
+ total_amount: Amount;
+
+ // URI that the wallet must process to complete the payment.
+ taler_pay_uri: string;
+
+ // Alternative order ID which was paid for already in the same session.
+ // Only given if the same product was purchased before in the same session.
+ already_paid_order_id?: string;
+
+ // Fulfillment URL of an already paid order. Only given if under this
+ // session an already paid order with a fulfillment URL exists.
+ already_paid_fulfillment_url?: string;
+
+ // Status URL, can be used as a redirect target for the browser
+ // to show the order QR code / trigger the wallet.
+ order_status_url: string;
+
+ // We do we NOT return the contract terms here because they may not
+ // exist in case the wallet did not yet claim them.
+ }
+ interface RefundDetails {
+ // Reason given for the refund.
+ reason: string;
+
+ // When was the refund approved.
+ timestamp: Timestamp;
+
+ // Total amount that was refunded (minus a refund fee).
+ amount: Amount;
+ }
+ interface TransactionWireTransfer {
+ // Responsible exchange.
+ exchange_url: string;
+
+ // 32-byte wire transfer identifier.
+ wtid: Base32;
+
+ // Execution time of the wire transfer.
+ execution_time: Timestamp;
+
+ // Total amount that has been wire transferred
+ // to the merchant.
+ amount: Amount;
+
+ // Was this transfer confirmed by the merchant via the
+ // POST /transfers API, or is it merely claimed by the exchange?
+ confirmed: boolean;
+ }
+ interface TransactionWireReport {
+ // Numerical error code.
+ code: number;
+
+ // Human-readable error description.
+ hint: string;
+
+ // Numerical error code from the exchange.
+ exchange_ec: number;
+
+ // HTTP status code received from the exchange.
+ exchange_hc: number;
+
+ // Public key of the coin for which we got the exchange error.
+ coin_pub: CoinPublicKey;
+ }
+
+ interface OrderHistory {
+ // timestamp-sorted array of all orders matching the query.
+ // The order of the sorting depends on the sign of delta.
+ orders: OrderHistoryEntry[];
+ }
+ interface OrderHistoryEntry {
+
+ // order ID of the transaction related to this entry.
+ order_id: string;
+
+ // row ID of the order in the database
+ row_id: number;
+
+ // when the order was created
+ timestamp: Timestamp;
+
+ // the amount of money the order is for
+ amount: Amount;
+
+ // the summary of the order
+ summary: string;
+
+ // whether some part of the order is refundable,
+ // that is the refund deadline has not yet expired
+ // and the total amount refunded so far is below
+ // the value of the original transaction.
+ refundable: boolean;
+
+ // whether the order has been paid or not
+ paid: boolean;
+ }
+
+ interface PostOrderRequest {
+ // The order must at least contain the minimal
+ // order detail, but can override all
+ order: Order;
+
+ // if set, the backend will then set the refund deadline to the current
+ // time plus the specified delay. If it's not set, refunds will not be
+ // possible.
+ refund_delay?: RelativeTime;
+
+ // specifies the payment target preferred by the client. Can be used
+ // to select among the various (active) wire methods supported by the instance.
+ payment_target?: string;
+
+ // specifies that some products are to be included in the
+ // order from the inventory. For these inventory management
+ // is performed (so the products must be in stock) and
+ // details are completed from the product data of the backend.
+ inventory_products?: MinimalInventoryProduct[];
+
+ // Specifies a lock identifier that was used to
+ // lock a product in the inventory. Only useful if
+ // manage_inventory is set. Used in case a frontend
+ // reserved quantities of the individual products while
+ // the shopping card was being built. Multiple UUIDs can
+ // be used in case different UUIDs were used for different
+ // products (i.e. in case the user started with multiple
+ // shopping sessions that were combined during checkout).
+ lock_uuids?: UUID[];
+
+ // Should a token for claiming the order be generated?
+ // False can make sense if the ORDER_ID is sufficiently
+ // high entropy to prevent adversarial claims (like it is
+ // if the backend auto-generates one). Default is 'true'.
+ create_token?: boolean;
+
+ }
+ type Order = MinimalOrderDetail | ContractTerms;
+
+ interface MinimalOrderDetail {
+ // Amount to be paid by the customer
+ amount: Amount;
+
+ // Short summary of the order
+ summary: string;
+
+ // URL that will show that the order was successful after
+ // it has been paid for. Optional. When POSTing to the
+ // merchant, the placeholder "${ORDER_ID}" will be
+ // replaced with the actual order ID (useful if the
+ // order ID is generated server-side and needs to be
+ // in the URL).
+ fulfillment_url?: string;
+ }
+
+ interface MinimalInventoryProduct {
+ // Which product is requested (here mandatory!)
+ product_id: string;
+
+ // How many units of the product are requested
+ quantity: Integer;
+ }
+ interface PostOrderResponse {
+ // Order ID of the response that was just created
+ order_id: string;
+
+ // Token that authorizes the wallet to claim the order.
+ // Provided only if "create_token" was set to 'true'
+ // in the request.
+ token?: ClaimToken;
+ }
+ interface OutOfStockResponse {
+
+ // Product ID of an out-of-stock item
+ product_id: string;
+
+ // Requested quantity
+ requested_quantity: Integer;
+
+ // Available quantity (must be below requested_quanitity)
+ available_quantity: Integer;
+
+ // When do we expect the product to be again in stock?
+ // Optional, not given if unknown.
+ restock_expected?: Timestamp;
+ }
+
+ interface ForgetRequest {
+
+ // Array of valid JSON paths to forgettable fields in the order's
+ // contract terms.
+ fields: string[];
+ }
+ interface RefundRequest {
+ // Amount to be refunded
+ refund: Amount;
+
+ // Human-readable refund justification
+ reason: string;
+ }
+ interface MerchantRefundResponse {
+
+ // URL (handled by the backend) that the wallet should access to
+ // trigger refund processing.
+ // taler://refund/...
+ taler_refund_uri: string;
+
+ // Contract hash that a client may need to authenticate an
+ // HTTP request to obtain the above URI in a wallet-friendly way.
+ h_contract: HashCode;
+ }
+
+ }
+
+ namespace Tips {
+
+ // GET /private/reserves
+ interface TippingReserveStatus {
+ // Array of all known reserves (possibly empty!)
+ reserves: ReserveStatusEntry[];
+ }
+ interface ReserveStatusEntry {
+ // Public key of the reserve
+ reserve_pub: EddsaPublicKey;
+
+ // Timestamp when it was established
+ creation_time: Timestamp;
+
+ // Timestamp when it expires
+ expiration_time: Timestamp;
+
+ // Initial amount as per reserve creation call
+ merchant_initial_amount: Amount;
+
+ // Initial amount as per exchange, 0 if exchange did
+ // not confirm reserve creation yet.
+ exchange_initial_amount: Amount;
+
+ // Amount picked up so far.
+ pickup_amount: Amount;
+
+ // Amount approved for tips that exceeds the pickup_amount.
+ committed_amount: Amount;
+
+ // Is this reserve active (false if it was deleted but not purged)
+ active: boolean;
+ }
+
+ interface ReserveCreateRequest {
+ // Amount that the merchant promises to put into the reserve
+ initial_balance: Amount;
+
+ // Exchange the merchant intends to use for tipping
+ exchange_url: string;
+
+ // Desired wire method, for example "iban" or "x-taler-bank"
+ wire_method: string;
+ }
+ interface ReserveCreateConfirmation {
+ // Public key identifying the reserve
+ reserve_pub: EddsaPublicKey;
+
+ // Wire account of the exchange where to transfer the funds
+ payto_uri: string;
+ }
+ interface TipCreateRequest {
+ // Amount that the customer should be tipped
+ amount: Amount;
+
+ // Justification for giving the tip
+ justification: string;
+
+ // URL that the user should be directed to after tipping,
+ // will be included in the tip_token.
+ next_url: string;
+ }
+ interface TipCreateConfirmation {
+ // Unique tip identifier for the tip that was created.
+ tip_id: HashCode;
+
+ // taler://tip URI for the tip
+ taler_tip_uri: string;
+
+ // URL that will directly trigger processing
+ // the tip when the browser is redirected to it
+ tip_status_url: string;
+
+ // when does the tip expire
+ tip_expiration: Timestamp;
+ }
+
+ interface ReserveDetail {
+ // Timestamp when it was established.
+ creation_time: Timestamp;
+
+ // Timestamp when it expires.
+ expiration_time: Timestamp;
+
+ // Initial amount as per reserve creation call.
+ merchant_initial_amount: Amount;
+
+ // Initial amount as per exchange, 0 if exchange did
+ // not confirm reserve creation yet.
+ exchange_initial_amount: Amount;
+
+ // Amount picked up so far.
+ pickup_amount: Amount;
+
+ // Amount approved for tips that exceeds the pickup_amount.
+ committed_amount: Amount;
+
+ // Array of all tips created by this reserves (possibly empty!).
+ // Only present if asked for explicitly.
+ tips?: TipStatusEntry[];
+
+ // Is this reserve active (false if it was deleted but not purged)?
+ active: boolean;
+
+ // URI to use to fill the reserve, can be NULL
+ // if the reserve is inactive or was already filled
+ payto_uri: string;
+
+ // URL of the exchange hosting the reserve,
+ // NULL if the reserve is inactive
+ exchange_url: string;
+
+ }
+
+ interface TipStatusEntry {
+
+ // Unique identifier for the tip.
+ tip_id: HashCode;
+
+ // Total amount of the tip that can be withdrawn.
+ total_amount: Amount;
+
+ // Human-readable reason for why the tip was granted.
+ reason: string;
+ }
+
+ interface TipDetails {
+ // Amount that we authorized for this tip.
+ total_authorized: Amount;
+
+ // Amount that was picked up by the user already.
+ total_picked_up: Amount;
+
+ // Human-readable reason given when authorizing the tip.
+ reason: string;
+
+ // Timestamp indicating when the tip is set to expire (may be in the past).
+ expiration: Timestamp;
+
+ // Reserve public key from which the tip is funded.
+ reserve_pub: EddsaPublicKey;
+
+ // Array showing the pickup operations of the wallet (possibly empty!).
+ // Only present if asked for explicitly.
+ pickups?: PickupDetail[];
+ }
+ interface PickupDetail {
+ // Unique identifier for the pickup operation.
+ pickup_id: HashCode;
+
+ // Number of planchets involved.
+ num_planchets: Integer;
+
+ // Total amount requested for this pickup_id.
+ requested_amount: Amount;
+ }
+
+ }
+
+ namespace Transfers {
+
+ interface TransferList {
+ // list of all the transfers that fit the filter that we know
+ transfers: TransferDetails[];
+ }
+ interface TransferDetails {
+ // how much was wired to the merchant (minus fees)
+ credit_amount: Amount;
+
+ // raw wire transfer identifier identifying the wire transfer (a base32-encoded value)
+ wtid: string;
+
+ // target account that received the wire transfer
+ payto_uri: string;
+
+ // base URL of the exchange that made the wire transfer
+ exchange_url: string;
+
+ // Serial number identifying the transfer in the merchant backend.
+ // Used for filgering via offset.
+ transfer_serial_id: number;
+
+ // Time of the execution of the wire transfer by the exchange, according to the exchange
+ // Only provided if we did get an answer from the exchange.
+ execution_time?: Timestamp;
+
+ // True if we checked the exchange's answer and are happy with it.
+ // False if we have an answer and are unhappy, missing if we
+ // do not have an answer from the exchange.
+ verified?: boolean;
+
+ // True if the merchant uses the POST /transfers API to confirm
+ // that this wire transfer took place (and it is thus not
+ // something merely claimed by the exchange).
+ confirmed?: boolean;
+ }
+
+ interface TransferInformation {
+ // how much was wired to the merchant (minus fees)
+ credit_amount: Amount;
+
+ // raw wire transfer identifier identifying the wire transfer (a base32-encoded value)
+ wtid: WireTransferIdentifierRawP;
+
+ // target account that received the wire transfer
+ payto_uri: string;
+
+ // base URL of the exchange that made the wire transfer
+ exchange_url: string;
+ }
+ interface MerchantTrackTransferResponse {
+ // Total amount transferred
+ total: Amount;
+
+ // Applicable wire fee that was charged
+ wire_fee: Amount;
+
+ // Time of the execution of the wire transfer by the exchange, according to the exchange
+ execution_time: Timestamp;
+
+ // details about the deposits
+ deposits_sums: MerchantTrackTransferDetail[];
+ }
+ interface MerchantTrackTransferDetail {
+ // Business activity associated with the wire transferred amount
+ // deposit_value.
+ order_id: string;
+
+ // The total amount the exchange paid back for order_id.
+ deposit_value: Amount;
+
+ // applicable fees for the deposit
+ deposit_fee: Amount;
+ }
+
+ type ExchangeConflictDetails = WireFeeConflictDetails | TrackTransferConflictDetails
+ // Note: this is not the full 'proof' of missbehavior, as
+ // the bogus message from the exchange with a signature
+ // over the 'different' wire fee is missing.
+ //
+ // This information is NOT provided by the current implementation,
+ // because this would be quite expensive to generate and is
+ // hardly needed _here_. Once we add automated reports for
+ // the Taler auditor, we need to generate this data anyway
+ // and should probably return it here as well.
+ interface WireFeeConflictDetails {
+ // Numerical error code:
+ code: "TALER_EC_MERCHANT_PRIVATE_POST_TRANSFERS_BAD_WIRE_FEE";
+
+ // Text describing the issue for humans.
+ hint: string;
+
+
+ // Wire fee (wrongly) charged by the exchange, breaking the
+ // contract affirmed by the exchange_sig.
+ wire_fee: Amount;
+
+ // Timestamp of the wire transfer
+ execution_time: Timestamp;
+
+ // The expected wire fee (as signed by the exchange)
+ expected_wire_fee: Amount;
+
+ // Expected closing fee (needed to verify signature)
+ expected_closing_fee: Amount;
+
+ // Start date of the expected fee structure
+ start_date: Timestamp;
+
+ // End date of the expected fee structure
+ end_date: Timestamp;
+
+ // Signature of the exchange affirming the expected fee structure
+ master_sig: EddsaSignature;
+
+ // Master public key of the exchange
+ master_pub: EddsaPublicKey;
+ }
+ interface TrackTransferConflictDetails {
+ // Numerical error code
+ code: "TALER_EC_MERCHANT_PRIVATE_POST_TRANSFERS_CONFLICTING_REPORTS";
+
+ // Text describing the issue for humans.
+ hint: string;
+
+ // Offset in the exchange_transfer where the
+ // exchange's response fails to match the exchange_deposit_proof.
+ conflict_offset: number;
+
+ // The response from the exchange which tells us when the
+ // coin was returned to us, except that it does not match
+ // the expected value of the coin.
+ //
+ // This field is NOT provided by the current implementation,
+ // because this would be quite expensive to generate and is
+ // hardly needed _here_. Once we add automated reports for
+ // the Taler auditor, we need to generate this data anyway
+ // and should probably return it here as well.
+ // exchange_transfer?: TrackTransferResponse;
+
+ // Public key of the exchange used to sign the response to
+ // our deposit request.
+ deposit_exchange_pub: EddsaPublicKey;
+
+ // Signature of the exchange signing the (conflicting) response.
+ // Signs over a struct TALER_DepositConfirmationPS.
+ deposit_exchange_sig: EddsaSignature;
+
+ // Hash of the merchant's bank account the wire transfer went to
+ h_wire: HashCode;
+
+ // Hash of the contract terms with the conflicting deposit.
+ h_contract_terms: HashCode;
+
+ // At what time the exchange received the deposit. Needed
+ // to verify the \exchange_sig\.
+ deposit_timestamp: Timestamp;
+
+ // At what time the refund possibility expired (needed to verify exchange_sig).
+ refund_deadline: Timestamp;
+
+ // Public key of the coin for which we have conflicting information.
+ coin_pub: EddsaPublicKey;
+
+ // Amount the exchange counted the coin for in the transfer.
+ amount_with_fee: Amount;
+
+ // Expected value of the coin.
+ coin_value: Amount;
+
+ // Expected deposit fee of the coin.
+ coin_fee: Amount;
+
+ // Expected deposit fee of the coin.
+ deposit_fee: Amount;
+
+ }
+
+ // interface TrackTransferProof {
+ // // signature from the exchange made with purpose
+ // // TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT
+ // exchange_sig: EddsaSignature;
+
+ // // public EdDSA key of the exchange that was used to generate the signature.
+ // // Should match one of the exchange's signing keys from /keys. Again given
+ // // explicitly as the client might otherwise be confused by clock skew as to
+ // // which signing key was used.
+ // exchange_pub: EddsaSignature;
+
+ // // hash of the wire details (identical for all deposits)
+ // // Needed to check the exchange_sig
+ // h_wire: HashCode;
+ // }
+
+ }
+
+
+ interface ContractTerms {
+ // Human-readable description of the whole purchase
+ summary: string;
+
+ // Map from IETF BCP 47 language tags to localized summaries
+ summary_i18n?: { [lang_tag: string]: string };
+
+ // Unique, free-form identifier for the proposal.
+ // Must be unique within a merchant instance.
+ // For merchants that do not store proposals in their DB
+ // before the customer paid for them, the order_id can be used
+ // by the frontend to restore a proposal from the information
+ // encoded in it (such as a short product identifier and timestamp).
+ order_id: string;
+
+ // Total price for the transaction.
+ // The exchange will subtract deposit fees from that amount
+ // before transferring it to the merchant.
+ amount: Amount;
+
+ // The URL for this purchase. Every time is is visited, the merchant
+ // will send back to the customer the same proposal. Clearly, this URL
+ // can be bookmarked and shared by users.
+ fulfillment_url?: string;
+
+ // Maximum total deposit fee accepted by the merchant for this contract
+ max_fee: Amount;
+
+ // Maximum wire fee accepted by the merchant (customer share to be
+ // divided by the 'wire_fee_amortization' factor, and further reduced
+ // if deposit fees are below 'max_fee'). Default if missing is zero.
+ max_wire_fee: Amount;
+
+ // Over how many customer transactions does the merchant expect to
+ // amortize wire fees on average? If the exchange's wire fee is
+ // above 'max_wire_fee', the difference is divided by this number
+ // to compute the expected customer's contribution to the wire fee.
+ // The customer's contribution may further be reduced by the difference
+ // between the 'max_fee' and the sum of the actual deposit fees.
+ // Optional, default value if missing is 1. 0 and negative values are
+ // invalid and also interpreted as 1.
+ wire_fee_amortization: number;
+
+ // List of products that are part of the purchase (see Product).
+ products: Product[];
+
+ // Time when this contract was generated
+ timestamp: Timestamp;
+
+ // After this deadline has passed, no refunds will be accepted.
+ refund_deadline: Timestamp;
+
+ // After this deadline, the merchant won't accept payments for the contact
+ pay_deadline: Timestamp;
+
+ // Transfer deadline for the exchange. Must be in the
+ // deposit permissions of coins used to pay for this order.
+ wire_transfer_deadline: Timestamp;
+
+ // Merchant's public key used to sign this proposal; this information
+ // is typically added by the backend Note that this can be an ephemeral key.
+ merchant_pub: EddsaPublicKey;
+
+ // Base URL of the (public!) merchant backend API.
+ // Must be an absolute URL that ends with a slash.
+ merchant_base_url: string;
+
+ // More info about the merchant, see below
+ merchant: Merchant;
+
+ // The hash of the merchant instance's wire details.
+ h_wire: HashCode;
+
+ // Wire transfer method identifier for the wire method associated with h_wire.
+ // The wallet may only select exchanges via a matching auditor if the
+ // exchange also supports this wire method.
+ // The wire transfer fees must be added based on this wire transfer method.
+ wire_method: string;
+
+ // Any exchanges audited by these auditors are accepted by the merchant.
+ auditors: Auditor[];
+
+ // Exchanges that the merchant accepts even if it does not accept any auditors that audit them.
+ exchanges: Exchange[];
+
+ // Delivery location for (all!) products.
+ delivery_location?: Location;
+
+ // Time indicating when the order should be delivered.
+ // May be overwritten by individual products.
+ delivery_date?: Timestamp;
+
+ // Nonce generated by the wallet and echoed by the merchant
+ // in this field when the proposal is generated.
+ nonce: string;
+
+ // Specifies for how long the wallet should try to get an
+ // automatic refund for the purchase. If this field is
+ // present, the wallet should wait for a few seconds after
+ // the purchase and then automatically attempt to obtain
+ // a refund. The wallet should probe until "delay"
+ // after the payment was successful (i.e. via long polling
+ // or via explicit requests with exponential back-off).
+ //
+ // In particular, if the wallet is offline
+ // at that time, it MUST repeat the request until it gets
+ // one response from the merchant after the delay has expired.
+ // If the refund is granted, the wallet MUST automatically
+ // recover the payment. This is used in case a merchant
+ // knows that it might be unable to satisfy the contract and
+ // desires for the wallet to attempt to get the refund without any
+ // customer interaction. Note that it is NOT an error if the
+ // merchant does not grant a refund.
+ auto_refund?: RelativeTime;
+
+ // Extra data that is only interpreted by the merchant frontend.
+ // Useful when the merchant needs to store extra information on a
+ // contract without storing it separately in their database.
+ extra?: any;
+ }
+
+}
diff --git a/packages/backend/src/hooks/async.ts b/packages/backend/src/hooks/async.ts
new file mode 100644
index 0000000..fd55004
--- /dev/null
+++ b/packages/backend/src/hooks/async.ts
@@ -0,0 +1,76 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+import { useState } from "preact/hooks";
+import { cancelPendingRequest } from "./backend";
+
+export interface Options {
+ slowTolerance: number,
+}
+
+export interface AsyncOperationApi<T> {
+ request: (...a: any) => void,
+ cancel: () => void,
+ data: T | undefined,
+ isSlow: boolean,
+ isLoading: boolean,
+ error: string | undefined
+}
+
+export function useAsync<T>(fn?: (...args: any) => Promise<T>, { slowTolerance: tooLong }: Options = { slowTolerance: 1000 }): AsyncOperationApi<T> {
+ const [data, setData] = useState<T | undefined>(undefined);
+ const [isLoading, setLoading] = useState<boolean>(false);
+ const [error, setError] = useState<any>(undefined);
+ const [isSlow, setSlow] = useState(false)
+
+ const request = async (...args: any) => {
+ if (!fn) return;
+ setLoading(true);
+
+ const handler = setTimeout(() => {
+ setSlow(true)
+ }, tooLong)
+
+ try {
+ const result = await fn(...args);
+ setData(result);
+ } catch (error) {
+ setError(error);
+ }
+ setLoading(false);
+ setSlow(false)
+ clearTimeout(handler)
+ };
+
+ function cancel() {
+ cancelPendingRequest()
+ setLoading(false);
+ setSlow(false)
+ }
+
+ return {
+ request,
+ cancel,
+ data,
+ isSlow,
+ isLoading,
+ error
+ };
+}
diff --git a/packages/backend/src/hooks/backend.ts b/packages/backend/src/hooks/backend.ts
new file mode 100644
index 0000000..96b8f71
--- /dev/null
+++ b/packages/backend/src/hooks/backend.ts
@@ -0,0 +1,262 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { mutate, cache } from 'swr';
+import axios, { AxiosError, AxiosResponse } from 'axios'
+import { MerchantBackend } from '../declaration';
+import { useBackendContext } from '../context/backend';
+import { useEffect, useState } from 'preact/hooks';
+import { DEFAULT_REQUEST_TIMEOUT } from '../utils/constants';
+
+export function mutateAll(re: RegExp, value?: unknown): Array<Promise<any>> {
+ return cache.keys().filter(key => {
+ return re.test(key)
+ }).map(key => {
+ return mutate(key, value)
+ })
+}
+
+export type HttpResponse<T> = HttpResponseOk<T> | HttpResponseLoading<T> | HttpError;
+export type HttpResponsePaginated<T> = HttpResponseOkPaginated<T> | HttpResponseLoading<T> | HttpError;
+
+export interface RequestInfo {
+ url: string;
+ hasToken: boolean;
+ params: unknown;
+ data: unknown;
+}
+
+interface HttpResponseLoading<T> {
+ ok?: false;
+ loading: true;
+ clientError?: false;
+ serverError?: false;
+
+ data?: T;
+}
+export interface HttpResponseOk<T> {
+ ok: true;
+ loading?: false;
+ clientError?: false;
+ serverError?: false;
+
+ data: T;
+ info?: RequestInfo;
+}
+
+export type HttpResponseOkPaginated<T> = HttpResponseOk<T> & WithPagination
+
+export interface WithPagination {
+ loadMore: () => void;
+ loadMorePrev: () => void;
+ isReachingEnd?: boolean;
+ isReachingStart?: boolean;
+}
+
+export type HttpError = HttpResponseClientError | HttpResponseServerError | HttpResponseUnexpectedError;
+export interface SwrError {
+ info: unknown,
+ status: number,
+ message: string,
+}
+export interface HttpResponseServerError {
+ ok?: false;
+ loading?: false;
+ clientError?: false;
+ serverError: true;
+
+ error?: MerchantBackend.ErrorDetail;
+ status: number;
+ message: string;
+ info?: RequestInfo;
+}
+interface HttpResponseClientError {
+ ok?: false;
+ loading?: false;
+ clientError: true;
+ serverError?: false;
+
+ info?: RequestInfo;
+ isUnauthorized: boolean;
+ isNotfound: boolean;
+ status: number;
+ error?: MerchantBackend.ErrorDetail;
+ message: string;
+
+}
+
+interface HttpResponseUnexpectedError {
+ ok?: false;
+ loading?: false;
+ clientError?: false;
+ serverError?: false;
+
+ info?: RequestInfo;
+ status?: number;
+ error: unknown;
+ message: string;
+}
+
+type Methods = 'get' | 'post' | 'patch' | 'delete' | 'put';
+
+interface RequestOptions {
+ method?: Methods;
+ token?: string;
+ data?: unknown;
+ params?: unknown;
+}
+
+function buildRequestOk<T>(res: AxiosResponse<T>, url: string, hasToken: boolean): HttpResponseOk<T> {
+ return {
+ ok: true, data: res.data, info: {
+ params: res.config.params,
+ data: res.config.data,
+ url,
+ hasToken,
+ }
+ }
+}
+
+// function buildResponse<T>(data?: T, error?: MerchantBackend.ErrorDetail, isValidating?: boolean): HttpResponse<T> {
+// if (isValidating) return {loading: true}
+// if (error) return buildRequestFailed()
+// }
+
+function buildRequestFailed(ex: AxiosError<MerchantBackend.ErrorDetail>, url: string, hasToken: boolean): HttpResponseClientError | HttpResponseServerError | HttpResponseUnexpectedError {
+ const status = ex.response?.status
+
+ const info: RequestInfo = {
+ data: ex.request?.data,
+ params: ex.request?.params,
+ url,
+ hasToken,
+ };
+
+ if (status && status >= 400 && status < 500) {
+ const error: HttpResponseClientError = {
+ clientError: true,
+ isNotfound: status === 404,
+ isUnauthorized: status === 401,
+ status,
+ info,
+ message: ex.response?.data?.hint || ex.message,
+ error: ex.response?.data
+ }
+ return error
+ }
+ if (status && status >= 500 && status < 600) {
+ const error: HttpResponseServerError = {
+ serverError: true,
+ status,
+ info,
+ message: `${ex.response?.data?.hint} (code ${ex.response?.data?.code})` || ex.message,
+ error: ex.response?.data
+ }
+ return error;
+ }
+
+ const error: HttpResponseUnexpectedError = {
+ info,
+ status,
+ error: ex,
+ message: ex.message
+ }
+
+ return error
+}
+
+
+const CancelToken = axios.CancelToken;
+let source = CancelToken.source();
+
+export function cancelPendingRequest() {
+ source.cancel('canceled by the user')
+ source = CancelToken.source()
+}
+
+let removeAxiosCancelToken = false
+/**
+ * Jest mocking seems to break when using the cancelToken property.
+ * Using this workaround when testing while finding the correct solution
+ */
+export function setAxiosRequestAsTestingEnvironment() {
+ removeAxiosCancelToken = true
+}
+
+export async function request<T>(url: string, options: RequestOptions = {}): Promise<HttpResponseOk<T>> {
+ const headers = options.token ? { Authorization: `Bearer ${options.token}` } : undefined
+
+ try {
+ const res = await axios({
+ url,
+ responseType: 'json',
+ headers,
+ cancelToken: !removeAxiosCancelToken? source.token : undefined,
+ method: options.method || 'get',
+ data: options.data,
+ params: options.params,
+ timeout: DEFAULT_REQUEST_TIMEOUT * 1000,
+ })
+ return buildRequestOk<T>(res, url, !!options.token)
+ } catch (e) {
+ const error = buildRequestFailed(e, url, !!options.token)
+ throw error
+ }
+
+}
+
+export function fetcher<T>(url: string, token: string, backend: string): Promise<HttpResponseOk<T>> {
+ return request<T>(`${backend}${url}`, { token })
+}
+
+export function useBackendInstancesTestForAdmin(): HttpResponse<MerchantBackend.Instances.InstancesResponse> {
+ const { url, token } = useBackendContext()
+
+ type Type = MerchantBackend.Instances.InstancesResponse;
+
+ const [result, setResult] = useState<HttpResponse<Type>>({ loading: true })
+
+ useEffect(() => {
+ request<Type>(`${url}/management/instances`, { token })
+ .then(data => setResult(data))
+ .catch(error => setResult(error))
+ }, [url, token])
+
+
+ return result
+}
+
+
+export function useBackendConfig(): HttpResponse<MerchantBackend.VersionResponse> {
+ const { url, token } = useBackendContext()
+
+ type Type = MerchantBackend.VersionResponse;
+
+ const [result, setResult] = useState<HttpResponse<Type>>({ loading: true })
+
+ useEffect(() => {
+ request<Type>(`${url}/config`, { token })
+ .then(data => setResult(data))
+ .catch(error => setResult(error))
+ }, [url, token])
+
+ return result
+}
diff --git a/packages/backend/src/hooks/index.ts b/packages/backend/src/hooks/index.ts
new file mode 100644
index 0000000..19d672a
--- /dev/null
+++ b/packages/backend/src/hooks/index.ts
@@ -0,0 +1,110 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { StateUpdater, useCallback, useState } from "preact/hooks";
+import { ValueOrFunction } from '../utils/types';
+
+
+const calculateRootPath = () => {
+ const rootPath = typeof window !== undefined ? window.location.origin + window.location.pathname : '/'
+ return rootPath
+}
+
+export function useBackendURL(url?: string): [string, boolean, StateUpdater<string>, () => void] {
+ const [value, setter] = useNotNullLocalStorage('backend-url', url || calculateRootPath())
+ const [triedToLog, setTriedToLog] = useLocalStorage('tried-login')
+
+ const checkedSetter = (v: ValueOrFunction<string>) => {
+ setTriedToLog('yes')
+ return setter(p => (v instanceof Function ? v(p) : v).replace(/\/$/, ''))
+ }
+
+ const resetBackend = () => {
+ setTriedToLog(undefined)
+ }
+ return [value, !!triedToLog, checkedSetter, resetBackend]
+}
+
+export function useBackendDefaultToken(): [string | undefined, StateUpdater<string | undefined>] {
+ return useLocalStorage('backend-token')
+}
+
+export function useBackendInstanceToken(id: string): [string | undefined, StateUpdater<string | undefined>] {
+ const [token, setToken] = useLocalStorage(`backend-token-${id}`)
+ const [defaultToken, defaultSetToken] = useBackendDefaultToken()
+
+ // instance named 'default' use the default token
+ if (id === 'default') {
+ return [defaultToken, defaultSetToken]
+ }
+
+ return [token, setToken]
+}
+
+export function useLang(initial?: string): [string, StateUpdater<string>] {
+ const browserLang = typeof window !== "undefined" ? navigator.language || (navigator as any).userLanguage : undefined;
+ const defaultLang = (browserLang || initial || 'en').substring(0, 2)
+ return useNotNullLocalStorage('lang-preference', defaultLang)
+}
+
+export function useLocalStorage(key: string, initialValue?: string): [string | undefined, StateUpdater<string | undefined>] {
+ const [storedValue, setStoredValue] = useState<string | undefined>((): string | undefined => {
+ return typeof window !== "undefined" ? window.localStorage.getItem(key) || initialValue : initialValue;
+ });
+
+ const setValue = (value?: string | ((val?: string) => string | undefined)) => {
+ setStoredValue(p => {
+ const toStore = value instanceof Function ? value(p) : value
+ if (typeof window !== "undefined") {
+ if (!toStore) {
+ window.localStorage.removeItem(key)
+ } else {
+ window.localStorage.setItem(key, toStore);
+ }
+ }
+ return toStore
+ })
+ };
+
+ return [storedValue, setValue];
+}
+
+export function useNotNullLocalStorage(key: string, initialValue: string): [string, StateUpdater<string>] {
+ const [storedValue, setStoredValue] = useState<string>((): string => {
+ return typeof window !== "undefined" ? window.localStorage.getItem(key) || initialValue : initialValue;
+ });
+
+ const setValue = (value: string | ((val: string) => string)) => {
+ const valueToStore = value instanceof Function ? value(storedValue) : value;
+ setStoredValue(valueToStore);
+ if (typeof window !== "undefined") {
+ if (!valueToStore) {
+ window.localStorage.removeItem(key)
+ } else {
+ window.localStorage.setItem(key, valueToStore);
+ }
+ }
+ };
+
+ return [storedValue, setValue];
+}
+
+
diff --git a/packages/backend/src/hooks/instance.ts b/packages/backend/src/hooks/instance.ts
new file mode 100644
index 0000000..14ab8de
--- /dev/null
+++ b/packages/backend/src/hooks/instance.ts
@@ -0,0 +1,187 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 { MerchantBackend } from '../declaration';
+import { useBackendContext } from '../context/backend';
+import { fetcher, HttpError, HttpResponse, HttpResponseOk, request, SwrError } from './backend';
+import useSWR, { mutate } from 'swr';
+import { useInstanceContext } from '../context/instance';
+
+
+interface InstanceAPI {
+ updateInstance: (data: MerchantBackend.Instances.InstanceReconfigurationMessage) => Promise<void>;
+ deleteInstance: () => Promise<void>;
+ clearToken: () => Promise<void>;
+ setNewToken: (token: string) => Promise<void>;
+}
+
+export function useManagementAPI(instanceId: string) : InstanceAPI {
+ const { url, token } = useBackendContext()
+
+ const updateInstance = async (instance: MerchantBackend.Instances.InstanceReconfigurationMessage): Promise<void> => {
+ await request(`${url}/management/instances/${instanceId}`, {
+ method: 'patch',
+ token,
+ data: instance
+ })
+
+ mutate([`/private/`, token, url], null)
+ };
+
+ const deleteInstance = async (): Promise<void> => {
+ await request(`${url}/management/instances/${instanceId}`, {
+ method: 'delete',
+ token,
+ })
+
+ mutate([`/private/`, token, url], null)
+ }
+
+ const clearToken = async (): Promise<void> => {
+ await request(`${url}/management/instances/${instanceId}/auth`, {
+ method: 'post',
+ token,
+ data: { method: 'external' }
+ })
+
+ mutate([`/private/`, token, url], null)
+ }
+
+ const setNewToken = async (newToken: string): Promise<void> => {
+ await request(`${url}/management/instances/${instanceId}/auth`, {
+ method: 'post',
+ token,
+ data: { method: 'token', token: newToken }
+ })
+
+ mutate([`/private/`, token, url], null)
+ }
+
+ return { updateInstance, deleteInstance, setNewToken, clearToken }
+}
+
+export function useInstanceAPI(): InstanceAPI {
+ const { url: baseUrl, token: adminToken } = useBackendContext()
+ const { token: instanceToken, id, admin } = useInstanceContext()
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: adminToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ };
+
+ const updateInstance = async (instance: MerchantBackend.Instances.InstanceReconfigurationMessage): Promise<void> => {
+ await request(`${url}/private/`, {
+ method: 'patch',
+ token,
+ data: instance
+ })
+
+ if (adminToken) mutate(['/private/instances', adminToken, baseUrl], null)
+ mutate([`/private/`, token, url], null)
+ };
+
+ const deleteInstance = async (): Promise<void> => {
+ await request(`${url}/private/`, {
+ method: 'delete',
+ token: adminToken,
+ })
+
+ if (adminToken) mutate(['/private/instances', adminToken, baseUrl], null)
+ mutate([`/private/`, token, url], null)
+ }
+
+ const clearToken = async (): Promise<void> => {
+ await request(`${url}/private/auth`, {
+ method: 'post',
+ token,
+ data: { method: 'external' }
+ })
+
+ mutate([`/private/`, token, url], null)
+ }
+
+ const setNewToken = async (newToken: string): Promise<void> => {
+ await request(`${url}/private/auth`, {
+ method: 'post',
+ token,
+ data: { method: 'token', token: newToken }
+ })
+
+ mutate([`/private/`, token, url], null)
+ }
+
+ return { updateInstance, deleteInstance, setNewToken, clearToken }
+}
+
+
+export function useInstanceDetails(): HttpResponse<MerchantBackend.Instances.QueryInstancesResponse> {
+ const { url: baseUrl, token: baseToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: baseToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ }
+
+ const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Instances.QueryInstancesResponse>, HttpError>([`/private/`, token, url], fetcher, {
+ refreshInterval:0,
+ refreshWhenHidden: false,
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ refreshWhenOffline: false,
+ errorRetryCount: 0,
+ errorRetryInterval: 1,
+ shouldRetryOnError: false,
+ })
+
+ if (isValidating) return {loading:true, data: data?.data}
+ if (data) return data
+ if (error) return error
+ return {loading: true}
+}
+
+export function useManagedInstanceDetails(instanceId: string): HttpResponse<MerchantBackend.Instances.QueryInstancesResponse> {
+ const { url, token } = useBackendContext();
+
+ const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Instances.QueryInstancesResponse>, HttpError>([`/management/instances/${instanceId}`, token, url], fetcher, {
+ refreshInterval:0,
+ refreshWhenHidden: false,
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ refreshWhenOffline: false,
+ errorRetryCount: 0,
+ errorRetryInterval: 1,
+ shouldRetryOnError: false,
+ })
+
+ if (isValidating) return {loading:true, data: data?.data}
+ if (data) return data
+ if (error) return error
+ return {loading: true}
+}
+
+export function useBackendInstances(): HttpResponse<MerchantBackend.Instances.InstancesResponse> {
+ const { url } = useBackendContext()
+ const { token } = useInstanceContext();
+
+ const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Instances.InstancesResponse>, HttpError>(['/management/instances', token, url], fetcher)
+
+ if (isValidating) return {loading:true, data: data?.data}
+ if (data) return data
+ if (error) return error
+ return {loading: true}
+}
diff --git a/packages/backend/src/hooks/listener.ts b/packages/backend/src/hooks/listener.ts
new file mode 100644
index 0000000..231ed6c
--- /dev/null
+++ b/packages/backend/src/hooks/listener.ts
@@ -0,0 +1,68 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { useState } from "preact/hooks";
+
+/**
+ * returns subscriber and activator
+ * subscriber will receive a method (listener) that will be call when the activator runs.
+ * the result of calling the listener will be sent to @action
+ *
+ * @param action from <T> to <R>
+ * @returns activator and subscriber, undefined activator means that there is not subscriber
+ */
+
+export function useListener<T, R = any>(action: (r: T) => Promise<R>): [undefined | (() => Promise<R>), (listener?: () => T) => void] {
+ type RunnerHandler = { toBeRan?: () => Promise<R>; };
+ const [state, setState] = useState<RunnerHandler>({});
+
+ /**
+ * subscriber will receive a method that will be call when the activator runs
+ *
+ * @param listener function to be run when the activator runs
+ */
+ const subscriber = (listener?: () => T) => {
+ if (listener) {
+ setState({
+ toBeRan: () => {
+ const whatWeGetFromTheListener = listener();
+ return action(whatWeGetFromTheListener);
+ }
+ });
+ } else {
+ setState({
+ toBeRan: undefined
+ })
+ }
+ };
+
+ /**
+ * activator will call runner if there is someone subscribed
+ */
+ const activator = state.toBeRan ? async () => {
+ if (state.toBeRan) {
+ return state.toBeRan();
+ }
+ return Promise.reject();
+ } : undefined;
+
+ return [activator, subscriber];
+}
diff --git a/packages/backend/src/hooks/notification.ts b/packages/backend/src/hooks/notification.ts
new file mode 100644
index 0000000..d1dfbff
--- /dev/null
+++ b/packages/backend/src/hooks/notification.ts
@@ -0,0 +1,43 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { useCallback, useState } from "preact/hooks";
+import { Notification } from '../utils/types';
+
+interface Result {
+ notification?: Notification;
+ pushNotification: (n: Notification) => void;
+ removeNotification: () => void;
+}
+
+export function useNotification(): Result {
+ const [notification, setNotifications] = useState<Notification|undefined>(undefined)
+
+ const pushNotification = useCallback((n: Notification): void => {
+ setNotifications(n)
+ },[])
+
+ const removeNotification = useCallback(() => {
+ setNotifications(undefined)
+ },[])
+
+ return { notification, pushNotification, removeNotification }
+}
diff --git a/packages/backend/src/hooks/notifications.ts b/packages/backend/src/hooks/notifications.ts
new file mode 100644
index 0000000..1c0c373
--- /dev/null
+++ b/packages/backend/src/hooks/notifications.ts
@@ -0,0 +1,48 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { useState } from "preact/hooks";
+import { Notification } from '../utils/types';
+
+interface Result {
+ notifications: Notification[];
+ pushNotification: (n: Notification) => void;
+ removeNotification: (n: Notification) => void;
+}
+
+type NotificationWithDate = Notification & { since: Date }
+
+export function useNotifications(initial: Notification[] = [], timeout = 3000): Result {
+ const [notifications, setNotifications] = useState<(NotificationWithDate)[]>(initial.map(i => ({...i, since: new Date() })))
+
+ const pushNotification = (n: Notification): void => {
+ const entry = { ...n, since: new Date() }
+ setNotifications(ns => [...ns, entry])
+ if (n.type !== 'ERROR') setTimeout(() => {
+ setNotifications(ns => ns.filter(x => x.since !== entry.since))
+ }, timeout)
+ }
+
+ const removeNotification = (notif: Notification) => {
+ setNotifications((ns: NotificationWithDate[]) => ns.filter(n => n !== notif))
+ }
+ return { notifications, pushNotification, removeNotification }
+}
diff --git a/packages/backend/src/hooks/order.ts b/packages/backend/src/hooks/order.ts
new file mode 100644
index 0000000..a0d7916
--- /dev/null
+++ b/packages/backend/src/hooks/order.ts
@@ -0,0 +1,217 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 { useEffect, useState } from 'preact/hooks';
+import useSWR from 'swr';
+import { useBackendContext } from '../context/backend';
+import { useInstanceContext } from '../context/instance';
+import { MerchantBackend } from '../declaration';
+import { MAX_RESULT_SIZE, PAGE_SIZE } from '../utils/constants';
+import { fetcher, HttpError, HttpResponse, HttpResponseOk, HttpResponsePaginated, mutateAll, request } from './backend';
+
+export interface OrderAPI {
+ //FIXME: add OutOfStockResponse on 410
+ createOrder: (data: MerchantBackend.Orders.PostOrderRequest) => Promise<HttpResponseOk<MerchantBackend.Orders.PostOrderResponse>>;
+ forgetOrder: (id: string, data: MerchantBackend.Orders.ForgetRequest) => Promise<HttpResponseOk<void>>;
+ refundOrder: (id: string, data: MerchantBackend.Orders.RefundRequest) => Promise<HttpResponseOk<MerchantBackend.Orders.MerchantRefundResponse>>;
+ deleteOrder: (id: string) => Promise<HttpResponseOk<void>>;
+ getPaymentURL: (id: string) => Promise<HttpResponseOk<string>>;
+}
+
+type YesOrNo = 'yes' | 'no';
+
+
+export function orderFetcher<T>(url: string, token: string, backend: string, paid?: YesOrNo, refunded?: YesOrNo, wired?: YesOrNo, searchDate?: Date, delta?: number): Promise<HttpResponseOk<T>> {
+ const date_ms = delta && delta < 0 && searchDate ? searchDate.getTime() + 1 : searchDate?.getTime()
+ const params: any = {}
+ if (paid !== undefined) params.paid = paid
+ if (delta !== undefined) params.delta = delta
+ if (refunded !== undefined) params.refunded = refunded
+ if (wired !== undefined) params.wired = wired
+ if (date_ms !== undefined) params.date_ms = date_ms
+ return request<T>(`${backend}${url}`, { token, params })
+}
+
+
+export function useOrderAPI(): OrderAPI {
+ const { url: baseUrl, token: adminToken } = useBackendContext()
+ const { token: instanceToken, id, admin } = useInstanceContext()
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: adminToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ }
+
+ const createOrder = async (data: MerchantBackend.Orders.PostOrderRequest): Promise<HttpResponseOk<MerchantBackend.Orders.PostOrderResponse>> => {
+ const res = await request<MerchantBackend.Orders.PostOrderResponse>(`${url}/private/orders`, {
+ method: 'post',
+ token,
+ data
+ })
+ await mutateAll(/@"\/private\/orders"@/)
+ return res
+ }
+ const refundOrder = async (orderId: string, data: MerchantBackend.Orders.RefundRequest): Promise<HttpResponseOk<MerchantBackend.Orders.MerchantRefundResponse>> => {
+ mutateAll(/@"\/private\/orders"@/)
+ return request<MerchantBackend.Orders.MerchantRefundResponse>(`${url}/private/orders/${orderId}/refund`, {
+ method: 'post',
+ token,
+ data
+ })
+
+ // return res
+ }
+
+ const forgetOrder = async (orderId: string, data: MerchantBackend.Orders.ForgetRequest): Promise<HttpResponseOk<void>> => {
+ mutateAll(/@"\/private\/orders"@/)
+ return request(`${url}/private/orders/${orderId}/forget`, {
+ method: 'patch',
+ token,
+ data
+ })
+
+ }
+ const deleteOrder = async (orderId: string): Promise<HttpResponseOk<void>> => {
+ mutateAll(/@"\/private\/orders"@/)
+ return request(`${url}/private/orders/${orderId}`, {
+ method: 'delete',
+ token
+ })
+ }
+
+ const getPaymentURL = async (orderId: string): Promise<HttpResponseOk<string>> => {
+ return request<MerchantBackend.Orders.MerchantOrderStatusResponse>(`${url}/private/orders/${orderId}`, {
+ method: 'get',
+ token
+ }).then((res) => {
+ const url = res.data.order_status === "unpaid" ? res.data.taler_pay_uri : res.data.contract_terms.fulfillment_url
+ const response: HttpResponseOk<string> = res as any
+ response.data = url || ''
+ return response
+ })
+ }
+
+ return { createOrder, forgetOrder, deleteOrder, refundOrder, getPaymentURL }
+}
+
+export function useOrderDetails(oderId: string): HttpResponse<MerchantBackend.Orders.MerchantOrderStatusResponse> {
+ const { url: baseUrl, token: baseToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: baseToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ };
+
+ const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Orders.MerchantOrderStatusResponse>, HttpError>([`/private/orders/${oderId}`, token, url], fetcher, {
+ refreshInterval:0,
+ refreshWhenHidden: false,
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ refreshWhenOffline: false,
+ })
+
+ if (isValidating) return { loading: true, data: data?.data }
+ if (data) return data
+ if (error) return error
+ return { loading: true }
+}
+
+export interface InstanceOrderFilter {
+ paid?: YesOrNo;
+ refunded?: YesOrNo;
+ wired?: YesOrNo;
+ date?: Date;
+}
+
+export function useInstanceOrders(args?: InstanceOrderFilter, updateFilter?: (d: Date) => void): HttpResponsePaginated<MerchantBackend.Orders.OrderHistory> {
+ const { url: baseUrl, token: baseToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: baseToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ }
+
+ const [pageBefore, setPageBefore] = useState(1)
+ const [pageAfter, setPageAfter] = useState(1)
+
+ const totalAfter = pageAfter * PAGE_SIZE;
+ const totalBefore = args?.date ? pageBefore * PAGE_SIZE : 0;
+
+ /**
+ * FIXME: this can be cleaned up a little
+ *
+ * the logic of double query should be inside the orderFetch so from the hook perspective and cache
+ * is just one query and one error status
+ */
+ const { data: beforeData, error: beforeError, isValidating: loadingBefore } = useSWR<HttpResponseOk<MerchantBackend.Orders.OrderHistory>, HttpError>(
+ [`/private/orders`, token, url, args?.paid, args?.refunded, args?.wired, args?.date, totalBefore],
+ orderFetcher,
+ )
+ const { data: afterData, error: afterError, isValidating: loadingAfter } = useSWR<HttpResponseOk<MerchantBackend.Orders.OrderHistory>, HttpError>(
+ [`/private/orders`, token, url, args?.paid, args?.refunded, args?.wired, args?.date, -totalAfter],
+ orderFetcher,
+ )
+
+ //this will save last result
+ const [lastBefore, setLastBefore] = useState<HttpResponse<MerchantBackend.Orders.OrderHistory>>({ loading: true })
+ const [lastAfter, setLastAfter] = useState<HttpResponse<MerchantBackend.Orders.OrderHistory>>({ loading: true })
+ useEffect(() => {
+ if (afterData) setLastAfter(afterData)
+ if (beforeData) setLastBefore(beforeData)
+ }, [afterData, beforeData])
+
+ // this has problems when there are some ids missing
+
+ if (beforeError) return beforeError
+ if (afterError) return afterError
+
+
+ const pagination = {
+ isReachingEnd: afterData && afterData.data.orders.length < totalAfter,
+ isReachingStart: (!args?.date) || (beforeData && beforeData.data.orders.length < totalBefore),
+ loadMore: () => {
+ if (!afterData) return
+ if (afterData.data.orders.length < MAX_RESULT_SIZE) {
+ setPageAfter(pageAfter + 1)
+ } else {
+ const from = afterData.data.orders[afterData.data.orders.length - 1].timestamp.t_ms
+ if (from && updateFilter) updateFilter(new Date(from))
+ }
+ },
+ loadMorePrev: () => {
+ if (!beforeData) return
+ if (beforeData.data.orders.length < MAX_RESULT_SIZE) {
+ setPageBefore(pageBefore + 1)
+ } else if (beforeData) {
+ const from = beforeData.data.orders[beforeData.data.orders.length - 1].timestamp.t_ms
+ if (from && updateFilter) updateFilter(new Date(from))
+ }
+ },
+ }
+
+ const orders = !beforeData || !afterData ? [] : (beforeData || lastBefore).data.orders.slice().reverse().concat((afterData || lastAfter).data.orders)
+ if (loadingAfter || loadingBefore) return { loading: true, data: { orders } }
+ if (beforeData && afterData) {
+ return { ok: true, data: { orders }, ...pagination }
+ }
+ return { loading: true }
+
+}
+
diff --git a/packages/backend/src/hooks/product.ts b/packages/backend/src/hooks/product.ts
new file mode 100644
index 0000000..edba27b
--- /dev/null
+++ b/packages/backend/src/hooks/product.ts
@@ -0,0 +1,199 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 { useEffect } from 'preact/hooks';
+import useSWR, { trigger, useSWRInfinite, cache, mutate } from 'swr';
+import { useBackendContext } from '../context/backend';
+// import { useFetchContext } from '../context/fetch';
+import { useInstanceContext } from '../context/instance';
+import { MerchantBackend, WithId } from '../declaration';
+import { fetcher, HttpError, HttpResponse, HttpResponseOk, mutateAll, request } from './backend';
+
+export interface ProductAPI {
+ createProduct: (data: MerchantBackend.Products.ProductAddDetail) => Promise<void>;
+ updateProduct: (id: string, data: MerchantBackend.Products.ProductPatchDetail) => Promise<void>;
+ deleteProduct: (id: string) => Promise<void>;
+ lockProduct: (id: string, data: MerchantBackend.Products.LockRequest) => Promise<void>;
+}
+
+
+export function useProductAPI(): ProductAPI {
+ const { url: baseUrl, token: adminToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: adminToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ };
+
+
+ const createProduct = async (data: MerchantBackend.Products.ProductAddDetail): Promise<void> => {
+ await request(`${url}/private/products`, {
+ method: 'post',
+ token,
+ data
+ });
+
+ await mutateAll(/@"\/private\/products"@/, null);
+ };
+
+ const updateProduct = async (productId: string, data: MerchantBackend.Products.ProductPatchDetail): Promise<void> => {
+ const r = await request(`${url}/private/products/${productId}`, {
+ method: 'patch',
+ token,
+ data
+ });
+
+ /**
+ * There is some inconsistency in how the cache is evicted.
+ * I'm keeping this for later inspection
+ */
+
+ // -- Clear all cache
+ // -- This seems to work always but is bad
+
+ // const keys = [...cache.keys()]
+ // console.log(keys)
+ // cache.clear()
+ // await Promise.all(keys.map(k => trigger(k)))
+
+ // -- From the keys to the cache trigger
+ // -- An intermediate step
+
+ // const keys = [
+ // [`/private/products`, token, url],
+ // [`/private/products/${productId}`, token, url],
+ // ]
+ // cache.clear()
+ // const f: string[][] = keys.map(k => cache.serializeKey(k))
+ // console.log(f)
+ // const m = flat(f)
+ // console.log(m)
+ // await Promise.all(m.map(k => trigger(k, true)))
+
+ // await Promise.all(keys.map(k => mutate(k)))
+
+ // -- This is how is supposed to be use
+
+ // await mutate([`/private/products`, token, url])
+ // await mutate([`/private/products/${productId}`, token, url])
+
+ // await mutateAll(/@"\/private\/products"@/);
+ await mutateAll(/@"\/private\/products\/.*"@/);
+ // return true
+ // return r
+
+ // -- FIXME: why this un-break the tests?
+ return Promise.resolve()
+ };
+
+ const deleteProduct = async (productId: string): Promise<void> => {
+ await request(`${url}/private/products/${productId}`, {
+ method: 'delete',
+ token,
+ });
+
+ await mutateAll(/@"\/private\/products"@/);
+ };
+
+ const lockProduct = async (productId: string, data: MerchantBackend.Products.LockRequest): Promise<void> => {
+ await request(`${url}/private/products/${productId}/lock`, {
+ method: 'post',
+ token,
+ data
+ });
+
+ await mutateAll(/@"\/private\/products"@/);
+ };
+
+ return { createProduct, updateProduct, deleteProduct, lockProduct };
+}
+
+
+export function useInstanceProducts(): HttpResponse<(MerchantBackend.Products.ProductDetail & WithId)[]> {
+ const { url: baseUrl, token: baseToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+ // const { useSWR, useSWRInfinite } = useFetchContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: baseToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ };
+
+ const { data: list, error: listError, isValidating: listLoading } = useSWR<HttpResponseOk<MerchantBackend.Products.InventorySummaryResponse>, HttpError>([`/private/products`, token, url], fetcher, {
+ refreshInterval: 0,
+ refreshWhenHidden: false,
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ refreshWhenOffline: false,
+ });
+
+ const { data: products, error: productError, setSize, size } = useSWRInfinite<HttpResponseOk<MerchantBackend.Products.ProductDetail>, HttpError>((pageIndex: number) => {
+ if (!list?.data || !list.data.products.length || listError || listLoading) return null
+ return [`/private/products/${list.data.products[pageIndex].product_id}`, token, url]
+ }, fetcher, {
+ revalidateAll: true,
+ })
+
+ useEffect(() => {
+ if (list?.data && list.data.products.length > 0) {
+ setSize(list.data.products.length)
+ }
+ }, [list?.data.products.length, listLoading])
+
+
+ if (listLoading) return { loading: true, data: [] }
+ if (listError) return listError
+ if (productError) return productError
+ if (list?.data && list.data.products.length === 0) {
+ return { ok: true, data: [] }
+ }
+ if (products) {
+ const dataWithId = products.map((d) => {
+ //take the id from the queried url
+ return ({ ...d.data, id: d.info?.url.replace(/.*\/private\/products\//, '') || '' })
+ })
+ return { ok: true, data: dataWithId }
+ }
+ return { loading: true }
+}
+
+export function useProductDetails(productId: string): HttpResponse<MerchantBackend.Products.ProductDetail> {
+ const { url: baseUrl, token: baseToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: baseToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ };
+
+ const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Products.ProductDetail>, HttpError>(
+ [`/private/products/${productId}`, token, url], fetcher, {
+ refreshInterval: 0,
+ refreshWhenHidden: false,
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ refreshWhenOffline: false,
+ }
+ )
+
+ if (isValidating) return { loading: true, data: data?.data }
+ if (data) return data
+ if (error) return error
+ return { loading: true }
+}
diff --git a/packages/backend/src/hooks/tips.ts b/packages/backend/src/hooks/tips.ts
new file mode 100644
index 0000000..345e1fa
--- /dev/null
+++ b/packages/backend/src/hooks/tips.ts
@@ -0,0 +1,159 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 useSWR from 'swr';
+import { useBackendContext } from '../context/backend';
+import { useInstanceContext } from '../context/instance';
+import { MerchantBackend } from '../declaration';
+import { fetcher, HttpError, HttpResponse, HttpResponseOk, mutateAll, request } from './backend';
+
+
+export function useReservesAPI(): ReserveMutateAPI {
+ const { url: baseUrl, token: adminToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: adminToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ };
+
+ const createReserve = async (data: MerchantBackend.Tips.ReserveCreateRequest): Promise<HttpResponseOk<MerchantBackend.Tips.ReserveCreateConfirmation>> => {
+ const res = await request<MerchantBackend.Tips.ReserveCreateConfirmation>(`${url}/private/reserves`, {
+ method: 'post',
+ token,
+ data
+ });
+
+ await mutateAll(/@"\/private\/reserves"@/);
+
+ return res
+ };
+
+ const authorizeTipReserve = async (pub: string, data: MerchantBackend.Tips.TipCreateRequest): Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>> => {
+ const res = await request<MerchantBackend.Tips.TipCreateConfirmation>(`${url}/private/reserves/${pub}/authorize-tip`, {
+ method: 'post',
+ token,
+ data
+ });
+ await mutateAll(/@"\/private\/reserves"@/);
+
+ return res
+ };
+
+ const authorizeTip = async (data: MerchantBackend.Tips.TipCreateRequest): Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>> => {
+ const res = await request<MerchantBackend.Tips.TipCreateConfirmation>(`${url}/private/tips`, {
+ method: 'post',
+ token,
+ data
+ });
+
+ await mutateAll(/@"\/private\/reserves"@/);
+
+ return res
+ };
+
+ const deleteReserve = async (pub: string): Promise<HttpResponse<void>> => {
+ const res = await request<void>(`${url}/private/reserves/${pub}`, {
+ method: 'delete',
+ token,
+ });
+
+ await mutateAll(/@"\/private\/reserves"@/);
+
+ return res
+ };
+
+
+ return { createReserve, authorizeTip, authorizeTipReserve, deleteReserve };
+}
+
+export interface ReserveMutateAPI {
+ createReserve: (data: MerchantBackend.Tips.ReserveCreateRequest) => Promise<HttpResponseOk<MerchantBackend.Tips.ReserveCreateConfirmation>>;
+ authorizeTipReserve: (id: string, data: MerchantBackend.Tips.TipCreateRequest) => Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>>;
+ authorizeTip: (data: MerchantBackend.Tips.TipCreateRequest) => Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>>;
+ deleteReserve: (id: string) => Promise<HttpResponse<void>>;
+}
+
+export function useInstanceTips(): HttpResponse<MerchantBackend.Tips.TippingReserveStatus> {
+ const { url: baseUrl, token: baseToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: baseToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ }
+
+ const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Tips.TippingReserveStatus>, HttpError>([`/private/reserves`, token, url], fetcher)
+
+ if (isValidating) return { loading: true, data: data?.data }
+ if (data) return data
+ if (error) return error
+ return { loading: true }
+}
+
+
+export function useReserveDetails(reserveId: string): HttpResponse<MerchantBackend.Tips.ReserveDetail> {
+ const { url: baseUrl } = useBackendContext();
+ const { token, id: instanceId, admin } = useInstanceContext();
+
+ const url = !admin ? baseUrl : `${baseUrl}/instances/${instanceId}`
+
+ const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Tips.ReserveDetail>, HttpError>([`/private/reserves/${reserveId}`, token, url], reserveDetailFetcher, {
+ refreshInterval:0,
+ refreshWhenHidden: false,
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ refreshWhenOffline: false,
+ })
+
+ if (isValidating) return { loading: true, data: data?.data }
+ if (data) return data
+ if (error) return error
+ return { loading: true }
+}
+
+export function useTipDetails(tipId: string): HttpResponse<MerchantBackend.Tips.TipDetails> {
+ const { url: baseUrl } = useBackendContext();
+ const { token, id: instanceId, admin } = useInstanceContext();
+
+ const url = !admin ? baseUrl : `${baseUrl}/instances/${instanceId}`
+
+ const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Tips.TipDetails>, HttpError>([`/private/tips/${tipId}`, token, url], tipsDetailFetcher, {
+ refreshInterval:0,
+ refreshWhenHidden: false,
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ refreshWhenOffline: false,
+ })
+
+ if (isValidating) return { loading: true, data: data?.data }
+ if (data) return data
+ if (error) return error
+ return { loading: true }
+}
+
+export function reserveDetailFetcher<T>(url: string, token: string, backend: string): Promise<HttpResponseOk<T>> {
+ return request<T>(`${backend}${url}`, { token, params: {
+ tips: 'yes'
+ } })
+}
+
+export function tipsDetailFetcher<T>(url: string, token: string, backend: string): Promise<HttpResponseOk<T>> {
+ return request<T>(`${backend}${url}`, { token, params: {
+ pickups: 'yes'
+ } })
+}
diff --git a/packages/backend/src/hooks/transfer.ts b/packages/backend/src/hooks/transfer.ts
new file mode 100644
index 0000000..02e041a
--- /dev/null
+++ b/packages/backend/src/hooks/transfer.ts
@@ -0,0 +1,150 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 { MerchantBackend } from '../declaration';
+import { useBackendContext } from '../context/backend';
+import { request, mutateAll, HttpResponse, HttpError, HttpResponseOk, HttpResponsePaginated } from './backend';
+import useSWR from 'swr';
+import { useInstanceContext } from '../context/instance';
+import { MAX_RESULT_SIZE, PAGE_SIZE } from '../utils/constants';
+import { useEffect, useState } from 'preact/hooks';
+
+async function transferFetcher<T>(url: string, token: string, backend: string, payto_uri?: string, verified?: string, position?: string, delta?: number): Promise<HttpResponseOk<T>> {
+ const params: any = {}
+ if (payto_uri !== undefined) params.payto_uri = payto_uri
+ if (verified !== undefined) params.verified = verified
+ if (delta !== undefined) {
+ // if (delta > 0) {
+ // params.after = searchDate?.getTime()
+ // } else {
+ // params.before = searchDate?.getTime()
+ // }
+ params.limit = delta
+ }
+ if (position !== undefined) params.offset = position
+
+ return request<T>(`${backend}${url}`, { token, params })
+}
+
+export function useTransferAPI(): TransferAPI {
+ const { url: baseUrl, token: adminToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: adminToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ };
+
+ const informTransfer = async (data: MerchantBackend.Transfers.TransferInformation): Promise<HttpResponseOk<MerchantBackend.Transfers.MerchantTrackTransferResponse>> => {
+ mutateAll(/@"\/private\/transfers"@/);
+
+ return request<MerchantBackend.Transfers.MerchantTrackTransferResponse>(`${url}/private/transfers`, {
+ method: 'post',
+ token,
+ data
+ });
+ };
+
+ return { informTransfer };
+}
+
+export interface TransferAPI {
+ informTransfer: (data: MerchantBackend.Transfers.TransferInformation) => Promise<HttpResponseOk<MerchantBackend.Transfers.MerchantTrackTransferResponse>>;
+}
+
+export interface InstanceTransferFilter {
+ payto_uri?: string;
+ verified?: 'yes' | 'no';
+ position?: string;
+}
+
+
+export function useInstanceTransfers(args?: InstanceTransferFilter, updatePosition?: (id: string) => void): HttpResponsePaginated<MerchantBackend.Transfers.TransferList> {
+ const { url: baseUrl, token: baseToken } = useBackendContext();
+ const { token: instanceToken, id, admin } = useInstanceContext();
+
+ const { url, token } = !admin ? {
+ url: baseUrl, token: baseToken
+ } : {
+ url: `${baseUrl}/instances/${id}`, token: instanceToken
+ }
+
+ const [pageBefore, setPageBefore] = useState(1)
+ const [pageAfter, setPageAfter] = useState(1)
+
+ const totalAfter = pageAfter * PAGE_SIZE;
+ const totalBefore = args?.position !== undefined ? pageBefore * PAGE_SIZE : 0;
+
+ /**
+ * FIXME: this can be cleaned up a little
+ *
+ * the logic of double query should be inside the orderFetch so from the hook perspective and cache
+ * is just one query and one error status
+ */
+ const { data: beforeData, error: beforeError, isValidating: loadingBefore } = useSWR<HttpResponseOk<MerchantBackend.Transfers.TransferList>, HttpError>(
+ [`/private/transfers`, token, url, args?.payto_uri, args?.verified, args?.position, totalBefore],
+ transferFetcher,
+ )
+ const { data: afterData, error: afterError, isValidating: loadingAfter } = useSWR<HttpResponseOk<MerchantBackend.Transfers.TransferList>, HttpError>(
+ [`/private/transfers`, token, url, args?.payto_uri, args?.verified, args?.position, -totalAfter],
+ transferFetcher,
+ )
+
+ //this will save last result
+ const [lastBefore, setLastBefore] = useState<HttpResponse<MerchantBackend.Transfers.TransferList>>({ loading: true })
+ const [lastAfter, setLastAfter] = useState<HttpResponse<MerchantBackend.Transfers.TransferList>>({ loading: true })
+ useEffect(() => {
+ if (afterData) setLastAfter(afterData)
+ if (beforeData) setLastBefore(beforeData)
+ }, [afterData, beforeData])
+
+ // this has problems when there are some ids missing
+
+ if (beforeError) return beforeError
+ if (afterError) return afterError
+
+ const pagination = {
+ isReachingEnd: afterData && afterData.data.transfers.length < totalAfter,
+ isReachingStart: (!args?.position) || (beforeData && beforeData.data.transfers.length < totalBefore),
+ loadMore: () => {
+ if (!afterData) return
+ if (afterData.data.transfers.length < MAX_RESULT_SIZE) {
+ setPageAfter(pageAfter + 1)
+ } else {
+ const from = ""+afterData.data.transfers[afterData.data.transfers.length - 1].transfer_serial_id
+ if (from && updatePosition) updatePosition(from)
+ }
+ },
+ loadMorePrev: () => {
+ if (!beforeData) return
+ if (beforeData.data.transfers.length < MAX_RESULT_SIZE) {
+ setPageBefore(pageBefore + 1)
+ } else if (beforeData) {
+ const from = ""+beforeData.data.transfers[beforeData.data.transfers.length - 1].transfer_serial_id
+ if (from && updatePosition) updatePosition(from)
+ }
+ },
+ }
+
+ const transfers = !beforeData || !afterData ? [] : (beforeData || lastBefore).data.transfers.slice().reverse().concat((afterData || lastAfter).data.transfers)
+ if (loadingAfter || loadingBefore) return { loading: true, data: { transfers } }
+ if (beforeData && afterData) {
+ return { ok: true, data: { transfers }, ...pagination }
+ }
+ return { loading: true }
+}
+
+
diff --git a/packages/backend/src/i18n/de.po b/packages/backend/src/i18n/de.po
new file mode 100644
index 0000000..6b35bd0
--- /dev/null
+++ b/packages/backend/src/i18n/de.po
@@ -0,0 +1,1057 @@
+# This file is part of TALER
+# (C) 2016 GNUnet e.V.
+#
+# 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.
+#
+# 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
+# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Taler Wallet\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-11-23 00:00+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/ApplicationReadyRoutes.tsx:50 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:299
+#, c-format
+msgid "Access denied"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:51 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:300
+#, c-format
+msgid "Check your token is valid"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:72
+#, c-format
+msgid "Couldn't access the server."
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:73
+#, c-format
+msgid "Could not infer instance id from url %1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:109
+#, c-format
+msgid "HTTP status #%1$s: Server reported a problem"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:110
+#, c-format
+msgid "Got message: \"%1$s\" from: %2$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:127
+#, c-format
+msgid "No default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:128
+#, c-format
+msgid ""
+"in order to use merchant backoffice, you should create the default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:288
+#, c-format
+msgid "Server reported a problem: HTTP status #%1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:289
+#, c-format
+msgid "Got message: %1$s from: %2$s"
+msgstr ""
+
+#: src/components/exception/login.tsx:46
+#, c-format
+msgid "Login required"
+msgstr ""
+
+#: src/components/exception/login.tsx:49
+#, c-format
+msgid ""
+"Please enter your auth token. Token should have \"secret-token:\" and start "
+"with Bearer or ApiKey"
+msgstr ""
+
+#: src/components/exception/login.tsx:86 src/components/modal/index.tsx:53
+#: src/components/modal/index.tsx:75 src/paths/admin/create/CreatePage.tsx:115
+#: src/paths/instance/orders/create/CreatePage.tsx:325
+#: src/paths/instance/products/create/CreatePage.tsx:51
+#: src/paths/instance/products/list/Table.tsx:174
+#: src/paths/instance/products/list/Table.tsx:228
+#: src/paths/instance/products/update/UpdatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:134
+#, c-format
+msgid "Confirm"
+msgstr ""
+
+#: src/components/form/InputArray.tsx:72
+#, c-format
+msgid "The value %1$s is invalid for a payment url"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:67
+#: src/paths/instance/orders/list/index.tsx:123
+#, c-format
+msgid "pick a date"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:81
+#, c-format
+msgid "clear"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:83
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "never"
+msgstr ""
+
+#: src/components/form/InputImage.tsx:80
+#, c-format
+msgid "Image should be smaller than 1 MB"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:28
+#, c-format
+msgid "Country"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:30
+#: src/paths/admin/create/CreatePage.tsx:99
+#: src/paths/instance/transfers/list/Table.tsx:124
+#: src/paths/instance/update/UpdatePage.tsx:118
+#, c-format
+msgid "Address"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:34
+#, c-format
+msgid "Building number"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:35
+#, c-format
+msgid "Building name"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:36
+#, c-format
+msgid "Street"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:37
+#, c-format
+msgid "Post code"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:38
+#, c-format
+msgid "Town location"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:39
+#, c-format
+msgid "Town"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:40
+#, c-format
+msgid "District"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:41
+#, c-format
+msgid "Country subdivision"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:59
+#, c-format
+msgid "Product id"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:60
+#: src/components/product/ProductForm.tsx:99
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:122
+#: src/paths/instance/orders/list/Table.tsx:227
+#: src/paths/instance/products/list/Table.tsx:86
+#, c-format
+msgid "Description"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:73
+#: src/components/form/InputTaxes.tsx:81
+#: src/paths/admin/create/CreatePage.tsx:87 src/paths/admin/list/Table.tsx:110
+#: src/paths/instance/details/DetailPage.tsx:76
+#: src/paths/instance/update/UpdatePage.tsx:106
+#, c-format
+msgid "Name"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:102
+#, c-format
+msgid "loading..."
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:108
+#, c-format
+msgid "no products found"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:116
+#, c-format
+msgid "no results"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:33
+#, c-format
+msgid "Deleting"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:34
+#, c-format
+msgid "Changing"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:60
+#, c-format
+msgid "Manage token"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:83
+#, c-format
+msgid "Update"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:100
+#: src/paths/instance/orders/create/CreatePage.tsx:252
+#: src/paths/instance/orders/create/CreatePage.tsx:273
+#, c-format
+msgid "Remove"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:106 src/components/modal/index.tsx:52
+#: src/components/modal/index.tsx:73 src/paths/admin/create/CreatePage.tsx:114
+#: src/paths/instance/orders/create/CreatePage.tsx:324
+#: src/paths/instance/products/create/CreatePage.tsx:50
+#: src/paths/instance/products/list/Table.tsx:166
+#: src/paths/instance/products/list/Table.tsx:218
+#: src/paths/instance/products/update/UpdatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:88
+#: src/paths/instance/update/UpdatePage.tsx:133
+#, c-format
+msgid "Cancel"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:91
+#, c-format
+msgid "Manage stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:93
+#, c-format
+msgid "Infinite"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:105
+#, c-format
+msgid "lost cannot be greater that current + incoming (max %1$s)"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:111
+#, c-format
+msgid "current stock will change from %1$s to %2$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:112
+#, c-format
+msgid "current stock will stay at %1$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:129
+#: src/paths/instance/products/list/Table.tsx:204
+#, c-format
+msgid "Incoming"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:130
+#: src/paths/instance/products/list/Table.tsx:205
+#, c-format
+msgid "Lost"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:142
+#, c-format
+msgid "Current"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:145
+#, c-format
+msgid "without stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:150
+#, c-format
+msgid "Next restock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:152
+#, c-format
+msgid "Delivery address"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:73
+#, c-format
+msgid "this product has no taxes"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:77
+#: src/paths/instance/orders/details/DetailPage.tsx:145
+#: src/paths/instance/orders/details/DetailPage.tsx:296
+#: src/paths/instance/orders/list/Table.tsx:116
+#: src/paths/instance/transfers/create/CreatePage.tsx:84
+#, c-format
+msgid "Amount"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:78
+#, c-format
+msgid "currency and value separated with colon"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:84
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:78
+#, c-format
+msgid "Add"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:53
+#, c-format
+msgid "Instance"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:59
+#, c-format
+msgid "Settings"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:65
+#: src/paths/instance/orders/list/Table.tsx:60
+#, c-format
+msgid "Orders"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:71
+#: src/paths/instance/orders/create/CreatePage.tsx:258
+#: src/paths/instance/products/list/Table.tsx:48
+#, c-format
+msgid "Products"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:77
+#: src/paths/instance/transfers/list/Table.tsx:65
+#, c-format
+msgid "Transfers"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:87
+#, c-format
+msgid "Connection"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:112 src/paths/admin/list/Table.tsx:57
+#, c-format
+msgid "Instances"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:116
+#, c-format
+msgid "New"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:122
+#, c-format
+msgid "List"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:129
+#, c-format
+msgid "Log out"
+msgstr ""
+
+#: src/components/modal/index.tsx:74
+#, c-format
+msgid "Clear"
+msgstr ""
+
+#: src/components/modal/index.tsx:110 src/components/modal/index.tsx:111
+#, c-format
+msgid "should be the same"
+msgstr ""
+
+#: src/components/modal/index.tsx:111
+#, c-format
+msgid "cannot be the same as before"
+msgstr ""
+
+#: src/components/modal/index.tsx:114
+#, c-format
+msgid ""
+"You are updating the authorization token from instance %1$s with id %2$s"
+msgstr ""
+
+#: src/components/modal/index.tsx:124
+#, c-format
+msgid "Old token"
+msgstr ""
+
+#: src/components/modal/index.tsx:125
+#, c-format
+msgid "New token"
+msgstr ""
+
+#: src/components/modal/index.tsx:127
+#, c-format
+msgid "Clearing the auth token will mean public access to the instance"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:96
+#: src/paths/admin/create/CreatePage.tsx:85 src/paths/admin/list/Table.tsx:109
+#: src/paths/instance/transfers/list/Table.tsx:122
+#, c-format
+msgid "ID"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:98
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:121
+#: src/paths/instance/products/list/Table.tsx:85
+#, c-format
+msgid "Image"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:100
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:123
+#, c-format
+msgid "Unit"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:101
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:124
+#: src/paths/instance/products/list/Table.tsx:162
+#: src/paths/instance/products/list/Table.tsx:214
+#, c-format
+msgid "Price"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:103
+#: src/paths/instance/products/list/Table.tsx:90
+#, c-format
+msgid "Stock"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:105
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:128
+#: src/paths/instance/products/list/Table.tsx:88
+#, c-format
+msgid "Taxes"
+msgstr ""
+
+#: src/index.tsx:75
+#, c-format
+msgid "Server not found"
+msgstr ""
+
+#: src/index.tsx:85
+#, c-format
+msgid "Couldn't access the server"
+msgstr ""
+
+#: src/index.tsx:87 src/index.tsx:99
+#, c-format
+msgid "Got message %1$s from %2$s"
+msgstr ""
+
+#: src/index.tsx:97
+#, c-format
+msgid "Unexpected Error"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:108
+#, c-format
+msgid "Auth token"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:91
+#: src/paths/instance/details/DetailPage.tsx:77
+#: src/paths/instance/update/UpdatePage.tsx:110
+#, c-format
+msgid "Account address"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:93
+#: src/paths/instance/update/UpdatePage.tsx:112
+#, c-format
+msgid "Default max deposit fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:95
+#: src/paths/instance/update/UpdatePage.tsx:114
+#, c-format
+msgid "Default max wire fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:97
+#: src/paths/instance/update/UpdatePage.tsx:116
+#, c-format
+msgid "Default wire fee amortization"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:103
+#: src/paths/instance/update/UpdatePage.tsx:122
+#, c-format
+msgid "Jurisdiction"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:107
+#: src/paths/instance/update/UpdatePage.tsx:126
+#, c-format
+msgid "Default pay delay"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:109
+#: src/paths/instance/update/UpdatePage.tsx:128
+#, c-format
+msgid "Default wire transfer delay"
+msgstr ""
+
+#: src/paths/admin/create/index.tsx:58
+#, c-format
+msgid "could not create instance"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:63 src/paths/admin/list/Table.tsx:131
+#: src/paths/instance/transfers/list/Table.tsx:71
+#, c-format
+msgid "Delete"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:128
+#, c-format
+msgid "Edit"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:149
+#: src/paths/instance/products/list/Table.tsx:245
+#, c-format
+msgid "There is no instances yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:237
+#, c-format
+msgid "Inventory products"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:286
+#, c-format
+msgid "Total price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:287
+#, c-format
+msgid "Total tax"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:289
+#: src/paths/instance/orders/create/CreatePage.tsx:297
+#, c-format
+msgid "Order price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:295
+#, c-format
+msgid "Net"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:300
+#: src/paths/instance/orders/details/DetailPage.tsx:144
+#: src/paths/instance/orders/details/DetailPage.tsx:295
+#: src/paths/instance/orders/list/Table.tsx:117
+#, c-format
+msgid "Summary"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:302
+#, c-format
+msgid "Payments options"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:303
+#, c-format
+msgid "Auto refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:304
+#, c-format
+msgid "Refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:305
+#, c-format
+msgid "Pay deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:307
+#, c-format
+msgid "Delivery date"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:308
+#, c-format
+msgid "Location"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:312
+#, c-format
+msgid "Max fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:313
+#, c-format
+msgid "Max wire fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:314
+#, c-format
+msgid "Wire fee amortization"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:315
+#, c-format
+msgid "Fullfilment url"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:318
+#, c-format
+msgid "Extra information"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:44
+#, c-format
+msgid "select a product first"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:51
+#, c-format
+msgid "should be greater than 0"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:58
+#, c-format
+msgid ""
+"cannot be greater than current stock and quantity previously added. max: %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:64
+#, c-format
+msgid "cannot be greater than current stock %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:76
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:126
+#, c-format
+msgid "Quantity"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:92
+#: src/paths/instance/orders/details/DetailPage.tsx:235
+#: src/paths/instance/orders/details/DetailPage.tsx:333
+#, c-format
+msgid "Order"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:93
+#, c-format
+msgid "claimed"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:110
+#: src/paths/instance/orders/details/DetailPage.tsx:261
+#: src/paths/instance/orders/list/Table.tsx:136
+#, c-format
+msgid "copy url"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:126
+#: src/paths/instance/orders/details/DetailPage.tsx:349
+#, c-format
+msgid "pay at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:127
+#: src/paths/instance/orders/details/DetailPage.tsx:350
+#, c-format
+msgid "created at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:138
+#: src/paths/instance/orders/details/DetailPage.tsx:289
+#, c-format
+msgid "Timeline"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:142
+#: src/paths/instance/orders/details/DetailPage.tsx:293
+#, c-format
+msgid "Payment details"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:146
+#: src/paths/instance/orders/details/DetailPage.tsx:299
+#: src/paths/instance/orders/details/DetailPage.tsx:363
+#, c-format
+msgid "Order status"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:156
+#: src/paths/instance/orders/details/DetailPage.tsx:308
+#, c-format
+msgid "Product list"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:236
+#, c-format
+msgid "paid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:238
+#, c-format
+msgid "wired"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:241
+#, c-format
+msgid "refunded"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:258
+#, c-format
+msgid "refund"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:297
+#, c-format
+msgid "Refunded amount"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:298
+#, c-format
+msgid "Deposit total"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:336
+#, c-format
+msgid "unpaid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:364
+#, c-format
+msgid "Order status URL"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:365
+#, c-format
+msgid "Pay URI"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:383
+#, c-format
+msgid ""
+"Unknown order status. This is an error, please contact the administrator."
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:56
+#: src/paths/instance/orders/list/index.tsx:147
+#, c-format
+msgid "refund created successfully"
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:59
+#: src/paths/instance/orders/list/index.tsx:150
+#, c-format
+msgid "could not create the refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:111
+#, c-format
+msgid "load newer orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:115
+#, c-format
+msgid "Date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:131
+#: src/paths/instance/orders/list/Table.tsx:223
+#, c-format
+msgid "Refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:145
+#, c-format
+msgid "load older orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:154
+#, c-format
+msgid "No orders has been found"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:202
+#, c-format
+msgid "date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:203
+#, c-format
+msgid "amount"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:204
+#, c-format
+msgid "reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:224
+#, c-format
+msgid "Max refundable:"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "Reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "duplicated"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "requested by the customer"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "other"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:91
+#, c-format
+msgid "go to order id"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:107
+#, c-format
+msgid "Paid"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:108
+#, c-format
+msgid "Refunded"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:109
+#, c-format
+msgid "Not wired"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:110
+#, c-format
+msgid "All"
+msgstr ""
+
+#: src/paths/instance/products/create/index.tsx:48
+#: src/paths/instance/products/update/index.tsx:64
+#, c-format
+msgid "could not create product"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:87
+#, c-format
+msgid "Sell"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:89
+#, c-format
+msgid "Profit"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:91
+#, c-format
+msgid "Sold"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:59
+#, c-format
+msgid "product updated successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:62
+#, c-format
+msgid "could not update the product"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:70
+#, c-format
+msgid "product delete successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:73
+#, c-format
+msgid "could not delete the product"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:59
+#, c-format
+msgid "Tips"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:111
+#, c-format
+msgid "Committed amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:112
+#, c-format
+msgid "Exchange initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:113
+#, c-format
+msgid "Merchant initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:148
+#, c-format
+msgid "There is no tips yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:50
+#: src/paths/instance/transfers/create/CreatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:56
+#, c-format
+msgid "cannot be empty"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:51
+#, c-format
+msgid "check the id, doest look valid"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:52
+#, c-format
+msgid "should have 52 characters, current %1$s"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:57
+#, c-format
+msgid "URL doesn't have the right format"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:74
+#, c-format
+msgid "Transfer ID"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:76
+#, c-format
+msgid "Account Address"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:82
+#: src/paths/instance/transfers/list/Table.tsx:125
+#, c-format
+msgid "Exchange URL"
+msgstr ""
+
+#: src/paths/instance/transfers/create/index.tsx:49
+#, c-format
+msgid "could not inform transfer"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:118
+#, c-format
+msgid "load newer transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:123
+#, c-format
+msgid "Credit"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:126
+#, c-format
+msgid "Confirmed"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:127
+#: src/paths/instance/transfers/list/index.tsx:60
+#, c-format
+msgid "Verified"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:128
+#, c-format
+msgid "Executed at"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "yes"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "no"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "unknown"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:145
+#, c-format
+msgid "load older transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:154
+#, c-format
+msgid "There is no transfer yet, add more pressing the + sign"
+msgstr ""
diff --git a/packages/backend/src/i18n/en.po b/packages/backend/src/i18n/en.po
new file mode 100644
index 0000000..6b35bd0
--- /dev/null
+++ b/packages/backend/src/i18n/en.po
@@ -0,0 +1,1057 @@
+# This file is part of TALER
+# (C) 2016 GNUnet e.V.
+#
+# 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.
+#
+# 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
+# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Taler Wallet\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-11-23 00:00+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/ApplicationReadyRoutes.tsx:50 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:299
+#, c-format
+msgid "Access denied"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:51 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:300
+#, c-format
+msgid "Check your token is valid"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:72
+#, c-format
+msgid "Couldn't access the server."
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:73
+#, c-format
+msgid "Could not infer instance id from url %1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:109
+#, c-format
+msgid "HTTP status #%1$s: Server reported a problem"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:110
+#, c-format
+msgid "Got message: \"%1$s\" from: %2$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:127
+#, c-format
+msgid "No default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:128
+#, c-format
+msgid ""
+"in order to use merchant backoffice, you should create the default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:288
+#, c-format
+msgid "Server reported a problem: HTTP status #%1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:289
+#, c-format
+msgid "Got message: %1$s from: %2$s"
+msgstr ""
+
+#: src/components/exception/login.tsx:46
+#, c-format
+msgid "Login required"
+msgstr ""
+
+#: src/components/exception/login.tsx:49
+#, c-format
+msgid ""
+"Please enter your auth token. Token should have \"secret-token:\" and start "
+"with Bearer or ApiKey"
+msgstr ""
+
+#: src/components/exception/login.tsx:86 src/components/modal/index.tsx:53
+#: src/components/modal/index.tsx:75 src/paths/admin/create/CreatePage.tsx:115
+#: src/paths/instance/orders/create/CreatePage.tsx:325
+#: src/paths/instance/products/create/CreatePage.tsx:51
+#: src/paths/instance/products/list/Table.tsx:174
+#: src/paths/instance/products/list/Table.tsx:228
+#: src/paths/instance/products/update/UpdatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:134
+#, c-format
+msgid "Confirm"
+msgstr ""
+
+#: src/components/form/InputArray.tsx:72
+#, c-format
+msgid "The value %1$s is invalid for a payment url"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:67
+#: src/paths/instance/orders/list/index.tsx:123
+#, c-format
+msgid "pick a date"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:81
+#, c-format
+msgid "clear"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:83
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "never"
+msgstr ""
+
+#: src/components/form/InputImage.tsx:80
+#, c-format
+msgid "Image should be smaller than 1 MB"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:28
+#, c-format
+msgid "Country"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:30
+#: src/paths/admin/create/CreatePage.tsx:99
+#: src/paths/instance/transfers/list/Table.tsx:124
+#: src/paths/instance/update/UpdatePage.tsx:118
+#, c-format
+msgid "Address"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:34
+#, c-format
+msgid "Building number"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:35
+#, c-format
+msgid "Building name"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:36
+#, c-format
+msgid "Street"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:37
+#, c-format
+msgid "Post code"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:38
+#, c-format
+msgid "Town location"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:39
+#, c-format
+msgid "Town"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:40
+#, c-format
+msgid "District"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:41
+#, c-format
+msgid "Country subdivision"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:59
+#, c-format
+msgid "Product id"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:60
+#: src/components/product/ProductForm.tsx:99
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:122
+#: src/paths/instance/orders/list/Table.tsx:227
+#: src/paths/instance/products/list/Table.tsx:86
+#, c-format
+msgid "Description"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:73
+#: src/components/form/InputTaxes.tsx:81
+#: src/paths/admin/create/CreatePage.tsx:87 src/paths/admin/list/Table.tsx:110
+#: src/paths/instance/details/DetailPage.tsx:76
+#: src/paths/instance/update/UpdatePage.tsx:106
+#, c-format
+msgid "Name"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:102
+#, c-format
+msgid "loading..."
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:108
+#, c-format
+msgid "no products found"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:116
+#, c-format
+msgid "no results"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:33
+#, c-format
+msgid "Deleting"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:34
+#, c-format
+msgid "Changing"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:60
+#, c-format
+msgid "Manage token"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:83
+#, c-format
+msgid "Update"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:100
+#: src/paths/instance/orders/create/CreatePage.tsx:252
+#: src/paths/instance/orders/create/CreatePage.tsx:273
+#, c-format
+msgid "Remove"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:106 src/components/modal/index.tsx:52
+#: src/components/modal/index.tsx:73 src/paths/admin/create/CreatePage.tsx:114
+#: src/paths/instance/orders/create/CreatePage.tsx:324
+#: src/paths/instance/products/create/CreatePage.tsx:50
+#: src/paths/instance/products/list/Table.tsx:166
+#: src/paths/instance/products/list/Table.tsx:218
+#: src/paths/instance/products/update/UpdatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:88
+#: src/paths/instance/update/UpdatePage.tsx:133
+#, c-format
+msgid "Cancel"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:91
+#, c-format
+msgid "Manage stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:93
+#, c-format
+msgid "Infinite"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:105
+#, c-format
+msgid "lost cannot be greater that current + incoming (max %1$s)"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:111
+#, c-format
+msgid "current stock will change from %1$s to %2$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:112
+#, c-format
+msgid "current stock will stay at %1$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:129
+#: src/paths/instance/products/list/Table.tsx:204
+#, c-format
+msgid "Incoming"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:130
+#: src/paths/instance/products/list/Table.tsx:205
+#, c-format
+msgid "Lost"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:142
+#, c-format
+msgid "Current"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:145
+#, c-format
+msgid "without stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:150
+#, c-format
+msgid "Next restock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:152
+#, c-format
+msgid "Delivery address"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:73
+#, c-format
+msgid "this product has no taxes"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:77
+#: src/paths/instance/orders/details/DetailPage.tsx:145
+#: src/paths/instance/orders/details/DetailPage.tsx:296
+#: src/paths/instance/orders/list/Table.tsx:116
+#: src/paths/instance/transfers/create/CreatePage.tsx:84
+#, c-format
+msgid "Amount"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:78
+#, c-format
+msgid "currency and value separated with colon"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:84
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:78
+#, c-format
+msgid "Add"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:53
+#, c-format
+msgid "Instance"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:59
+#, c-format
+msgid "Settings"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:65
+#: src/paths/instance/orders/list/Table.tsx:60
+#, c-format
+msgid "Orders"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:71
+#: src/paths/instance/orders/create/CreatePage.tsx:258
+#: src/paths/instance/products/list/Table.tsx:48
+#, c-format
+msgid "Products"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:77
+#: src/paths/instance/transfers/list/Table.tsx:65
+#, c-format
+msgid "Transfers"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:87
+#, c-format
+msgid "Connection"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:112 src/paths/admin/list/Table.tsx:57
+#, c-format
+msgid "Instances"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:116
+#, c-format
+msgid "New"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:122
+#, c-format
+msgid "List"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:129
+#, c-format
+msgid "Log out"
+msgstr ""
+
+#: src/components/modal/index.tsx:74
+#, c-format
+msgid "Clear"
+msgstr ""
+
+#: src/components/modal/index.tsx:110 src/components/modal/index.tsx:111
+#, c-format
+msgid "should be the same"
+msgstr ""
+
+#: src/components/modal/index.tsx:111
+#, c-format
+msgid "cannot be the same as before"
+msgstr ""
+
+#: src/components/modal/index.tsx:114
+#, c-format
+msgid ""
+"You are updating the authorization token from instance %1$s with id %2$s"
+msgstr ""
+
+#: src/components/modal/index.tsx:124
+#, c-format
+msgid "Old token"
+msgstr ""
+
+#: src/components/modal/index.tsx:125
+#, c-format
+msgid "New token"
+msgstr ""
+
+#: src/components/modal/index.tsx:127
+#, c-format
+msgid "Clearing the auth token will mean public access to the instance"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:96
+#: src/paths/admin/create/CreatePage.tsx:85 src/paths/admin/list/Table.tsx:109
+#: src/paths/instance/transfers/list/Table.tsx:122
+#, c-format
+msgid "ID"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:98
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:121
+#: src/paths/instance/products/list/Table.tsx:85
+#, c-format
+msgid "Image"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:100
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:123
+#, c-format
+msgid "Unit"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:101
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:124
+#: src/paths/instance/products/list/Table.tsx:162
+#: src/paths/instance/products/list/Table.tsx:214
+#, c-format
+msgid "Price"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:103
+#: src/paths/instance/products/list/Table.tsx:90
+#, c-format
+msgid "Stock"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:105
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:128
+#: src/paths/instance/products/list/Table.tsx:88
+#, c-format
+msgid "Taxes"
+msgstr ""
+
+#: src/index.tsx:75
+#, c-format
+msgid "Server not found"
+msgstr ""
+
+#: src/index.tsx:85
+#, c-format
+msgid "Couldn't access the server"
+msgstr ""
+
+#: src/index.tsx:87 src/index.tsx:99
+#, c-format
+msgid "Got message %1$s from %2$s"
+msgstr ""
+
+#: src/index.tsx:97
+#, c-format
+msgid "Unexpected Error"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:108
+#, c-format
+msgid "Auth token"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:91
+#: src/paths/instance/details/DetailPage.tsx:77
+#: src/paths/instance/update/UpdatePage.tsx:110
+#, c-format
+msgid "Account address"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:93
+#: src/paths/instance/update/UpdatePage.tsx:112
+#, c-format
+msgid "Default max deposit fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:95
+#: src/paths/instance/update/UpdatePage.tsx:114
+#, c-format
+msgid "Default max wire fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:97
+#: src/paths/instance/update/UpdatePage.tsx:116
+#, c-format
+msgid "Default wire fee amortization"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:103
+#: src/paths/instance/update/UpdatePage.tsx:122
+#, c-format
+msgid "Jurisdiction"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:107
+#: src/paths/instance/update/UpdatePage.tsx:126
+#, c-format
+msgid "Default pay delay"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:109
+#: src/paths/instance/update/UpdatePage.tsx:128
+#, c-format
+msgid "Default wire transfer delay"
+msgstr ""
+
+#: src/paths/admin/create/index.tsx:58
+#, c-format
+msgid "could not create instance"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:63 src/paths/admin/list/Table.tsx:131
+#: src/paths/instance/transfers/list/Table.tsx:71
+#, c-format
+msgid "Delete"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:128
+#, c-format
+msgid "Edit"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:149
+#: src/paths/instance/products/list/Table.tsx:245
+#, c-format
+msgid "There is no instances yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:237
+#, c-format
+msgid "Inventory products"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:286
+#, c-format
+msgid "Total price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:287
+#, c-format
+msgid "Total tax"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:289
+#: src/paths/instance/orders/create/CreatePage.tsx:297
+#, c-format
+msgid "Order price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:295
+#, c-format
+msgid "Net"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:300
+#: src/paths/instance/orders/details/DetailPage.tsx:144
+#: src/paths/instance/orders/details/DetailPage.tsx:295
+#: src/paths/instance/orders/list/Table.tsx:117
+#, c-format
+msgid "Summary"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:302
+#, c-format
+msgid "Payments options"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:303
+#, c-format
+msgid "Auto refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:304
+#, c-format
+msgid "Refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:305
+#, c-format
+msgid "Pay deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:307
+#, c-format
+msgid "Delivery date"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:308
+#, c-format
+msgid "Location"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:312
+#, c-format
+msgid "Max fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:313
+#, c-format
+msgid "Max wire fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:314
+#, c-format
+msgid "Wire fee amortization"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:315
+#, c-format
+msgid "Fullfilment url"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:318
+#, c-format
+msgid "Extra information"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:44
+#, c-format
+msgid "select a product first"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:51
+#, c-format
+msgid "should be greater than 0"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:58
+#, c-format
+msgid ""
+"cannot be greater than current stock and quantity previously added. max: %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:64
+#, c-format
+msgid "cannot be greater than current stock %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:76
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:126
+#, c-format
+msgid "Quantity"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:92
+#: src/paths/instance/orders/details/DetailPage.tsx:235
+#: src/paths/instance/orders/details/DetailPage.tsx:333
+#, c-format
+msgid "Order"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:93
+#, c-format
+msgid "claimed"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:110
+#: src/paths/instance/orders/details/DetailPage.tsx:261
+#: src/paths/instance/orders/list/Table.tsx:136
+#, c-format
+msgid "copy url"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:126
+#: src/paths/instance/orders/details/DetailPage.tsx:349
+#, c-format
+msgid "pay at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:127
+#: src/paths/instance/orders/details/DetailPage.tsx:350
+#, c-format
+msgid "created at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:138
+#: src/paths/instance/orders/details/DetailPage.tsx:289
+#, c-format
+msgid "Timeline"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:142
+#: src/paths/instance/orders/details/DetailPage.tsx:293
+#, c-format
+msgid "Payment details"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:146
+#: src/paths/instance/orders/details/DetailPage.tsx:299
+#: src/paths/instance/orders/details/DetailPage.tsx:363
+#, c-format
+msgid "Order status"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:156
+#: src/paths/instance/orders/details/DetailPage.tsx:308
+#, c-format
+msgid "Product list"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:236
+#, c-format
+msgid "paid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:238
+#, c-format
+msgid "wired"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:241
+#, c-format
+msgid "refunded"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:258
+#, c-format
+msgid "refund"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:297
+#, c-format
+msgid "Refunded amount"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:298
+#, c-format
+msgid "Deposit total"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:336
+#, c-format
+msgid "unpaid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:364
+#, c-format
+msgid "Order status URL"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:365
+#, c-format
+msgid "Pay URI"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:383
+#, c-format
+msgid ""
+"Unknown order status. This is an error, please contact the administrator."
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:56
+#: src/paths/instance/orders/list/index.tsx:147
+#, c-format
+msgid "refund created successfully"
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:59
+#: src/paths/instance/orders/list/index.tsx:150
+#, c-format
+msgid "could not create the refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:111
+#, c-format
+msgid "load newer orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:115
+#, c-format
+msgid "Date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:131
+#: src/paths/instance/orders/list/Table.tsx:223
+#, c-format
+msgid "Refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:145
+#, c-format
+msgid "load older orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:154
+#, c-format
+msgid "No orders has been found"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:202
+#, c-format
+msgid "date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:203
+#, c-format
+msgid "amount"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:204
+#, c-format
+msgid "reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:224
+#, c-format
+msgid "Max refundable:"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "Reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "duplicated"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "requested by the customer"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "other"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:91
+#, c-format
+msgid "go to order id"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:107
+#, c-format
+msgid "Paid"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:108
+#, c-format
+msgid "Refunded"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:109
+#, c-format
+msgid "Not wired"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:110
+#, c-format
+msgid "All"
+msgstr ""
+
+#: src/paths/instance/products/create/index.tsx:48
+#: src/paths/instance/products/update/index.tsx:64
+#, c-format
+msgid "could not create product"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:87
+#, c-format
+msgid "Sell"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:89
+#, c-format
+msgid "Profit"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:91
+#, c-format
+msgid "Sold"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:59
+#, c-format
+msgid "product updated successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:62
+#, c-format
+msgid "could not update the product"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:70
+#, c-format
+msgid "product delete successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:73
+#, c-format
+msgid "could not delete the product"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:59
+#, c-format
+msgid "Tips"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:111
+#, c-format
+msgid "Committed amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:112
+#, c-format
+msgid "Exchange initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:113
+#, c-format
+msgid "Merchant initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:148
+#, c-format
+msgid "There is no tips yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:50
+#: src/paths/instance/transfers/create/CreatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:56
+#, c-format
+msgid "cannot be empty"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:51
+#, c-format
+msgid "check the id, doest look valid"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:52
+#, c-format
+msgid "should have 52 characters, current %1$s"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:57
+#, c-format
+msgid "URL doesn't have the right format"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:74
+#, c-format
+msgid "Transfer ID"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:76
+#, c-format
+msgid "Account Address"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:82
+#: src/paths/instance/transfers/list/Table.tsx:125
+#, c-format
+msgid "Exchange URL"
+msgstr ""
+
+#: src/paths/instance/transfers/create/index.tsx:49
+#, c-format
+msgid "could not inform transfer"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:118
+#, c-format
+msgid "load newer transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:123
+#, c-format
+msgid "Credit"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:126
+#, c-format
+msgid "Confirmed"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:127
+#: src/paths/instance/transfers/list/index.tsx:60
+#, c-format
+msgid "Verified"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:128
+#, c-format
+msgid "Executed at"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "yes"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "no"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "unknown"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:145
+#, c-format
+msgid "load older transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:154
+#, c-format
+msgid "There is no transfer yet, add more pressing the + sign"
+msgstr ""
diff --git a/packages/backend/src/i18n/es.po b/packages/backend/src/i18n/es.po
new file mode 100644
index 0000000..9075d46
--- /dev/null
+++ b/packages/backend/src/i18n/es.po
@@ -0,0 +1,1065 @@
+# This file is part of TALER
+# (C) 2016 GNUnet e.V.
+#
+# 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.
+#
+# 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
+# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Taler Wallet\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-11-23 00:00+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/ApplicationReadyRoutes.tsx:50 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:299
+#, c-format
+msgid "Access denied"
+msgstr "Acceso denegado"
+
+#: src/ApplicationReadyRoutes.tsx:51 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:300
+#, c-format
+msgid "Check your token is valid"
+msgstr "Verifica que el token sea valido"
+
+#: src/ApplicationReadyRoutes.tsx:72
+#, c-format
+msgid "Couldn't access the server."
+msgstr "No se pudo acceder al servidor"
+
+#: src/ApplicationReadyRoutes.tsx:73
+#, c-format
+msgid "Could not infer instance id from url %1$s"
+msgstr "No se pudo inferir el id de la instancia con la url %1$s"
+
+#: src/InstanceRoutes.tsx:109
+#, c-format
+msgid "HTTP status #%1$s: Server reported a problem"
+msgstr "HTTP status #%1$s: Servidor reporto un problema"
+
+#: src/InstanceRoutes.tsx:110
+#, fuzzy, c-format
+msgid "Got message: \"%1$s\" from: %2$s"
+msgstr "Recivimos el mensaje %1$s desde %2$s"
+
+#: src/InstanceRoutes.tsx:127
+#, c-format
+msgid "No default instance"
+msgstr "Sin instancia default"
+
+#: src/InstanceRoutes.tsx:128
+#, c-format
+msgid ""
+"in order to use merchant backoffice, you should create the default instance"
+msgstr "para usar el merchant backoffice, deberΓ­a crear la instancia default"
+
+#: src/InstanceRoutes.tsx:288
+#, c-format
+msgid "Server reported a problem: HTTP status #%1$s"
+msgstr "Servidir reporto un problema: HTTP status #%1$s"
+
+#: src/InstanceRoutes.tsx:289
+#, fuzzy, c-format
+msgid "Got message: %1$s from: %2$s"
+msgstr "Recivimos el mensaje %1$s desde %2$s"
+
+#: src/components/exception/login.tsx:46
+#, c-format
+msgid "Login required"
+msgstr "Login necesario"
+
+#: src/components/exception/login.tsx:49
+#, c-format
+msgid ""
+"Please enter your auth token. Token should have \"secret-token:\" and start "
+"with Bearer or ApiKey"
+msgstr ""
+"Por favor ingrese su token de autorizaciΓ³n. El token debe tener \"secret-"
+"token\" y comenzar con Bearer o ApiKey"
+
+#: src/components/exception/login.tsx:86 src/components/modal/index.tsx:53
+#: src/components/modal/index.tsx:75 src/paths/admin/create/CreatePage.tsx:115
+#: src/paths/instance/orders/create/CreatePage.tsx:325
+#: src/paths/instance/products/create/CreatePage.tsx:51
+#: src/paths/instance/products/list/Table.tsx:174
+#: src/paths/instance/products/list/Table.tsx:228
+#: src/paths/instance/products/update/UpdatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:134
+#, c-format
+msgid "Confirm"
+msgstr "Confirmar"
+
+#: src/components/form/InputArray.tsx:72
+#, c-format
+msgid "The value %1$s is invalid for a payment url"
+msgstr "El valor %1$s es invalido para una URL de pago"
+
+#: src/components/form/InputDate.tsx:67
+#: src/paths/instance/orders/list/index.tsx:123
+#, c-format
+msgid "pick a date"
+msgstr "elegir una fecha"
+
+#: src/components/form/InputDate.tsx:81
+#, fuzzy, c-format
+msgid "clear"
+msgstr "Limpiar"
+
+#: src/components/form/InputDate.tsx:83
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "never"
+msgstr "nunca"
+
+#: src/components/form/InputImage.tsx:80
+#, c-format
+msgid "Image should be smaller than 1 MB"
+msgstr "La imagen debe ser mas chica que 1 MB"
+
+#: src/components/form/InputLocation.tsx:28
+#, c-format
+msgid "Country"
+msgstr "PaΓ­s"
+
+#: src/components/form/InputLocation.tsx:30
+#: src/paths/admin/create/CreatePage.tsx:99
+#: src/paths/instance/transfers/list/Table.tsx:124
+#: src/paths/instance/update/UpdatePage.tsx:118
+#, c-format
+msgid "Address"
+msgstr "DirecciΓ³n"
+
+#: src/components/form/InputLocation.tsx:34
+#, c-format
+msgid "Building number"
+msgstr "NΓΊmero de edificio"
+
+#: src/components/form/InputLocation.tsx:35
+#, c-format
+msgid "Building name"
+msgstr "Nombre de edificio"
+
+#: src/components/form/InputLocation.tsx:36
+#, c-format
+msgid "Street"
+msgstr "Calle"
+
+#: src/components/form/InputLocation.tsx:37
+#, c-format
+msgid "Post code"
+msgstr "CΓ³digo postal"
+
+#: src/components/form/InputLocation.tsx:38
+#, fuzzy, c-format
+msgid "Town location"
+msgstr "UbicaciΓ³n de ciudad"
+
+#: src/components/form/InputLocation.tsx:39
+#, c-format
+msgid "Town"
+msgstr "Ciudad"
+
+#: src/components/form/InputLocation.tsx:40
+#, c-format
+msgid "District"
+msgstr "Distrito"
+
+#: src/components/form/InputLocation.tsx:41
+#, c-format
+msgid "Country subdivision"
+msgstr "Provincia"
+
+#: src/components/form/InputSearchProduct.tsx:59
+#, fuzzy, c-format
+msgid "Product id"
+msgstr "Id de producto"
+
+#: src/components/form/InputSearchProduct.tsx:60
+#: src/components/product/ProductForm.tsx:99
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:122
+#: src/paths/instance/orders/list/Table.tsx:227
+#: src/paths/instance/products/list/Table.tsx:86
+#, c-format
+msgid "Description"
+msgstr "Descripcion"
+
+#: src/components/form/InputSearchProduct.tsx:73
+#: src/components/form/InputTaxes.tsx:81
+#: src/paths/admin/create/CreatePage.tsx:87 src/paths/admin/list/Table.tsx:110
+#: src/paths/instance/details/DetailPage.tsx:76
+#: src/paths/instance/update/UpdatePage.tsx:106
+#, c-format
+msgid "Name"
+msgstr "Nombre"
+
+#: src/components/form/InputSearchProduct.tsx:102
+#, c-format
+msgid "loading..."
+msgstr "Cargando..."
+
+#: src/components/form/InputSearchProduct.tsx:108
+#, c-format
+msgid "no products found"
+msgstr "No se encontraron productos"
+
+#: src/components/form/InputSearchProduct.tsx:116
+#, c-format
+msgid "no results"
+msgstr "Sin resultados"
+
+#: src/components/form/InputSecured.tsx:33
+#, c-format
+msgid "Deleting"
+msgstr "Borrando"
+
+#: src/components/form/InputSecured.tsx:34
+#, c-format
+msgid "Changing"
+msgstr "Cambiando"
+
+#: src/components/form/InputSecured.tsx:60
+#, c-format
+msgid "Manage token"
+msgstr "Administrar token"
+
+#: src/components/form/InputSecured.tsx:83
+#, c-format
+msgid "Update"
+msgstr "Actualizar"
+
+#: src/components/form/InputSecured.tsx:100
+#: src/paths/instance/orders/create/CreatePage.tsx:252
+#: src/paths/instance/orders/create/CreatePage.tsx:273
+#, c-format
+msgid "Remove"
+msgstr "Eliminar"
+
+#: src/components/form/InputSecured.tsx:106 src/components/modal/index.tsx:52
+#: src/components/modal/index.tsx:73 src/paths/admin/create/CreatePage.tsx:114
+#: src/paths/instance/orders/create/CreatePage.tsx:324
+#: src/paths/instance/products/create/CreatePage.tsx:50
+#: src/paths/instance/products/list/Table.tsx:166
+#: src/paths/instance/products/list/Table.tsx:218
+#: src/paths/instance/products/update/UpdatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:88
+#: src/paths/instance/update/UpdatePage.tsx:133
+#, c-format
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/components/form/InputStock.tsx:91
+#, c-format
+msgid "Manage stock"
+msgstr "Administrar stock"
+
+#: src/components/form/InputStock.tsx:93
+#, c-format
+msgid "Infinite"
+msgstr "Inifinito"
+
+#: src/components/form/InputStock.tsx:105
+#, fuzzy, c-format
+msgid "lost cannot be greater that current + incoming (max %1$s)"
+msgstr "no puede ser mayor al stock actual %1$s"
+
+#: src/components/form/InputStock.tsx:111
+#, c-format
+msgid "current stock will change from %1$s to %2$s"
+msgstr "stock actual cambiarΓ‘ desde %1$s a %2$s"
+
+#: src/components/form/InputStock.tsx:112
+#, c-format
+msgid "current stock will stay at %1$s"
+msgstr "stock actual seguirΓ‘ en %1$s"
+
+#: src/components/form/InputStock.tsx:129
+#: src/paths/instance/products/list/Table.tsx:204
+#, c-format
+msgid "Incoming"
+msgstr "Ingresando"
+
+#: src/components/form/InputStock.tsx:130
+#: src/paths/instance/products/list/Table.tsx:205
+#, c-format
+msgid "Lost"
+msgstr "Perdido"
+
+#: src/components/form/InputStock.tsx:142
+#, c-format
+msgid "Current"
+msgstr "Actual"
+
+#: src/components/form/InputStock.tsx:145
+#, c-format
+msgid "without stock"
+msgstr "sin stock"
+
+#: src/components/form/InputStock.tsx:150
+#, c-format
+msgid "Next restock"
+msgstr "PrΓ³ximo reabastecimiento"
+
+#: src/components/form/InputStock.tsx:152
+#, c-format
+msgid "Delivery address"
+msgstr "DirecciΓ³n de entrega"
+
+#: src/components/form/InputTaxes.tsx:73
+#, c-format
+msgid "this product has no taxes"
+msgstr "este producto no tiene impuestos"
+
+#: src/components/form/InputTaxes.tsx:77
+#: src/paths/instance/orders/details/DetailPage.tsx:145
+#: src/paths/instance/orders/details/DetailPage.tsx:296
+#: src/paths/instance/orders/list/Table.tsx:116
+#: src/paths/instance/transfers/create/CreatePage.tsx:84
+#, c-format
+msgid "Amount"
+msgstr "Monto"
+
+#: src/components/form/InputTaxes.tsx:78
+#, c-format
+msgid "currency and value separated with colon"
+msgstr "Moneda y valor separado por dos puntos"
+
+#: src/components/form/InputTaxes.tsx:84
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:78
+#, c-format
+msgid "Add"
+msgstr "Agregar"
+
+#: src/components/menu/SideBar.tsx:53
+#, c-format
+msgid "Instance"
+msgstr "Instancia"
+
+#: src/components/menu/SideBar.tsx:59
+#, c-format
+msgid "Settings"
+msgstr "ConfiguraciΓ³n"
+
+#: src/components/menu/SideBar.tsx:65
+#: src/paths/instance/orders/list/Table.tsx:60
+#, fuzzy, c-format
+msgid "Orders"
+msgstr "Ordenes"
+
+#: src/components/menu/SideBar.tsx:71
+#: src/paths/instance/orders/create/CreatePage.tsx:258
+#: src/paths/instance/products/list/Table.tsx:48
+#, c-format
+msgid "Products"
+msgstr "Productos"
+
+#: src/components/menu/SideBar.tsx:77
+#: src/paths/instance/transfers/list/Table.tsx:65
+#, c-format
+msgid "Transfers"
+msgstr "Transferencias"
+
+#: src/components/menu/SideBar.tsx:87
+#, fuzzy, c-format
+msgid "Connection"
+msgstr "ConexiΓ³n"
+
+#: src/components/menu/SideBar.tsx:112 src/paths/admin/list/Table.tsx:57
+#, c-format
+msgid "Instances"
+msgstr "Instancias"
+
+#: src/components/menu/SideBar.tsx:116
+#, fuzzy, c-format
+msgid "New"
+msgstr "Nuevo"
+
+#: src/components/menu/SideBar.tsx:122
+#, c-format
+msgid "List"
+msgstr "Lista"
+
+#: src/components/menu/SideBar.tsx:129
+#, c-format
+msgid "Log out"
+msgstr "Salir"
+
+#: src/components/modal/index.tsx:74
+#, c-format
+msgid "Clear"
+msgstr "Limpiar"
+
+#: src/components/modal/index.tsx:110 src/components/modal/index.tsx:111
+#, c-format
+msgid "should be the same"
+msgstr "deberΓ­an ser iguales"
+
+#: src/components/modal/index.tsx:111
+#, c-format
+msgid "cannot be the same as before"
+msgstr "no puede ser igual al anterior"
+
+#: src/components/modal/index.tsx:114
+#, c-format
+msgid ""
+"You are updating the authorization token from instance %1$s with id %2$s"
+msgstr ""
+"EstΓ‘ actualizando el token de autorizaciΓ³n para la instancia %1$s con id %2$s"
+
+#: src/components/modal/index.tsx:124
+#, c-format
+msgid "Old token"
+msgstr "Viejo token"
+
+#: src/components/modal/index.tsx:125
+#, c-format
+msgid "New token"
+msgstr "Nuevo token"
+
+#: src/components/modal/index.tsx:127
+#, c-format
+msgid "Clearing the auth token will mean public access to the instance"
+msgstr ""
+"Limpiar el token de autorizaciΓ³n significa acceso publico a la instancia"
+
+#: src/components/product/ProductForm.tsx:96
+#: src/paths/admin/create/CreatePage.tsx:85 src/paths/admin/list/Table.tsx:109
+#: src/paths/instance/transfers/list/Table.tsx:122
+#, c-format
+msgid "ID"
+msgstr "ID"
+
+#: src/components/product/ProductForm.tsx:98
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:121
+#: src/paths/instance/products/list/Table.tsx:85
+#, c-format
+msgid "Image"
+msgstr "Imagen"
+
+#: src/components/product/ProductForm.tsx:100
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:123
+#, c-format
+msgid "Unit"
+msgstr "Unidad"
+
+#: src/components/product/ProductForm.tsx:101
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:124
+#: src/paths/instance/products/list/Table.tsx:162
+#: src/paths/instance/products/list/Table.tsx:214
+#, c-format
+msgid "Price"
+msgstr "Precio"
+
+#: src/components/product/ProductForm.tsx:103
+#: src/paths/instance/products/list/Table.tsx:90
+#, c-format
+msgid "Stock"
+msgstr "Stock"
+
+#: src/components/product/ProductForm.tsx:105
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:128
+#: src/paths/instance/products/list/Table.tsx:88
+#, c-format
+msgid "Taxes"
+msgstr "Impuesto"
+
+#: src/index.tsx:75
+#, c-format
+msgid "Server not found"
+msgstr "Servidor no encontrado"
+
+#: src/index.tsx:85
+#, c-format
+msgid "Couldn't access the server"
+msgstr "No se pudo aceder al servidor"
+
+#: src/index.tsx:87 src/index.tsx:99
+#, c-format
+msgid "Got message %1$s from %2$s"
+msgstr "Recivimos el mensaje %1$s desde %2$s"
+
+#: src/index.tsx:97
+#, c-format
+msgid "Unexpected Error"
+msgstr "Error inesperado"
+
+#: src/paths/admin/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:108
+#, c-format
+msgid "Auth token"
+msgstr "Token de autorizaciΓ³n"
+
+#: src/paths/admin/create/CreatePage.tsx:91
+#: src/paths/instance/details/DetailPage.tsx:77
+#: src/paths/instance/update/UpdatePage.tsx:110
+#, c-format
+msgid "Account address"
+msgstr "DirecciΓ³n de cuenta"
+
+#: src/paths/admin/create/CreatePage.tsx:93
+#: src/paths/instance/update/UpdatePage.tsx:112
+#, c-format
+msgid "Default max deposit fee"
+msgstr "Impuesto mΓ‘ximo de deposito por omisiΓ³n"
+
+#: src/paths/admin/create/CreatePage.tsx:95
+#: src/paths/instance/update/UpdatePage.tsx:114
+#, c-format
+msgid "Default max wire fee"
+msgstr "Impuesto mΓ‘ximo de transferencia por omisiΓ³n"
+
+#: src/paths/admin/create/CreatePage.tsx:97
+#: src/paths/instance/update/UpdatePage.tsx:116
+#, c-format
+msgid "Default wire fee amortization"
+msgstr "AmortizaciΓ³n de impuesto de transferencia por omisiΓ³n"
+
+#: src/paths/admin/create/CreatePage.tsx:103
+#: src/paths/instance/update/UpdatePage.tsx:122
+#, c-format
+msgid "Jurisdiction"
+msgstr "JurisdicciΓ³n"
+
+#: src/paths/admin/create/CreatePage.tsx:107
+#: src/paths/instance/update/UpdatePage.tsx:126
+#, c-format
+msgid "Default pay delay"
+msgstr "Retrazo de pago por omisiΓ³n"
+
+#: src/paths/admin/create/CreatePage.tsx:109
+#: src/paths/instance/update/UpdatePage.tsx:128
+#, c-format
+msgid "Default wire transfer delay"
+msgstr "Retrazo de transferencia por omisiΓ³n"
+
+#: src/paths/admin/create/index.tsx:58
+#, c-format
+msgid "could not create instance"
+msgstr "no se pudo crear la instancia"
+
+#: src/paths/admin/list/Table.tsx:63 src/paths/admin/list/Table.tsx:131
+#: src/paths/instance/transfers/list/Table.tsx:71
+#, fuzzy, c-format
+msgid "Delete"
+msgstr "Borrando"
+
+#: src/paths/admin/list/Table.tsx:128
+#, c-format
+msgid "Edit"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:149
+#: src/paths/instance/products/list/Table.tsx:245
+#, c-format
+msgid "There is no instances yet, add more pressing the + sign"
+msgstr "No hay instancias todavΓ­an, agregue mas presionando el signo +"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:237
+#, c-format
+msgid "Inventory products"
+msgstr "Productos de inventario"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:286
+#, c-format
+msgid "Total price"
+msgstr "Precio total"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:287
+#, c-format
+msgid "Total tax"
+msgstr "Impuesto total"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:289
+#: src/paths/instance/orders/create/CreatePage.tsx:297
+#, c-format
+msgid "Order price"
+msgstr "Precio de la orden"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:295
+#, fuzzy, c-format
+msgid "Net"
+msgstr "Neto"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:300
+#: src/paths/instance/orders/details/DetailPage.tsx:144
+#: src/paths/instance/orders/details/DetailPage.tsx:295
+#: src/paths/instance/orders/list/Table.tsx:117
+#, c-format
+msgid "Summary"
+msgstr "Resumen"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:302
+#, c-format
+msgid "Payments options"
+msgstr "Opciones de pago"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:303
+#, c-format
+msgid "Auto refund deadline"
+msgstr "Plazo de reembolso automΓ‘tico"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:304
+#, c-format
+msgid "Refund deadline"
+msgstr "Plazo de reembolso"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:305
+#, c-format
+msgid "Pay deadline"
+msgstr "Plazo de pago"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:307
+#, c-format
+msgid "Delivery date"
+msgstr "Fecha de entrega"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:308
+#, fuzzy, c-format
+msgid "Location"
+msgstr "UbicaciΓ³n"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:312
+#, c-format
+msgid "Max fee"
+msgstr "Impuesto mΓ‘ximo"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:313
+#, c-format
+msgid "Max wire fee"
+msgstr "Impuesto de transferencia mΓ‘ximo"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:314
+#, c-format
+msgid "Wire fee amortization"
+msgstr "AmortizaciΓ³n de impuesto de transferencia"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:315
+#, c-format
+msgid "Fullfilment url"
+msgstr "URL de completitud"
+
+#: src/paths/instance/orders/create/CreatePage.tsx:318
+#, c-format
+msgid "Extra information"
+msgstr "InformaciΓ³n extra"
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:44
+#, c-format
+msgid "select a product first"
+msgstr "seleccione un producto primero"
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:51
+#, fuzzy, c-format
+msgid "should be greater than 0"
+msgstr "La imagen debe ser mas chica que 1 MB"
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:58
+#, c-format
+msgid ""
+"cannot be greater than current stock and quantity previously added. max: %1$s"
+msgstr ""
+"no puede ser mayor al stock actual y la cantidad previamente agregada. "
+"mΓ‘ximo: %1$s"
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:64
+#, c-format
+msgid "cannot be greater than current stock %1$s"
+msgstr "no puede ser mayor al stock actual %1$s"
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:76
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:126
+#, c-format
+msgid "Quantity"
+msgstr "Cantidad"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:92
+#: src/paths/instance/orders/details/DetailPage.tsx:235
+#: src/paths/instance/orders/details/DetailPage.tsx:333
+#, c-format
+msgid "Order"
+msgstr "Orden"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:93
+#, c-format
+msgid "claimed"
+msgstr "reclamado"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:110
+#: src/paths/instance/orders/details/DetailPage.tsx:261
+#: src/paths/instance/orders/list/Table.tsx:136
+#, c-format
+msgid "copy url"
+msgstr "copiar url"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:126
+#: src/paths/instance/orders/details/DetailPage.tsx:349
+#, c-format
+msgid "pay at"
+msgstr "pagar en"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:127
+#: src/paths/instance/orders/details/DetailPage.tsx:350
+#, c-format
+msgid "created at"
+msgstr "creado"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:138
+#: src/paths/instance/orders/details/DetailPage.tsx:289
+#, c-format
+msgid "Timeline"
+msgstr "CronologΓ­a"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:142
+#: src/paths/instance/orders/details/DetailPage.tsx:293
+#, c-format
+msgid "Payment details"
+msgstr "Detalles de pago"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:146
+#: src/paths/instance/orders/details/DetailPage.tsx:299
+#: src/paths/instance/orders/details/DetailPage.tsx:363
+#, fuzzy, c-format
+msgid "Order status"
+msgstr "Estado de orden"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:156
+#: src/paths/instance/orders/details/DetailPage.tsx:308
+#, fuzzy, c-format
+msgid "Product list"
+msgstr "Lista de producto"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:236
+#, c-format
+msgid "paid"
+msgstr "pagados"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:238
+#, c-format
+msgid "wired"
+msgstr "transferido"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:241
+#, c-format
+msgid "refunded"
+msgstr "reembolzado"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:258
+#, c-format
+msgid "refund"
+msgstr "reembolzar"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:297
+#, c-format
+msgid "Refunded amount"
+msgstr "Monto reembolzado"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:298
+#, c-format
+msgid "Deposit total"
+msgstr "Total depositado"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:336
+#, c-format
+msgid "unpaid"
+msgstr "impago"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:364
+#, c-format
+msgid "Order status URL"
+msgstr "URL de estado de orden"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:365
+#, c-format
+msgid "Pay URI"
+msgstr "URI de pago"
+
+#: src/paths/instance/orders/details/DetailPage.tsx:383
+#, c-format
+msgid ""
+"Unknown order status. This is an error, please contact the administrator."
+msgstr ""
+"Estado de orden desconocido. Esto es un error, por favor contacte a su "
+"administrador"
+
+#: src/paths/instance/orders/details/index.tsx:56
+#: src/paths/instance/orders/list/index.tsx:147
+#, c-format
+msgid "refund created successfully"
+msgstr "reembolzo creado satisfactoriamente"
+
+#: src/paths/instance/orders/details/index.tsx:59
+#: src/paths/instance/orders/list/index.tsx:150
+#, fuzzy, c-format
+msgid "could not create the refund"
+msgstr "No se pudo aceder al servidor"
+
+#: src/paths/instance/orders/list/Table.tsx:111
+#, c-format
+msgid "load newer orders"
+msgstr "cargar nuevas ordenes"
+
+#: src/paths/instance/orders/list/Table.tsx:115
+#, c-format
+msgid "Date"
+msgstr "Fecha"
+
+#: src/paths/instance/orders/list/Table.tsx:131
+#: src/paths/instance/orders/list/Table.tsx:223
+#, c-format
+msgid "Refund"
+msgstr "Reembolzar"
+
+#: src/paths/instance/orders/list/Table.tsx:145
+#, c-format
+msgid "load older orders"
+msgstr "cargar viejas ordenes"
+
+#: src/paths/instance/orders/list/Table.tsx:154
+#, c-format
+msgid "No orders has been found"
+msgstr "No se enconraron ordenes"
+
+#: src/paths/instance/orders/list/Table.tsx:202
+#, c-format
+msgid "date"
+msgstr "fecha"
+
+#: src/paths/instance/orders/list/Table.tsx:203
+#, c-format
+msgid "amount"
+msgstr "monto"
+
+#: src/paths/instance/orders/list/Table.tsx:204
+#, c-format
+msgid "reason"
+msgstr "razΓ³n"
+
+#: src/paths/instance/orders/list/Table.tsx:224
+#, c-format
+msgid "Max refundable:"
+msgstr "MΓ‘ximo reembolzable:"
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "Reason"
+msgstr "RazΓ³n"
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "duplicated"
+msgstr "duplicado"
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "requested by the customer"
+msgstr "pedido por el consumidor"
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "other"
+msgstr "otro"
+
+#: src/paths/instance/orders/list/index.tsx:91
+#, c-format
+msgid "go to order id"
+msgstr "ir a id de orden"
+
+#: src/paths/instance/orders/list/index.tsx:107
+#, c-format
+msgid "Paid"
+msgstr "Pagado"
+
+#: src/paths/instance/orders/list/index.tsx:108
+#, fuzzy, c-format
+msgid "Refunded"
+msgstr "Reembolzado"
+
+#: src/paths/instance/orders/list/index.tsx:109
+#, fuzzy, c-format
+msgid "Not wired"
+msgstr "No transferido"
+
+#: src/paths/instance/orders/list/index.tsx:110
+#, c-format
+msgid "All"
+msgstr "Todo"
+
+#: src/paths/instance/products/create/index.tsx:48
+#: src/paths/instance/products/update/index.tsx:64
+#, c-format
+msgid "could not create product"
+msgstr "no se pudo crear el producto"
+
+#: src/paths/instance/products/list/Table.tsx:87
+#, c-format
+msgid "Sell"
+msgstr "Venta"
+
+#: src/paths/instance/products/list/Table.tsx:89
+#, c-format
+msgid "Profit"
+msgstr "Ganancia"
+
+#: src/paths/instance/products/list/Table.tsx:91
+#, c-format
+msgid "Sold"
+msgstr "Vendido"
+
+#: src/paths/instance/products/list/index.tsx:59
+#, c-format
+msgid "product updated successfully"
+msgstr "producto actualizado correctamente"
+
+#: src/paths/instance/products/list/index.tsx:62
+#, c-format
+msgid "could not update the product"
+msgstr "no se pudo actualizar el producto"
+
+#: src/paths/instance/products/list/index.tsx:70
+#, c-format
+msgid "product delete successfully"
+msgstr "producto fue eliminado correctamente"
+
+#: src/paths/instance/products/list/index.tsx:73
+#, c-format
+msgid "could not delete the product"
+msgstr "no se pudo eliminar el producto"
+
+#: src/paths/instance/tips/list/Table.tsx:59
+#, c-format
+msgid "Tips"
+msgstr "Propinas"
+
+#: src/paths/instance/tips/list/Table.tsx:111
+#, c-format
+msgid "Committed amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:112
+#, c-format
+msgid "Exchange initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:113
+#, c-format
+msgid "Merchant initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:148
+#, c-format
+msgid "There is no tips yet, add more pressing the + sign"
+msgstr "No hay propinas todavΓ­a, agregar mas presionando el signo +"
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:50
+#: src/paths/instance/transfers/create/CreatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:56
+#, c-format
+msgid "cannot be empty"
+msgstr "no puede ser vacΓ­o"
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:51
+#, c-format
+msgid "check the id, doest look valid"
+msgstr "verificar el id, no parece vΓ‘lido"
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:52
+#, c-format
+msgid "should have 52 characters, current %1$s"
+msgstr "deberΓ­a tener 52 caracteres, actualmente %1$s"
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:57
+#, c-format
+msgid "URL doesn't have the right format"
+msgstr "La URL no tiene el formato correcto"
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:74
+#, fuzzy, c-format
+msgid "Transfer ID"
+msgstr "Transferencias"
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:76
+#, fuzzy, c-format
+msgid "Account Address"
+msgstr "DirecciΓ³n de cuenta"
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:82
+#: src/paths/instance/transfers/list/Table.tsx:125
+#, c-format
+msgid "Exchange URL"
+msgstr "URL del Exchange"
+
+#: src/paths/instance/transfers/create/index.tsx:49
+#, fuzzy, c-format
+msgid "could not inform transfer"
+msgstr "no se pudo crear la instancia"
+
+#: src/paths/instance/transfers/list/Table.tsx:118
+#, fuzzy, c-format
+msgid "load newer transfers"
+msgstr "cargar nuevas ordenes"
+
+#: src/paths/instance/transfers/list/Table.tsx:123
+#, c-format
+msgid "Credit"
+msgstr "CrΓ©dito"
+
+#: src/paths/instance/transfers/list/Table.tsx:126
+#, fuzzy, c-format
+msgid "Confirmed"
+msgstr "Confirmar"
+
+#: src/paths/instance/transfers/list/Table.tsx:127
+#: src/paths/instance/transfers/list/index.tsx:60
+#, c-format
+msgid "Verified"
+msgstr "Verificado"
+
+#: src/paths/instance/transfers/list/Table.tsx:128
+#, fuzzy, c-format
+msgid "Executed at"
+msgstr "creado"
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "yes"
+msgstr "si"
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "no"
+msgstr "no"
+
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "unknown"
+msgstr "desconocido"
+
+#: src/paths/instance/transfers/list/Table.tsx:145
+#, fuzzy, c-format
+msgid "load older transfers"
+msgstr "cargar viejas transferencias"
+
+#: src/paths/instance/transfers/list/Table.tsx:154
+#, c-format
+msgid "There is no transfer yet, add more pressing the + sign"
+msgstr "No hay transferencias todavΓ­a, agregar mas presionando el signo +"
diff --git a/packages/backend/src/i18n/fr.po b/packages/backend/src/i18n/fr.po
new file mode 100644
index 0000000..6b35bd0
--- /dev/null
+++ b/packages/backend/src/i18n/fr.po
@@ -0,0 +1,1057 @@
+# This file is part of TALER
+# (C) 2016 GNUnet e.V.
+#
+# 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.
+#
+# 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
+# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Taler Wallet\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-11-23 00:00+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/ApplicationReadyRoutes.tsx:50 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:299
+#, c-format
+msgid "Access denied"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:51 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:300
+#, c-format
+msgid "Check your token is valid"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:72
+#, c-format
+msgid "Couldn't access the server."
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:73
+#, c-format
+msgid "Could not infer instance id from url %1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:109
+#, c-format
+msgid "HTTP status #%1$s: Server reported a problem"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:110
+#, c-format
+msgid "Got message: \"%1$s\" from: %2$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:127
+#, c-format
+msgid "No default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:128
+#, c-format
+msgid ""
+"in order to use merchant backoffice, you should create the default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:288
+#, c-format
+msgid "Server reported a problem: HTTP status #%1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:289
+#, c-format
+msgid "Got message: %1$s from: %2$s"
+msgstr ""
+
+#: src/components/exception/login.tsx:46
+#, c-format
+msgid "Login required"
+msgstr ""
+
+#: src/components/exception/login.tsx:49
+#, c-format
+msgid ""
+"Please enter your auth token. Token should have \"secret-token:\" and start "
+"with Bearer or ApiKey"
+msgstr ""
+
+#: src/components/exception/login.tsx:86 src/components/modal/index.tsx:53
+#: src/components/modal/index.tsx:75 src/paths/admin/create/CreatePage.tsx:115
+#: src/paths/instance/orders/create/CreatePage.tsx:325
+#: src/paths/instance/products/create/CreatePage.tsx:51
+#: src/paths/instance/products/list/Table.tsx:174
+#: src/paths/instance/products/list/Table.tsx:228
+#: src/paths/instance/products/update/UpdatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:134
+#, c-format
+msgid "Confirm"
+msgstr ""
+
+#: src/components/form/InputArray.tsx:72
+#, c-format
+msgid "The value %1$s is invalid for a payment url"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:67
+#: src/paths/instance/orders/list/index.tsx:123
+#, c-format
+msgid "pick a date"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:81
+#, c-format
+msgid "clear"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:83
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "never"
+msgstr ""
+
+#: src/components/form/InputImage.tsx:80
+#, c-format
+msgid "Image should be smaller than 1 MB"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:28
+#, c-format
+msgid "Country"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:30
+#: src/paths/admin/create/CreatePage.tsx:99
+#: src/paths/instance/transfers/list/Table.tsx:124
+#: src/paths/instance/update/UpdatePage.tsx:118
+#, c-format
+msgid "Address"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:34
+#, c-format
+msgid "Building number"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:35
+#, c-format
+msgid "Building name"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:36
+#, c-format
+msgid "Street"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:37
+#, c-format
+msgid "Post code"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:38
+#, c-format
+msgid "Town location"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:39
+#, c-format
+msgid "Town"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:40
+#, c-format
+msgid "District"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:41
+#, c-format
+msgid "Country subdivision"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:59
+#, c-format
+msgid "Product id"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:60
+#: src/components/product/ProductForm.tsx:99
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:122
+#: src/paths/instance/orders/list/Table.tsx:227
+#: src/paths/instance/products/list/Table.tsx:86
+#, c-format
+msgid "Description"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:73
+#: src/components/form/InputTaxes.tsx:81
+#: src/paths/admin/create/CreatePage.tsx:87 src/paths/admin/list/Table.tsx:110
+#: src/paths/instance/details/DetailPage.tsx:76
+#: src/paths/instance/update/UpdatePage.tsx:106
+#, c-format
+msgid "Name"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:102
+#, c-format
+msgid "loading..."
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:108
+#, c-format
+msgid "no products found"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:116
+#, c-format
+msgid "no results"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:33
+#, c-format
+msgid "Deleting"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:34
+#, c-format
+msgid "Changing"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:60
+#, c-format
+msgid "Manage token"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:83
+#, c-format
+msgid "Update"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:100
+#: src/paths/instance/orders/create/CreatePage.tsx:252
+#: src/paths/instance/orders/create/CreatePage.tsx:273
+#, c-format
+msgid "Remove"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:106 src/components/modal/index.tsx:52
+#: src/components/modal/index.tsx:73 src/paths/admin/create/CreatePage.tsx:114
+#: src/paths/instance/orders/create/CreatePage.tsx:324
+#: src/paths/instance/products/create/CreatePage.tsx:50
+#: src/paths/instance/products/list/Table.tsx:166
+#: src/paths/instance/products/list/Table.tsx:218
+#: src/paths/instance/products/update/UpdatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:88
+#: src/paths/instance/update/UpdatePage.tsx:133
+#, c-format
+msgid "Cancel"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:91
+#, c-format
+msgid "Manage stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:93
+#, c-format
+msgid "Infinite"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:105
+#, c-format
+msgid "lost cannot be greater that current + incoming (max %1$s)"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:111
+#, c-format
+msgid "current stock will change from %1$s to %2$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:112
+#, c-format
+msgid "current stock will stay at %1$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:129
+#: src/paths/instance/products/list/Table.tsx:204
+#, c-format
+msgid "Incoming"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:130
+#: src/paths/instance/products/list/Table.tsx:205
+#, c-format
+msgid "Lost"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:142
+#, c-format
+msgid "Current"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:145
+#, c-format
+msgid "without stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:150
+#, c-format
+msgid "Next restock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:152
+#, c-format
+msgid "Delivery address"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:73
+#, c-format
+msgid "this product has no taxes"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:77
+#: src/paths/instance/orders/details/DetailPage.tsx:145
+#: src/paths/instance/orders/details/DetailPage.tsx:296
+#: src/paths/instance/orders/list/Table.tsx:116
+#: src/paths/instance/transfers/create/CreatePage.tsx:84
+#, c-format
+msgid "Amount"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:78
+#, c-format
+msgid "currency and value separated with colon"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:84
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:78
+#, c-format
+msgid "Add"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:53
+#, c-format
+msgid "Instance"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:59
+#, c-format
+msgid "Settings"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:65
+#: src/paths/instance/orders/list/Table.tsx:60
+#, c-format
+msgid "Orders"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:71
+#: src/paths/instance/orders/create/CreatePage.tsx:258
+#: src/paths/instance/products/list/Table.tsx:48
+#, c-format
+msgid "Products"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:77
+#: src/paths/instance/transfers/list/Table.tsx:65
+#, c-format
+msgid "Transfers"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:87
+#, c-format
+msgid "Connection"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:112 src/paths/admin/list/Table.tsx:57
+#, c-format
+msgid "Instances"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:116
+#, c-format
+msgid "New"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:122
+#, c-format
+msgid "List"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:129
+#, c-format
+msgid "Log out"
+msgstr ""
+
+#: src/components/modal/index.tsx:74
+#, c-format
+msgid "Clear"
+msgstr ""
+
+#: src/components/modal/index.tsx:110 src/components/modal/index.tsx:111
+#, c-format
+msgid "should be the same"
+msgstr ""
+
+#: src/components/modal/index.tsx:111
+#, c-format
+msgid "cannot be the same as before"
+msgstr ""
+
+#: src/components/modal/index.tsx:114
+#, c-format
+msgid ""
+"You are updating the authorization token from instance %1$s with id %2$s"
+msgstr ""
+
+#: src/components/modal/index.tsx:124
+#, c-format
+msgid "Old token"
+msgstr ""
+
+#: src/components/modal/index.tsx:125
+#, c-format
+msgid "New token"
+msgstr ""
+
+#: src/components/modal/index.tsx:127
+#, c-format
+msgid "Clearing the auth token will mean public access to the instance"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:96
+#: src/paths/admin/create/CreatePage.tsx:85 src/paths/admin/list/Table.tsx:109
+#: src/paths/instance/transfers/list/Table.tsx:122
+#, c-format
+msgid "ID"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:98
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:121
+#: src/paths/instance/products/list/Table.tsx:85
+#, c-format
+msgid "Image"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:100
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:123
+#, c-format
+msgid "Unit"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:101
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:124
+#: src/paths/instance/products/list/Table.tsx:162
+#: src/paths/instance/products/list/Table.tsx:214
+#, c-format
+msgid "Price"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:103
+#: src/paths/instance/products/list/Table.tsx:90
+#, c-format
+msgid "Stock"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:105
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:128
+#: src/paths/instance/products/list/Table.tsx:88
+#, c-format
+msgid "Taxes"
+msgstr ""
+
+#: src/index.tsx:75
+#, c-format
+msgid "Server not found"
+msgstr ""
+
+#: src/index.tsx:85
+#, c-format
+msgid "Couldn't access the server"
+msgstr ""
+
+#: src/index.tsx:87 src/index.tsx:99
+#, c-format
+msgid "Got message %1$s from %2$s"
+msgstr ""
+
+#: src/index.tsx:97
+#, c-format
+msgid "Unexpected Error"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:108
+#, c-format
+msgid "Auth token"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:91
+#: src/paths/instance/details/DetailPage.tsx:77
+#: src/paths/instance/update/UpdatePage.tsx:110
+#, c-format
+msgid "Account address"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:93
+#: src/paths/instance/update/UpdatePage.tsx:112
+#, c-format
+msgid "Default max deposit fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:95
+#: src/paths/instance/update/UpdatePage.tsx:114
+#, c-format
+msgid "Default max wire fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:97
+#: src/paths/instance/update/UpdatePage.tsx:116
+#, c-format
+msgid "Default wire fee amortization"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:103
+#: src/paths/instance/update/UpdatePage.tsx:122
+#, c-format
+msgid "Jurisdiction"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:107
+#: src/paths/instance/update/UpdatePage.tsx:126
+#, c-format
+msgid "Default pay delay"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:109
+#: src/paths/instance/update/UpdatePage.tsx:128
+#, c-format
+msgid "Default wire transfer delay"
+msgstr ""
+
+#: src/paths/admin/create/index.tsx:58
+#, c-format
+msgid "could not create instance"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:63 src/paths/admin/list/Table.tsx:131
+#: src/paths/instance/transfers/list/Table.tsx:71
+#, c-format
+msgid "Delete"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:128
+#, c-format
+msgid "Edit"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:149
+#: src/paths/instance/products/list/Table.tsx:245
+#, c-format
+msgid "There is no instances yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:237
+#, c-format
+msgid "Inventory products"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:286
+#, c-format
+msgid "Total price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:287
+#, c-format
+msgid "Total tax"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:289
+#: src/paths/instance/orders/create/CreatePage.tsx:297
+#, c-format
+msgid "Order price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:295
+#, c-format
+msgid "Net"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:300
+#: src/paths/instance/orders/details/DetailPage.tsx:144
+#: src/paths/instance/orders/details/DetailPage.tsx:295
+#: src/paths/instance/orders/list/Table.tsx:117
+#, c-format
+msgid "Summary"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:302
+#, c-format
+msgid "Payments options"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:303
+#, c-format
+msgid "Auto refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:304
+#, c-format
+msgid "Refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:305
+#, c-format
+msgid "Pay deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:307
+#, c-format
+msgid "Delivery date"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:308
+#, c-format
+msgid "Location"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:312
+#, c-format
+msgid "Max fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:313
+#, c-format
+msgid "Max wire fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:314
+#, c-format
+msgid "Wire fee amortization"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:315
+#, c-format
+msgid "Fullfilment url"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:318
+#, c-format
+msgid "Extra information"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:44
+#, c-format
+msgid "select a product first"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:51
+#, c-format
+msgid "should be greater than 0"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:58
+#, c-format
+msgid ""
+"cannot be greater than current stock and quantity previously added. max: %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:64
+#, c-format
+msgid "cannot be greater than current stock %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:76
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:126
+#, c-format
+msgid "Quantity"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:92
+#: src/paths/instance/orders/details/DetailPage.tsx:235
+#: src/paths/instance/orders/details/DetailPage.tsx:333
+#, c-format
+msgid "Order"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:93
+#, c-format
+msgid "claimed"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:110
+#: src/paths/instance/orders/details/DetailPage.tsx:261
+#: src/paths/instance/orders/list/Table.tsx:136
+#, c-format
+msgid "copy url"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:126
+#: src/paths/instance/orders/details/DetailPage.tsx:349
+#, c-format
+msgid "pay at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:127
+#: src/paths/instance/orders/details/DetailPage.tsx:350
+#, c-format
+msgid "created at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:138
+#: src/paths/instance/orders/details/DetailPage.tsx:289
+#, c-format
+msgid "Timeline"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:142
+#: src/paths/instance/orders/details/DetailPage.tsx:293
+#, c-format
+msgid "Payment details"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:146
+#: src/paths/instance/orders/details/DetailPage.tsx:299
+#: src/paths/instance/orders/details/DetailPage.tsx:363
+#, c-format
+msgid "Order status"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:156
+#: src/paths/instance/orders/details/DetailPage.tsx:308
+#, c-format
+msgid "Product list"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:236
+#, c-format
+msgid "paid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:238
+#, c-format
+msgid "wired"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:241
+#, c-format
+msgid "refunded"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:258
+#, c-format
+msgid "refund"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:297
+#, c-format
+msgid "Refunded amount"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:298
+#, c-format
+msgid "Deposit total"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:336
+#, c-format
+msgid "unpaid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:364
+#, c-format
+msgid "Order status URL"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:365
+#, c-format
+msgid "Pay URI"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:383
+#, c-format
+msgid ""
+"Unknown order status. This is an error, please contact the administrator."
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:56
+#: src/paths/instance/orders/list/index.tsx:147
+#, c-format
+msgid "refund created successfully"
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:59
+#: src/paths/instance/orders/list/index.tsx:150
+#, c-format
+msgid "could not create the refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:111
+#, c-format
+msgid "load newer orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:115
+#, c-format
+msgid "Date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:131
+#: src/paths/instance/orders/list/Table.tsx:223
+#, c-format
+msgid "Refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:145
+#, c-format
+msgid "load older orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:154
+#, c-format
+msgid "No orders has been found"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:202
+#, c-format
+msgid "date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:203
+#, c-format
+msgid "amount"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:204
+#, c-format
+msgid "reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:224
+#, c-format
+msgid "Max refundable:"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "Reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "duplicated"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "requested by the customer"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "other"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:91
+#, c-format
+msgid "go to order id"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:107
+#, c-format
+msgid "Paid"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:108
+#, c-format
+msgid "Refunded"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:109
+#, c-format
+msgid "Not wired"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:110
+#, c-format
+msgid "All"
+msgstr ""
+
+#: src/paths/instance/products/create/index.tsx:48
+#: src/paths/instance/products/update/index.tsx:64
+#, c-format
+msgid "could not create product"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:87
+#, c-format
+msgid "Sell"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:89
+#, c-format
+msgid "Profit"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:91
+#, c-format
+msgid "Sold"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:59
+#, c-format
+msgid "product updated successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:62
+#, c-format
+msgid "could not update the product"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:70
+#, c-format
+msgid "product delete successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:73
+#, c-format
+msgid "could not delete the product"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:59
+#, c-format
+msgid "Tips"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:111
+#, c-format
+msgid "Committed amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:112
+#, c-format
+msgid "Exchange initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:113
+#, c-format
+msgid "Merchant initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:148
+#, c-format
+msgid "There is no tips yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:50
+#: src/paths/instance/transfers/create/CreatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:56
+#, c-format
+msgid "cannot be empty"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:51
+#, c-format
+msgid "check the id, doest look valid"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:52
+#, c-format
+msgid "should have 52 characters, current %1$s"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:57
+#, c-format
+msgid "URL doesn't have the right format"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:74
+#, c-format
+msgid "Transfer ID"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:76
+#, c-format
+msgid "Account Address"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:82
+#: src/paths/instance/transfers/list/Table.tsx:125
+#, c-format
+msgid "Exchange URL"
+msgstr ""
+
+#: src/paths/instance/transfers/create/index.tsx:49
+#, c-format
+msgid "could not inform transfer"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:118
+#, c-format
+msgid "load newer transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:123
+#, c-format
+msgid "Credit"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:126
+#, c-format
+msgid "Confirmed"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:127
+#: src/paths/instance/transfers/list/index.tsx:60
+#, c-format
+msgid "Verified"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:128
+#, c-format
+msgid "Executed at"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "yes"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "no"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "unknown"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:145
+#, c-format
+msgid "load older transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:154
+#, c-format
+msgid "There is no transfer yet, add more pressing the + sign"
+msgstr ""
diff --git a/packages/backend/src/i18n/index.tsx b/packages/backend/src/i18n/index.tsx
new file mode 100644
index 0000000..63c8e19
--- /dev/null
+++ b/packages/backend/src/i18n/index.tsx
@@ -0,0 +1,203 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+ * Translation helpers for React components and template literals.
+ */
+
+/**
+ * Imports
+ */
+import { ComponentChild, ComponentChildren, h, Fragment, VNode } from "preact";
+
+import { useTranslationContext } from "../context/translation";
+
+export function useTranslator() {
+ const ctx = useTranslationContext();
+ const jed = ctx.handler
+ return function str(stringSeq: TemplateStringsArray, ...values: any[]): string {
+ const s = toI18nString(stringSeq);
+ if (!s) return s
+ const tr = jed
+ .translate(s)
+ .ifPlural(1, s)
+ .fetch(...values);
+ return tr;
+ }
+}
+
+
+/**
+ * Convert template strings to a msgid
+ */
+ function toI18nString(stringSeq: ReadonlyArray<string>): string {
+ let s = "";
+ for (let i = 0; i < stringSeq.length; i++) {
+ s += stringSeq[i];
+ if (i < stringSeq.length - 1) {
+ s += `%${i + 1}$s`;
+ }
+ }
+ return s;
+}
+
+
+interface TranslateSwitchProps {
+ target: number;
+ children: ComponentChildren;
+}
+
+function stringifyChildren(children: ComponentChildren): string {
+ let n = 1;
+ const ss = (children instanceof Array ? children : [children]).map((c) => {
+ if (typeof c === "string") {
+ return c;
+ }
+ return `%${n++}$s`;
+ });
+ const s = ss.join("").replace(/ +/g, " ").trim();
+ return s;
+}
+
+interface TranslateProps {
+ children: ComponentChildren;
+ /**
+ * Component that the translated element should be wrapped in.
+ * Defaults to "div".
+ */
+ wrap?: any;
+
+ /**
+ * Props to give to the wrapped component.
+ */
+ wrapProps?: any;
+}
+
+function getTranslatedChildren(
+ translation: string,
+ children: ComponentChildren,
+): ComponentChild[] {
+ const tr = translation.split(/%(\d+)\$s/);
+ const childArray = children instanceof Array ? children : [children];
+ // Merge consecutive string children.
+ const placeholderChildren = Array<ComponentChild>();
+ 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 = Array<ComponentChild>();
+ for (let i = 0; i < tr.length; i++) {
+ if (i % 2 == 0) {
+ // Text
+ result.push(tr[i]);
+ } else {
+ const childIdx = Number.parseInt(tr[i],10) - 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
+ * in a another non-text element.
+ *
+ * Example:
+ * ```
+ * <Translate>
+ * Hello. Your score is <span><PlayerScore player={player} /></span>
+ * </Translate>
+ * ```
+ */
+export function Translate({ children }: TranslateProps): VNode {
+ const s = stringifyChildren(children);
+ const ctx = useTranslationContext()
+ const translation: string = ctx.handler.ngettext(s, s, 1);
+ const result = getTranslatedChildren(translation, children)
+ return <Fragment>{result}</Fragment>;
+}
+
+/**
+ * Switch translation based on singular or plural based on the target prop.
+ * Should only contain TranslateSingular and TransplatePlural as children.
+ *
+ * Example:
+ * ```
+ * <TranslateSwitch target={n}>
+ * <TranslateSingular>I have {n} apple.</TranslateSingular>
+ * <TranslatePlural>I have {n} apples.</TranslatePlural>
+ * </TranslateSwitch>
+ * ```
+ */
+export function TranslateSwitch({ children, target }: TranslateSwitchProps) {
+ let singular: VNode<TranslationPluralProps> | undefined;
+ let plural: VNode<TranslationPluralProps> | undefined;
+ // const children = this.props.children;
+ if (children) {
+ (children instanceof Array ? children : [children]).forEach((child: any) => {
+ if (child.type === TranslatePlural) {
+ plural = child;
+ }
+ if (child.type === TranslateSingular) {
+ singular = child;
+ }
+ });
+ }
+ if (!singular || !plural) {
+ console.error("translation not found");
+ return h("span", {}, ["translation not found"]);
+ }
+ singular.props.target = target;
+ plural.props.target = target;
+ // We're looking up the translation based on the
+ // singular, even if we must use the plural form.
+ return singular;
+}
+
+interface TranslationPluralProps {
+ children: ComponentChildren;
+ target: number;
+}
+
+/**
+ * See [[TranslateSwitch]].
+ */
+export function TranslatePlural({ children, target }: TranslationPluralProps): VNode {
+ const s = stringifyChildren(children);
+ const ctx = useTranslationContext()
+ const translation = ctx.handler.ngettext(s, s, 1);
+ const result = getTranslatedChildren(translation, children);
+ return <Fragment>{result}</Fragment>;
+}
+
+/**
+ * See [[TranslateSwitch]].
+ */
+export function TranslateSingular({ children, target }: TranslationPluralProps): VNode {
+ const s = stringifyChildren(children);
+ const ctx = useTranslationContext()
+ const translation = ctx.handler.ngettext(s, s, target);
+ const result = getTranslatedChildren(translation, children);
+ return <Fragment>{result}</Fragment>;
+
+}
diff --git a/packages/backend/src/i18n/it.po b/packages/backend/src/i18n/it.po
new file mode 100644
index 0000000..6b35bd0
--- /dev/null
+++ b/packages/backend/src/i18n/it.po
@@ -0,0 +1,1057 @@
+# This file is part of TALER
+# (C) 2016 GNUnet e.V.
+#
+# 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.
+#
+# 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
+# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Taler Wallet\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-11-23 00:00+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/ApplicationReadyRoutes.tsx:50 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:299
+#, c-format
+msgid "Access denied"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:51 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:300
+#, c-format
+msgid "Check your token is valid"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:72
+#, c-format
+msgid "Couldn't access the server."
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:73
+#, c-format
+msgid "Could not infer instance id from url %1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:109
+#, c-format
+msgid "HTTP status #%1$s: Server reported a problem"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:110
+#, c-format
+msgid "Got message: \"%1$s\" from: %2$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:127
+#, c-format
+msgid "No default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:128
+#, c-format
+msgid ""
+"in order to use merchant backoffice, you should create the default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:288
+#, c-format
+msgid "Server reported a problem: HTTP status #%1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:289
+#, c-format
+msgid "Got message: %1$s from: %2$s"
+msgstr ""
+
+#: src/components/exception/login.tsx:46
+#, c-format
+msgid "Login required"
+msgstr ""
+
+#: src/components/exception/login.tsx:49
+#, c-format
+msgid ""
+"Please enter your auth token. Token should have \"secret-token:\" and start "
+"with Bearer or ApiKey"
+msgstr ""
+
+#: src/components/exception/login.tsx:86 src/components/modal/index.tsx:53
+#: src/components/modal/index.tsx:75 src/paths/admin/create/CreatePage.tsx:115
+#: src/paths/instance/orders/create/CreatePage.tsx:325
+#: src/paths/instance/products/create/CreatePage.tsx:51
+#: src/paths/instance/products/list/Table.tsx:174
+#: src/paths/instance/products/list/Table.tsx:228
+#: src/paths/instance/products/update/UpdatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:134
+#, c-format
+msgid "Confirm"
+msgstr ""
+
+#: src/components/form/InputArray.tsx:72
+#, c-format
+msgid "The value %1$s is invalid for a payment url"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:67
+#: src/paths/instance/orders/list/index.tsx:123
+#, c-format
+msgid "pick a date"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:81
+#, c-format
+msgid "clear"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:83
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "never"
+msgstr ""
+
+#: src/components/form/InputImage.tsx:80
+#, c-format
+msgid "Image should be smaller than 1 MB"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:28
+#, c-format
+msgid "Country"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:30
+#: src/paths/admin/create/CreatePage.tsx:99
+#: src/paths/instance/transfers/list/Table.tsx:124
+#: src/paths/instance/update/UpdatePage.tsx:118
+#, c-format
+msgid "Address"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:34
+#, c-format
+msgid "Building number"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:35
+#, c-format
+msgid "Building name"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:36
+#, c-format
+msgid "Street"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:37
+#, c-format
+msgid "Post code"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:38
+#, c-format
+msgid "Town location"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:39
+#, c-format
+msgid "Town"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:40
+#, c-format
+msgid "District"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:41
+#, c-format
+msgid "Country subdivision"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:59
+#, c-format
+msgid "Product id"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:60
+#: src/components/product/ProductForm.tsx:99
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:122
+#: src/paths/instance/orders/list/Table.tsx:227
+#: src/paths/instance/products/list/Table.tsx:86
+#, c-format
+msgid "Description"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:73
+#: src/components/form/InputTaxes.tsx:81
+#: src/paths/admin/create/CreatePage.tsx:87 src/paths/admin/list/Table.tsx:110
+#: src/paths/instance/details/DetailPage.tsx:76
+#: src/paths/instance/update/UpdatePage.tsx:106
+#, c-format
+msgid "Name"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:102
+#, c-format
+msgid "loading..."
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:108
+#, c-format
+msgid "no products found"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:116
+#, c-format
+msgid "no results"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:33
+#, c-format
+msgid "Deleting"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:34
+#, c-format
+msgid "Changing"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:60
+#, c-format
+msgid "Manage token"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:83
+#, c-format
+msgid "Update"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:100
+#: src/paths/instance/orders/create/CreatePage.tsx:252
+#: src/paths/instance/orders/create/CreatePage.tsx:273
+#, c-format
+msgid "Remove"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:106 src/components/modal/index.tsx:52
+#: src/components/modal/index.tsx:73 src/paths/admin/create/CreatePage.tsx:114
+#: src/paths/instance/orders/create/CreatePage.tsx:324
+#: src/paths/instance/products/create/CreatePage.tsx:50
+#: src/paths/instance/products/list/Table.tsx:166
+#: src/paths/instance/products/list/Table.tsx:218
+#: src/paths/instance/products/update/UpdatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:88
+#: src/paths/instance/update/UpdatePage.tsx:133
+#, c-format
+msgid "Cancel"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:91
+#, c-format
+msgid "Manage stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:93
+#, c-format
+msgid "Infinite"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:105
+#, c-format
+msgid "lost cannot be greater that current + incoming (max %1$s)"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:111
+#, c-format
+msgid "current stock will change from %1$s to %2$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:112
+#, c-format
+msgid "current stock will stay at %1$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:129
+#: src/paths/instance/products/list/Table.tsx:204
+#, c-format
+msgid "Incoming"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:130
+#: src/paths/instance/products/list/Table.tsx:205
+#, c-format
+msgid "Lost"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:142
+#, c-format
+msgid "Current"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:145
+#, c-format
+msgid "without stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:150
+#, c-format
+msgid "Next restock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:152
+#, c-format
+msgid "Delivery address"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:73
+#, c-format
+msgid "this product has no taxes"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:77
+#: src/paths/instance/orders/details/DetailPage.tsx:145
+#: src/paths/instance/orders/details/DetailPage.tsx:296
+#: src/paths/instance/orders/list/Table.tsx:116
+#: src/paths/instance/transfers/create/CreatePage.tsx:84
+#, c-format
+msgid "Amount"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:78
+#, c-format
+msgid "currency and value separated with colon"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:84
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:78
+#, c-format
+msgid "Add"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:53
+#, c-format
+msgid "Instance"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:59
+#, c-format
+msgid "Settings"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:65
+#: src/paths/instance/orders/list/Table.tsx:60
+#, c-format
+msgid "Orders"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:71
+#: src/paths/instance/orders/create/CreatePage.tsx:258
+#: src/paths/instance/products/list/Table.tsx:48
+#, c-format
+msgid "Products"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:77
+#: src/paths/instance/transfers/list/Table.tsx:65
+#, c-format
+msgid "Transfers"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:87
+#, c-format
+msgid "Connection"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:112 src/paths/admin/list/Table.tsx:57
+#, c-format
+msgid "Instances"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:116
+#, c-format
+msgid "New"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:122
+#, c-format
+msgid "List"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:129
+#, c-format
+msgid "Log out"
+msgstr ""
+
+#: src/components/modal/index.tsx:74
+#, c-format
+msgid "Clear"
+msgstr ""
+
+#: src/components/modal/index.tsx:110 src/components/modal/index.tsx:111
+#, c-format
+msgid "should be the same"
+msgstr ""
+
+#: src/components/modal/index.tsx:111
+#, c-format
+msgid "cannot be the same as before"
+msgstr ""
+
+#: src/components/modal/index.tsx:114
+#, c-format
+msgid ""
+"You are updating the authorization token from instance %1$s with id %2$s"
+msgstr ""
+
+#: src/components/modal/index.tsx:124
+#, c-format
+msgid "Old token"
+msgstr ""
+
+#: src/components/modal/index.tsx:125
+#, c-format
+msgid "New token"
+msgstr ""
+
+#: src/components/modal/index.tsx:127
+#, c-format
+msgid "Clearing the auth token will mean public access to the instance"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:96
+#: src/paths/admin/create/CreatePage.tsx:85 src/paths/admin/list/Table.tsx:109
+#: src/paths/instance/transfers/list/Table.tsx:122
+#, c-format
+msgid "ID"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:98
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:121
+#: src/paths/instance/products/list/Table.tsx:85
+#, c-format
+msgid "Image"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:100
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:123
+#, c-format
+msgid "Unit"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:101
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:124
+#: src/paths/instance/products/list/Table.tsx:162
+#: src/paths/instance/products/list/Table.tsx:214
+#, c-format
+msgid "Price"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:103
+#: src/paths/instance/products/list/Table.tsx:90
+#, c-format
+msgid "Stock"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:105
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:128
+#: src/paths/instance/products/list/Table.tsx:88
+#, c-format
+msgid "Taxes"
+msgstr ""
+
+#: src/index.tsx:75
+#, c-format
+msgid "Server not found"
+msgstr ""
+
+#: src/index.tsx:85
+#, c-format
+msgid "Couldn't access the server"
+msgstr ""
+
+#: src/index.tsx:87 src/index.tsx:99
+#, c-format
+msgid "Got message %1$s from %2$s"
+msgstr ""
+
+#: src/index.tsx:97
+#, c-format
+msgid "Unexpected Error"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:108
+#, c-format
+msgid "Auth token"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:91
+#: src/paths/instance/details/DetailPage.tsx:77
+#: src/paths/instance/update/UpdatePage.tsx:110
+#, c-format
+msgid "Account address"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:93
+#: src/paths/instance/update/UpdatePage.tsx:112
+#, c-format
+msgid "Default max deposit fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:95
+#: src/paths/instance/update/UpdatePage.tsx:114
+#, c-format
+msgid "Default max wire fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:97
+#: src/paths/instance/update/UpdatePage.tsx:116
+#, c-format
+msgid "Default wire fee amortization"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:103
+#: src/paths/instance/update/UpdatePage.tsx:122
+#, c-format
+msgid "Jurisdiction"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:107
+#: src/paths/instance/update/UpdatePage.tsx:126
+#, c-format
+msgid "Default pay delay"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:109
+#: src/paths/instance/update/UpdatePage.tsx:128
+#, c-format
+msgid "Default wire transfer delay"
+msgstr ""
+
+#: src/paths/admin/create/index.tsx:58
+#, c-format
+msgid "could not create instance"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:63 src/paths/admin/list/Table.tsx:131
+#: src/paths/instance/transfers/list/Table.tsx:71
+#, c-format
+msgid "Delete"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:128
+#, c-format
+msgid "Edit"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:149
+#: src/paths/instance/products/list/Table.tsx:245
+#, c-format
+msgid "There is no instances yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:237
+#, c-format
+msgid "Inventory products"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:286
+#, c-format
+msgid "Total price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:287
+#, c-format
+msgid "Total tax"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:289
+#: src/paths/instance/orders/create/CreatePage.tsx:297
+#, c-format
+msgid "Order price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:295
+#, c-format
+msgid "Net"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:300
+#: src/paths/instance/orders/details/DetailPage.tsx:144
+#: src/paths/instance/orders/details/DetailPage.tsx:295
+#: src/paths/instance/orders/list/Table.tsx:117
+#, c-format
+msgid "Summary"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:302
+#, c-format
+msgid "Payments options"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:303
+#, c-format
+msgid "Auto refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:304
+#, c-format
+msgid "Refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:305
+#, c-format
+msgid "Pay deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:307
+#, c-format
+msgid "Delivery date"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:308
+#, c-format
+msgid "Location"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:312
+#, c-format
+msgid "Max fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:313
+#, c-format
+msgid "Max wire fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:314
+#, c-format
+msgid "Wire fee amortization"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:315
+#, c-format
+msgid "Fullfilment url"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:318
+#, c-format
+msgid "Extra information"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:44
+#, c-format
+msgid "select a product first"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:51
+#, c-format
+msgid "should be greater than 0"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:58
+#, c-format
+msgid ""
+"cannot be greater than current stock and quantity previously added. max: %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:64
+#, c-format
+msgid "cannot be greater than current stock %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:76
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:126
+#, c-format
+msgid "Quantity"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:92
+#: src/paths/instance/orders/details/DetailPage.tsx:235
+#: src/paths/instance/orders/details/DetailPage.tsx:333
+#, c-format
+msgid "Order"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:93
+#, c-format
+msgid "claimed"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:110
+#: src/paths/instance/orders/details/DetailPage.tsx:261
+#: src/paths/instance/orders/list/Table.tsx:136
+#, c-format
+msgid "copy url"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:126
+#: src/paths/instance/orders/details/DetailPage.tsx:349
+#, c-format
+msgid "pay at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:127
+#: src/paths/instance/orders/details/DetailPage.tsx:350
+#, c-format
+msgid "created at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:138
+#: src/paths/instance/orders/details/DetailPage.tsx:289
+#, c-format
+msgid "Timeline"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:142
+#: src/paths/instance/orders/details/DetailPage.tsx:293
+#, c-format
+msgid "Payment details"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:146
+#: src/paths/instance/orders/details/DetailPage.tsx:299
+#: src/paths/instance/orders/details/DetailPage.tsx:363
+#, c-format
+msgid "Order status"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:156
+#: src/paths/instance/orders/details/DetailPage.tsx:308
+#, c-format
+msgid "Product list"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:236
+#, c-format
+msgid "paid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:238
+#, c-format
+msgid "wired"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:241
+#, c-format
+msgid "refunded"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:258
+#, c-format
+msgid "refund"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:297
+#, c-format
+msgid "Refunded amount"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:298
+#, c-format
+msgid "Deposit total"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:336
+#, c-format
+msgid "unpaid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:364
+#, c-format
+msgid "Order status URL"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:365
+#, c-format
+msgid "Pay URI"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:383
+#, c-format
+msgid ""
+"Unknown order status. This is an error, please contact the administrator."
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:56
+#: src/paths/instance/orders/list/index.tsx:147
+#, c-format
+msgid "refund created successfully"
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:59
+#: src/paths/instance/orders/list/index.tsx:150
+#, c-format
+msgid "could not create the refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:111
+#, c-format
+msgid "load newer orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:115
+#, c-format
+msgid "Date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:131
+#: src/paths/instance/orders/list/Table.tsx:223
+#, c-format
+msgid "Refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:145
+#, c-format
+msgid "load older orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:154
+#, c-format
+msgid "No orders has been found"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:202
+#, c-format
+msgid "date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:203
+#, c-format
+msgid "amount"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:204
+#, c-format
+msgid "reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:224
+#, c-format
+msgid "Max refundable:"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "Reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "duplicated"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "requested by the customer"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "other"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:91
+#, c-format
+msgid "go to order id"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:107
+#, c-format
+msgid "Paid"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:108
+#, c-format
+msgid "Refunded"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:109
+#, c-format
+msgid "Not wired"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:110
+#, c-format
+msgid "All"
+msgstr ""
+
+#: src/paths/instance/products/create/index.tsx:48
+#: src/paths/instance/products/update/index.tsx:64
+#, c-format
+msgid "could not create product"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:87
+#, c-format
+msgid "Sell"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:89
+#, c-format
+msgid "Profit"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:91
+#, c-format
+msgid "Sold"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:59
+#, c-format
+msgid "product updated successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:62
+#, c-format
+msgid "could not update the product"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:70
+#, c-format
+msgid "product delete successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:73
+#, c-format
+msgid "could not delete the product"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:59
+#, c-format
+msgid "Tips"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:111
+#, c-format
+msgid "Committed amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:112
+#, c-format
+msgid "Exchange initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:113
+#, c-format
+msgid "Merchant initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:148
+#, c-format
+msgid "There is no tips yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:50
+#: src/paths/instance/transfers/create/CreatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:56
+#, c-format
+msgid "cannot be empty"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:51
+#, c-format
+msgid "check the id, doest look valid"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:52
+#, c-format
+msgid "should have 52 characters, current %1$s"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:57
+#, c-format
+msgid "URL doesn't have the right format"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:74
+#, c-format
+msgid "Transfer ID"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:76
+#, c-format
+msgid "Account Address"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:82
+#: src/paths/instance/transfers/list/Table.tsx:125
+#, c-format
+msgid "Exchange URL"
+msgstr ""
+
+#: src/paths/instance/transfers/create/index.tsx:49
+#, c-format
+msgid "could not inform transfer"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:118
+#, c-format
+msgid "load newer transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:123
+#, c-format
+msgid "Credit"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:126
+#, c-format
+msgid "Confirmed"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:127
+#: src/paths/instance/transfers/list/index.tsx:60
+#, c-format
+msgid "Verified"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:128
+#, c-format
+msgid "Executed at"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "yes"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "no"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "unknown"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:145
+#, c-format
+msgid "load older transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:154
+#, c-format
+msgid "There is no transfer yet, add more pressing the + sign"
+msgstr ""
diff --git a/packages/backend/src/i18n/poheader b/packages/backend/src/i18n/poheader
new file mode 100644
index 0000000..ee3fcd7
--- /dev/null
+++ b/packages/backend/src/i18n/poheader
@@ -0,0 +1,27 @@
+# This file is part of GNU Taler
+# (C) 2021 Taler Systems S.A.
+
+# 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/>
+
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Taler Wallet\n"
+"Report-Msgid-Bugs-To: taler@gnu.org\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
diff --git a/packages/backend/src/i18n/strings-prelude b/packages/backend/src/i18n/strings-prelude
new file mode 100644
index 0000000..cca13af
--- /dev/null
+++ b/packages/backend/src/i18n/strings-prelude
@@ -0,0 +1,19 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/*eslint quote-props: ["error", "consistent"]*/
+export const strings: {[s: string]: any} = {};
+
diff --git a/packages/backend/src/i18n/strings.ts b/packages/backend/src/i18n/strings.ts
new file mode 100644
index 0000000..63e9694
--- /dev/null
+++ b/packages/backend/src/i18n/strings.ts
@@ -0,0 +1,3445 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/*eslint quote-props: ["error", "consistent"]*/
+export const strings: {[s: string]: any} = {};
+
+strings['de'] = {
+ "domain": "messages",
+ "locale_data": {
+ "messages": {
+ "": {
+ "domain": "messages",
+ "plural_forms": "nplurals=2; plural=(n != 1);",
+ "lang": ""
+ },
+ "Access denied": [
+ ""
+ ],
+ "Check your token is valid": [
+ ""
+ ],
+ "Couldn't access the server.": [
+ ""
+ ],
+ "Could not infer instance id from url %1$s": [
+ ""
+ ],
+ "HTTP status #%1$s: Server reported a problem": [
+ ""
+ ],
+ "Got message: \"%1$s\" from: %2$s": [
+ ""
+ ],
+ "No default instance": [
+ ""
+ ],
+ "in order to use merchant backoffice, you should create the default instance": [
+ ""
+ ],
+ "Server reported a problem: HTTP status #%1$s": [
+ ""
+ ],
+ "Got message: %1$s from: %2$s": [
+ ""
+ ],
+ "Login required": [
+ ""
+ ],
+ "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
+ ""
+ ],
+ "Confirm": [
+ ""
+ ],
+ "The value %1$s is invalid for a payment url": [
+ ""
+ ],
+ "pick a date": [
+ ""
+ ],
+ "clear": [
+ ""
+ ],
+ "never": [
+ ""
+ ],
+ "Image should be smaller than 1 MB": [
+ ""
+ ],
+ "Country": [
+ ""
+ ],
+ "Address": [
+ ""
+ ],
+ "Building number": [
+ ""
+ ],
+ "Building name": [
+ ""
+ ],
+ "Street": [
+ ""
+ ],
+ "Post code": [
+ ""
+ ],
+ "Town location": [
+ ""
+ ],
+ "Town": [
+ ""
+ ],
+ "District": [
+ ""
+ ],
+ "Country subdivision": [
+ ""
+ ],
+ "Product id": [
+ ""
+ ],
+ "Description": [
+ ""
+ ],
+ "Name": [
+ ""
+ ],
+ "loading...": [
+ ""
+ ],
+ "no products found": [
+ ""
+ ],
+ "no results": [
+ ""
+ ],
+ "Deleting": [
+ ""
+ ],
+ "Changing": [
+ ""
+ ],
+ "Manage token": [
+ ""
+ ],
+ "Update": [
+ ""
+ ],
+ "Remove": [
+ ""
+ ],
+ "Cancel": [
+ ""
+ ],
+ "Manage stock": [
+ ""
+ ],
+ "Infinite": [
+ ""
+ ],
+ "lost cannot be greater that current + incoming (max %1$s)": [
+ ""
+ ],
+ "current stock will change from %1$s to %2$s": [
+ ""
+ ],
+ "current stock will stay at %1$s": [
+ ""
+ ],
+ "Incoming": [
+ ""
+ ],
+ "Lost": [
+ ""
+ ],
+ "Current": [
+ ""
+ ],
+ "without stock": [
+ ""
+ ],
+ "Next restock": [
+ ""
+ ],
+ "Delivery address": [
+ ""
+ ],
+ "this product has no taxes": [
+ ""
+ ],
+ "Amount": [
+ ""
+ ],
+ "currency and value separated with colon": [
+ ""
+ ],
+ "Add": [
+ ""
+ ],
+ "Instance": [
+ ""
+ ],
+ "Settings": [
+ ""
+ ],
+ "Orders": [
+ ""
+ ],
+ "Products": [
+ ""
+ ],
+ "Transfers": [
+ ""
+ ],
+ "Connection": [
+ ""
+ ],
+ "Instances": [
+ ""
+ ],
+ "New": [
+ ""
+ ],
+ "List": [
+ ""
+ ],
+ "Log out": [
+ ""
+ ],
+ "Clear": [
+ ""
+ ],
+ "should be the same": [
+ ""
+ ],
+ "cannot be the same as before": [
+ ""
+ ],
+ "You are updating the authorization token from instance %1$s with id %2$s": [
+ ""
+ ],
+ "Old token": [
+ ""
+ ],
+ "New token": [
+ ""
+ ],
+ "Clearing the auth token will mean public access to the instance": [
+ ""
+ ],
+ "ID": [
+ ""
+ ],
+ "Image": [
+ ""
+ ],
+ "Unit": [
+ ""
+ ],
+ "Price": [
+ ""
+ ],
+ "Stock": [
+ ""
+ ],
+ "Taxes": [
+ ""
+ ],
+ "Server not found": [
+ ""
+ ],
+ "Couldn't access the server": [
+ ""
+ ],
+ "Got message %1$s from %2$s": [
+ ""
+ ],
+ "Unexpected Error": [
+ ""
+ ],
+ "Auth token": [
+ ""
+ ],
+ "Account address": [
+ ""
+ ],
+ "Default max deposit fee": [
+ ""
+ ],
+ "Default max wire fee": [
+ ""
+ ],
+ "Default wire fee amortization": [
+ ""
+ ],
+ "Jurisdiction": [
+ ""
+ ],
+ "Default pay delay": [
+ ""
+ ],
+ "Default wire transfer delay": [
+ ""
+ ],
+ "could not create instance": [
+ ""
+ ],
+ "Delete": [
+ ""
+ ],
+ "Edit": [
+ ""
+ ],
+ "There is no instances yet, add more pressing the + sign": [
+ ""
+ ],
+ "Inventory products": [
+ ""
+ ],
+ "Total price": [
+ ""
+ ],
+ "Total tax": [
+ ""
+ ],
+ "Order price": [
+ ""
+ ],
+ "Net": [
+ ""
+ ],
+ "Summary": [
+ ""
+ ],
+ "Payments options": [
+ ""
+ ],
+ "Auto refund deadline": [
+ ""
+ ],
+ "Refund deadline": [
+ ""
+ ],
+ "Pay deadline": [
+ ""
+ ],
+ "Delivery date": [
+ ""
+ ],
+ "Location": [
+ ""
+ ],
+ "Max fee": [
+ ""
+ ],
+ "Max wire fee": [
+ ""
+ ],
+ "Wire fee amortization": [
+ ""
+ ],
+ "Fullfilment url": [
+ ""
+ ],
+ "Extra information": [
+ ""
+ ],
+ "select a product first": [
+ ""
+ ],
+ "should be greater than 0": [
+ ""
+ ],
+ "cannot be greater than current stock and quantity previously added. max: %1$s": [
+ ""
+ ],
+ "cannot be greater than current stock %1$s": [
+ ""
+ ],
+ "Quantity": [
+ ""
+ ],
+ "Order": [
+ ""
+ ],
+ "claimed": [
+ ""
+ ],
+ "copy url": [
+ ""
+ ],
+ "pay at": [
+ ""
+ ],
+ "created at": [
+ ""
+ ],
+ "Timeline": [
+ ""
+ ],
+ "Payment details": [
+ ""
+ ],
+ "Order status": [
+ ""
+ ],
+ "Product list": [
+ ""
+ ],
+ "paid": [
+ ""
+ ],
+ "wired": [
+ ""
+ ],
+ "refunded": [
+ ""
+ ],
+ "refund": [
+ ""
+ ],
+ "Refunded amount": [
+ ""
+ ],
+ "Deposit total": [
+ ""
+ ],
+ "unpaid": [
+ ""
+ ],
+ "Order status URL": [
+ ""
+ ],
+ "Pay URI": [
+ ""
+ ],
+ "Unknown order status. This is an error, please contact the administrator.": [
+ ""
+ ],
+ "refund created successfully": [
+ ""
+ ],
+ "could not create the refund": [
+ ""
+ ],
+ "load newer orders": [
+ ""
+ ],
+ "Date": [
+ ""
+ ],
+ "Refund": [
+ ""
+ ],
+ "load older orders": [
+ ""
+ ],
+ "No orders has been found": [
+ ""
+ ],
+ "date": [
+ ""
+ ],
+ "amount": [
+ ""
+ ],
+ "reason": [
+ ""
+ ],
+ "Max refundable:": [
+ ""
+ ],
+ "Reason": [
+ ""
+ ],
+ "duplicated": [
+ ""
+ ],
+ "requested by the customer": [
+ ""
+ ],
+ "other": [
+ ""
+ ],
+ "go to order id": [
+ ""
+ ],
+ "Paid": [
+ ""
+ ],
+ "Refunded": [
+ ""
+ ],
+ "Not wired": [
+ ""
+ ],
+ "All": [
+ ""
+ ],
+ "could not create product": [
+ ""
+ ],
+ "Sell": [
+ ""
+ ],
+ "Profit": [
+ ""
+ ],
+ "Sold": [
+ ""
+ ],
+ "product updated successfully": [
+ ""
+ ],
+ "could not update the product": [
+ ""
+ ],
+ "product delete successfully": [
+ ""
+ ],
+ "could not delete the product": [
+ ""
+ ],
+ "Tips": [
+ ""
+ ],
+ "Committed amount": [
+ ""
+ ],
+ "Exchange initial amount": [
+ ""
+ ],
+ "Merchant initial amount": [
+ ""
+ ],
+ "There is no tips yet, add more pressing the + sign": [
+ ""
+ ],
+ "cannot be empty": [
+ ""
+ ],
+ "check the id, doest look valid": [
+ ""
+ ],
+ "should have 52 characters, current %1$s": [
+ ""
+ ],
+ "URL doesn't have the right format": [
+ ""
+ ],
+ "Transfer ID": [
+ ""
+ ],
+ "Account Address": [
+ ""
+ ],
+ "Exchange URL": [
+ ""
+ ],
+ "could not inform transfer": [
+ ""
+ ],
+ "load newer transfers": [
+ ""
+ ],
+ "Credit": [
+ ""
+ ],
+ "Confirmed": [
+ ""
+ ],
+ "Verified": [
+ ""
+ ],
+ "Executed at": [
+ ""
+ ],
+ "yes": [
+ ""
+ ],
+ "no": [
+ ""
+ ],
+ "unknown": [
+ ""
+ ],
+ "load older transfers": [
+ ""
+ ],
+ "There is no transfer yet, add more pressing the + sign": [
+ ""
+ ]
+ }
+ }
+};
+
+strings['en'] = {
+ "domain": "messages",
+ "locale_data": {
+ "messages": {
+ "": {
+ "domain": "messages",
+ "plural_forms": "nplurals=2; plural=(n != 1);",
+ "lang": ""
+ },
+ "Access denied": [
+ ""
+ ],
+ "Check your token is valid": [
+ ""
+ ],
+ "Couldn't access the server.": [
+ ""
+ ],
+ "Could not infer instance id from url %1$s": [
+ ""
+ ],
+ "HTTP status #%1$s: Server reported a problem": [
+ ""
+ ],
+ "Got message: \"%1$s\" from: %2$s": [
+ ""
+ ],
+ "No default instance": [
+ ""
+ ],
+ "in order to use merchant backoffice, you should create the default instance": [
+ ""
+ ],
+ "Server reported a problem: HTTP status #%1$s": [
+ ""
+ ],
+ "Got message: %1$s from: %2$s": [
+ ""
+ ],
+ "Login required": [
+ ""
+ ],
+ "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
+ ""
+ ],
+ "Confirm": [
+ ""
+ ],
+ "The value %1$s is invalid for a payment url": [
+ ""
+ ],
+ "pick a date": [
+ ""
+ ],
+ "clear": [
+ ""
+ ],
+ "never": [
+ ""
+ ],
+ "Image should be smaller than 1 MB": [
+ ""
+ ],
+ "Country": [
+ ""
+ ],
+ "Address": [
+ ""
+ ],
+ "Building number": [
+ ""
+ ],
+ "Building name": [
+ ""
+ ],
+ "Street": [
+ ""
+ ],
+ "Post code": [
+ ""
+ ],
+ "Town location": [
+ ""
+ ],
+ "Town": [
+ ""
+ ],
+ "District": [
+ ""
+ ],
+ "Country subdivision": [
+ ""
+ ],
+ "Product id": [
+ ""
+ ],
+ "Description": [
+ ""
+ ],
+ "Name": [
+ ""
+ ],
+ "loading...": [
+ ""
+ ],
+ "no products found": [
+ ""
+ ],
+ "no results": [
+ ""
+ ],
+ "Deleting": [
+ ""
+ ],
+ "Changing": [
+ ""
+ ],
+ "Manage token": [
+ ""
+ ],
+ "Update": [
+ ""
+ ],
+ "Remove": [
+ ""
+ ],
+ "Cancel": [
+ ""
+ ],
+ "Manage stock": [
+ ""
+ ],
+ "Infinite": [
+ ""
+ ],
+ "lost cannot be greater that current + incoming (max %1$s)": [
+ ""
+ ],
+ "current stock will change from %1$s to %2$s": [
+ ""
+ ],
+ "current stock will stay at %1$s": [
+ ""
+ ],
+ "Incoming": [
+ ""
+ ],
+ "Lost": [
+ ""
+ ],
+ "Current": [
+ ""
+ ],
+ "without stock": [
+ ""
+ ],
+ "Next restock": [
+ ""
+ ],
+ "Delivery address": [
+ ""
+ ],
+ "this product has no taxes": [
+ ""
+ ],
+ "Amount": [
+ ""
+ ],
+ "currency and value separated with colon": [
+ ""
+ ],
+ "Add": [
+ ""
+ ],
+ "Instance": [
+ ""
+ ],
+ "Settings": [
+ ""
+ ],
+ "Orders": [
+ ""
+ ],
+ "Products": [
+ ""
+ ],
+ "Transfers": [
+ ""
+ ],
+ "Connection": [
+ ""
+ ],
+ "Instances": [
+ ""
+ ],
+ "New": [
+ ""
+ ],
+ "List": [
+ ""
+ ],
+ "Log out": [
+ ""
+ ],
+ "Clear": [
+ ""
+ ],
+ "should be the same": [
+ ""
+ ],
+ "cannot be the same as before": [
+ ""
+ ],
+ "You are updating the authorization token from instance %1$s with id %2$s": [
+ ""
+ ],
+ "Old token": [
+ ""
+ ],
+ "New token": [
+ ""
+ ],
+ "Clearing the auth token will mean public access to the instance": [
+ ""
+ ],
+ "ID": [
+ ""
+ ],
+ "Image": [
+ ""
+ ],
+ "Unit": [
+ ""
+ ],
+ "Price": [
+ ""
+ ],
+ "Stock": [
+ ""
+ ],
+ "Taxes": [
+ ""
+ ],
+ "Server not found": [
+ ""
+ ],
+ "Couldn't access the server": [
+ ""
+ ],
+ "Got message %1$s from %2$s": [
+ ""
+ ],
+ "Unexpected Error": [
+ ""
+ ],
+ "Auth token": [
+ ""
+ ],
+ "Account address": [
+ ""
+ ],
+ "Default max deposit fee": [
+ ""
+ ],
+ "Default max wire fee": [
+ ""
+ ],
+ "Default wire fee amortization": [
+ ""
+ ],
+ "Jurisdiction": [
+ ""
+ ],
+ "Default pay delay": [
+ ""
+ ],
+ "Default wire transfer delay": [
+ ""
+ ],
+ "could not create instance": [
+ ""
+ ],
+ "Delete": [
+ ""
+ ],
+ "Edit": [
+ ""
+ ],
+ "There is no instances yet, add more pressing the + sign": [
+ ""
+ ],
+ "Inventory products": [
+ ""
+ ],
+ "Total price": [
+ ""
+ ],
+ "Total tax": [
+ ""
+ ],
+ "Order price": [
+ ""
+ ],
+ "Net": [
+ ""
+ ],
+ "Summary": [
+ ""
+ ],
+ "Payments options": [
+ ""
+ ],
+ "Auto refund deadline": [
+ ""
+ ],
+ "Refund deadline": [
+ ""
+ ],
+ "Pay deadline": [
+ ""
+ ],
+ "Delivery date": [
+ ""
+ ],
+ "Location": [
+ ""
+ ],
+ "Max fee": [
+ ""
+ ],
+ "Max wire fee": [
+ ""
+ ],
+ "Wire fee amortization": [
+ ""
+ ],
+ "Fullfilment url": [
+ ""
+ ],
+ "Extra information": [
+ ""
+ ],
+ "select a product first": [
+ ""
+ ],
+ "should be greater than 0": [
+ ""
+ ],
+ "cannot be greater than current stock and quantity previously added. max: %1$s": [
+ ""
+ ],
+ "cannot be greater than current stock %1$s": [
+ ""
+ ],
+ "Quantity": [
+ ""
+ ],
+ "Order": [
+ ""
+ ],
+ "claimed": [
+ ""
+ ],
+ "copy url": [
+ ""
+ ],
+ "pay at": [
+ ""
+ ],
+ "created at": [
+ ""
+ ],
+ "Timeline": [
+ ""
+ ],
+ "Payment details": [
+ ""
+ ],
+ "Order status": [
+ ""
+ ],
+ "Product list": [
+ ""
+ ],
+ "paid": [
+ ""
+ ],
+ "wired": [
+ ""
+ ],
+ "refunded": [
+ ""
+ ],
+ "refund": [
+ ""
+ ],
+ "Refunded amount": [
+ ""
+ ],
+ "Deposit total": [
+ ""
+ ],
+ "unpaid": [
+ ""
+ ],
+ "Order status URL": [
+ ""
+ ],
+ "Pay URI": [
+ ""
+ ],
+ "Unknown order status. This is an error, please contact the administrator.": [
+ ""
+ ],
+ "refund created successfully": [
+ ""
+ ],
+ "could not create the refund": [
+ ""
+ ],
+ "load newer orders": [
+ ""
+ ],
+ "Date": [
+ ""
+ ],
+ "Refund": [
+ ""
+ ],
+ "load older orders": [
+ ""
+ ],
+ "No orders has been found": [
+ ""
+ ],
+ "date": [
+ ""
+ ],
+ "amount": [
+ ""
+ ],
+ "reason": [
+ ""
+ ],
+ "Max refundable:": [
+ ""
+ ],
+ "Reason": [
+ ""
+ ],
+ "duplicated": [
+ ""
+ ],
+ "requested by the customer": [
+ ""
+ ],
+ "other": [
+ ""
+ ],
+ "go to order id": [
+ ""
+ ],
+ "Paid": [
+ ""
+ ],
+ "Refunded": [
+ ""
+ ],
+ "Not wired": [
+ ""
+ ],
+ "All": [
+ ""
+ ],
+ "could not create product": [
+ ""
+ ],
+ "Sell": [
+ ""
+ ],
+ "Profit": [
+ ""
+ ],
+ "Sold": [
+ ""
+ ],
+ "product updated successfully": [
+ ""
+ ],
+ "could not update the product": [
+ ""
+ ],
+ "product delete successfully": [
+ ""
+ ],
+ "could not delete the product": [
+ ""
+ ],
+ "Tips": [
+ ""
+ ],
+ "Committed amount": [
+ ""
+ ],
+ "Exchange initial amount": [
+ ""
+ ],
+ "Merchant initial amount": [
+ ""
+ ],
+ "There is no tips yet, add more pressing the + sign": [
+ ""
+ ],
+ "cannot be empty": [
+ ""
+ ],
+ "check the id, doest look valid": [
+ ""
+ ],
+ "should have 52 characters, current %1$s": [
+ ""
+ ],
+ "URL doesn't have the right format": [
+ ""
+ ],
+ "Transfer ID": [
+ ""
+ ],
+ "Account Address": [
+ ""
+ ],
+ "Exchange URL": [
+ ""
+ ],
+ "could not inform transfer": [
+ ""
+ ],
+ "load newer transfers": [
+ ""
+ ],
+ "Credit": [
+ ""
+ ],
+ "Confirmed": [
+ ""
+ ],
+ "Verified": [
+ ""
+ ],
+ "Executed at": [
+ ""
+ ],
+ "yes": [
+ ""
+ ],
+ "no": [
+ ""
+ ],
+ "unknown": [
+ ""
+ ],
+ "load older transfers": [
+ ""
+ ],
+ "There is no transfer yet, add more pressing the + sign": [
+ ""
+ ]
+ }
+ }
+};
+
+strings['es'] = {
+ "domain": "messages",
+ "locale_data": {
+ "messages": {
+ "": {
+ "domain": "messages",
+ "plural_forms": "nplurals=2; plural=(n != 1);",
+ "lang": ""
+ },
+ "Access denied": [
+ "Acceso denegado"
+ ],
+ "Check your token is valid": [
+ "Verifica que el token sea valido"
+ ],
+ "Couldn't access the server.": [
+ "No se pudo acceder al servidor"
+ ],
+ "Could not infer instance id from url %1$s": [
+ "No se pudo inferir el id de la instancia con la url %1$s"
+ ],
+ "HTTP status #%1$s: Server reported a problem": [
+ "HTTP status #%1$s: Servidor reporto un problema"
+ ],
+ "Got message: \"%1$s\" from: %2$s": [
+ "Recivimos el mensaje %1$s desde %2$s"
+ ],
+ "No default instance": [
+ "Sin instancia default"
+ ],
+ "in order to use merchant backoffice, you should create the default instance": [
+ "para usar el merchant backoffice, deberΓ­a crear la instancia default"
+ ],
+ "Server reported a problem: HTTP status #%1$s": [
+ "Servidir reporto un problema: HTTP status #%1$s"
+ ],
+ "Got message: %1$s from: %2$s": [
+ "Recivimos el mensaje %1$s desde %2$s"
+ ],
+ "Login required": [
+ "Login necesario"
+ ],
+ "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
+ "Por favor ingrese su token de autorizaciΓ³n. El token debe tener \"secret-token\" y comenzar con Bearer o ApiKey"
+ ],
+ "Confirm": [
+ "Confirmar"
+ ],
+ "The value %1$s is invalid for a payment url": [
+ "El valor %1$s es invalido para una URL de pago"
+ ],
+ "pick a date": [
+ "elegir una fecha"
+ ],
+ "clear": [
+ "Limpiar"
+ ],
+ "never": [
+ "nunca"
+ ],
+ "Image should be smaller than 1 MB": [
+ "La imagen debe ser mas chica que 1 MB"
+ ],
+ "Country": [
+ "PaΓ­s"
+ ],
+ "Address": [
+ "DirecciΓ³n"
+ ],
+ "Building number": [
+ "NΓΊmero de edificio"
+ ],
+ "Building name": [
+ "Nombre de edificio"
+ ],
+ "Street": [
+ "Calle"
+ ],
+ "Post code": [
+ "CΓ³digo postal"
+ ],
+ "Town location": [
+ "UbicaciΓ³n de ciudad"
+ ],
+ "Town": [
+ "Ciudad"
+ ],
+ "District": [
+ "Distrito"
+ ],
+ "Country subdivision": [
+ "Provincia"
+ ],
+ "Product id": [
+ "Id de producto"
+ ],
+ "Description": [
+ "Descripcion"
+ ],
+ "Name": [
+ "Nombre"
+ ],
+ "loading...": [
+ "Cargando..."
+ ],
+ "no products found": [
+ "No se encontraron productos"
+ ],
+ "no results": [
+ "Sin resultados"
+ ],
+ "Deleting": [
+ "Borrando"
+ ],
+ "Changing": [
+ "Cambiando"
+ ],
+ "Manage token": [
+ "Administrar token"
+ ],
+ "Update": [
+ "Actualizar"
+ ],
+ "Remove": [
+ "Eliminar"
+ ],
+ "Cancel": [
+ "Cancelar"
+ ],
+ "Manage stock": [
+ "Administrar stock"
+ ],
+ "Infinite": [
+ "Inifinito"
+ ],
+ "lost cannot be greater that current + incoming (max %1$s)": [
+ "no puede ser mayor al stock actual %1$s"
+ ],
+ "current stock will change from %1$s to %2$s": [
+ "stock actual cambiarΓ‘ desde %1$s a %2$s"
+ ],
+ "current stock will stay at %1$s": [
+ "stock actual seguirΓ‘ en %1$s"
+ ],
+ "Incoming": [
+ "Ingresando"
+ ],
+ "Lost": [
+ "Perdido"
+ ],
+ "Current": [
+ "Actual"
+ ],
+ "without stock": [
+ "sin stock"
+ ],
+ "Next restock": [
+ "PrΓ³ximo reabastecimiento"
+ ],
+ "Delivery address": [
+ "DirecciΓ³n de entrega"
+ ],
+ "this product has no taxes": [
+ "este producto no tiene impuestos"
+ ],
+ "Amount": [
+ "Monto"
+ ],
+ "currency and value separated with colon": [
+ "Moneda y valor separado por dos puntos"
+ ],
+ "Add": [
+ "Agregar"
+ ],
+ "Instance": [
+ "Instancia"
+ ],
+ "Settings": [
+ "ConfiguraciΓ³n"
+ ],
+ "Orders": [
+ "Ordenes"
+ ],
+ "Products": [
+ "Productos"
+ ],
+ "Transfers": [
+ "Transferencias"
+ ],
+ "Connection": [
+ "ConexiΓ³n"
+ ],
+ "Instances": [
+ "Instancias"
+ ],
+ "New": [
+ "Nuevo"
+ ],
+ "List": [
+ "Lista"
+ ],
+ "Log out": [
+ "Salir"
+ ],
+ "Clear": [
+ "Limpiar"
+ ],
+ "should be the same": [
+ "deberΓ­an ser iguales"
+ ],
+ "cannot be the same as before": [
+ "no puede ser igual al anterior"
+ ],
+ "You are updating the authorization token from instance %1$s with id %2$s": [
+ "EstΓ‘ actualizando el token de autorizaciΓ³n para la instancia %1$s con id %2$s"
+ ],
+ "Old token": [
+ "Viejo token"
+ ],
+ "New token": [
+ "Nuevo token"
+ ],
+ "Clearing the auth token will mean public access to the instance": [
+ "Limpiar el token de autorizaciΓ³n significa acceso publico a la instancia"
+ ],
+ "ID": [
+ "ID"
+ ],
+ "Image": [
+ "Imagen"
+ ],
+ "Unit": [
+ "Unidad"
+ ],
+ "Price": [
+ "Precio"
+ ],
+ "Stock": [
+ "Stock"
+ ],
+ "Taxes": [
+ "Impuesto"
+ ],
+ "Server not found": [
+ "Servidor no encontrado"
+ ],
+ "Couldn't access the server": [
+ "No se pudo aceder al servidor"
+ ],
+ "Got message %1$s from %2$s": [
+ "Recivimos el mensaje %1$s desde %2$s"
+ ],
+ "Unexpected Error": [
+ "Error inesperado"
+ ],
+ "Auth token": [
+ "Token de autorizaciΓ³n"
+ ],
+ "Account address": [
+ "DirecciΓ³n de cuenta"
+ ],
+ "Default max deposit fee": [
+ "Impuesto mΓ‘ximo de deposito por omisiΓ³n"
+ ],
+ "Default max wire fee": [
+ "Impuesto mΓ‘ximo de transferencia por omisiΓ³n"
+ ],
+ "Default wire fee amortization": [
+ "AmortizaciΓ³n de impuesto de transferencia por omisiΓ³n"
+ ],
+ "Jurisdiction": [
+ "JurisdicciΓ³n"
+ ],
+ "Default pay delay": [
+ "Retrazo de pago por omisiΓ³n"
+ ],
+ "Default wire transfer delay": [
+ "Retrazo de transferencia por omisiΓ³n"
+ ],
+ "could not create instance": [
+ "no se pudo crear la instancia"
+ ],
+ "Delete": [
+ "Borrando"
+ ],
+ "Edit": [
+ ""
+ ],
+ "There is no instances yet, add more pressing the + sign": [
+ "No hay instancias todavΓ­an, agregue mas presionando el signo +"
+ ],
+ "Inventory products": [
+ "Productos de inventario"
+ ],
+ "Total price": [
+ "Precio total"
+ ],
+ "Total tax": [
+ "Impuesto total"
+ ],
+ "Order price": [
+ "Precio de la orden"
+ ],
+ "Net": [
+ "Neto"
+ ],
+ "Summary": [
+ "Resumen"
+ ],
+ "Payments options": [
+ "Opciones de pago"
+ ],
+ "Auto refund deadline": [
+ "Plazo de reembolso automΓ‘tico"
+ ],
+ "Refund deadline": [
+ "Plazo de reembolso"
+ ],
+ "Pay deadline": [
+ "Plazo de pago"
+ ],
+ "Delivery date": [
+ "Fecha de entrega"
+ ],
+ "Location": [
+ "UbicaciΓ³n"
+ ],
+ "Max fee": [
+ "Impuesto mΓ‘ximo"
+ ],
+ "Max wire fee": [
+ "Impuesto de transferencia mΓ‘ximo"
+ ],
+ "Wire fee amortization": [
+ "AmortizaciΓ³n de impuesto de transferencia"
+ ],
+ "Fullfilment url": [
+ "URL de completitud"
+ ],
+ "Extra information": [
+ "InformaciΓ³n extra"
+ ],
+ "select a product first": [
+ "seleccione un producto primero"
+ ],
+ "should be greater than 0": [
+ "La imagen debe ser mas chica que 1 MB"
+ ],
+ "cannot be greater than current stock and quantity previously added. max: %1$s": [
+ "no puede ser mayor al stock actual y la cantidad previamente agregada. mΓ‘ximo: %1$s"
+ ],
+ "cannot be greater than current stock %1$s": [
+ "no puede ser mayor al stock actual %1$s"
+ ],
+ "Quantity": [
+ "Cantidad"
+ ],
+ "Order": [
+ "Orden"
+ ],
+ "claimed": [
+ "reclamado"
+ ],
+ "copy url": [
+ "copiar url"
+ ],
+ "pay at": [
+ "pagar en"
+ ],
+ "created at": [
+ "creado"
+ ],
+ "Timeline": [
+ "CronologΓ­a"
+ ],
+ "Payment details": [
+ "Detalles de pago"
+ ],
+ "Order status": [
+ "Estado de orden"
+ ],
+ "Product list": [
+ "Lista de producto"
+ ],
+ "paid": [
+ "pagados"
+ ],
+ "wired": [
+ "transferido"
+ ],
+ "refunded": [
+ "reembolzado"
+ ],
+ "refund": [
+ "reembolzar"
+ ],
+ "Refunded amount": [
+ "Monto reembolzado"
+ ],
+ "Deposit total": [
+ "Total depositado"
+ ],
+ "unpaid": [
+ "impago"
+ ],
+ "Order status URL": [
+ "URL de estado de orden"
+ ],
+ "Pay URI": [
+ "URI de pago"
+ ],
+ "Unknown order status. This is an error, please contact the administrator.": [
+ "Estado de orden desconocido. Esto es un error, por favor contacte a su administrador"
+ ],
+ "refund created successfully": [
+ "reembolzo creado satisfactoriamente"
+ ],
+ "could not create the refund": [
+ "No se pudo aceder al servidor"
+ ],
+ "load newer orders": [
+ "cargar nuevas ordenes"
+ ],
+ "Date": [
+ "Fecha"
+ ],
+ "Refund": [
+ "Reembolzar"
+ ],
+ "load older orders": [
+ "cargar viejas ordenes"
+ ],
+ "No orders has been found": [
+ "No se enconraron ordenes"
+ ],
+ "date": [
+ "fecha"
+ ],
+ "amount": [
+ "monto"
+ ],
+ "reason": [
+ "razΓ³n"
+ ],
+ "Max refundable:": [
+ "MΓ‘ximo reembolzable:"
+ ],
+ "Reason": [
+ "RazΓ³n"
+ ],
+ "duplicated": [
+ "duplicado"
+ ],
+ "requested by the customer": [
+ "pedido por el consumidor"
+ ],
+ "other": [
+ "otro"
+ ],
+ "go to order id": [
+ "ir a id de orden"
+ ],
+ "Paid": [
+ "Pagado"
+ ],
+ "Refunded": [
+ "Reembolzado"
+ ],
+ "Not wired": [
+ "No transferido"
+ ],
+ "All": [
+ "Todo"
+ ],
+ "could not create product": [
+ "no se pudo crear el producto"
+ ],
+ "Sell": [
+ "Venta"
+ ],
+ "Profit": [
+ "Ganancia"
+ ],
+ "Sold": [
+ "Vendido"
+ ],
+ "product updated successfully": [
+ "producto actualizado correctamente"
+ ],
+ "could not update the product": [
+ "no se pudo actualizar el producto"
+ ],
+ "product delete successfully": [
+ "producto fue eliminado correctamente"
+ ],
+ "could not delete the product": [
+ "no se pudo eliminar el producto"
+ ],
+ "Tips": [
+ "Propinas"
+ ],
+ "Committed amount": [
+ ""
+ ],
+ "Exchange initial amount": [
+ ""
+ ],
+ "Merchant initial amount": [
+ ""
+ ],
+ "There is no tips yet, add more pressing the + sign": [
+ "No hay propinas todavΓ­a, agregar mas presionando el signo +"
+ ],
+ "cannot be empty": [
+ "no puede ser vacΓ­o"
+ ],
+ "check the id, doest look valid": [
+ "verificar el id, no parece vΓ‘lido"
+ ],
+ "should have 52 characters, current %1$s": [
+ "deberΓ­a tener 52 caracteres, actualmente %1$s"
+ ],
+ "URL doesn't have the right format": [
+ "La URL no tiene el formato correcto"
+ ],
+ "Transfer ID": [
+ "Transferencias"
+ ],
+ "Account Address": [
+ "DirecciΓ³n de cuenta"
+ ],
+ "Exchange URL": [
+ "URL del Exchange"
+ ],
+ "could not inform transfer": [
+ "no se pudo crear la instancia"
+ ],
+ "load newer transfers": [
+ "cargar nuevas ordenes"
+ ],
+ "Credit": [
+ "CrΓ©dito"
+ ],
+ "Confirmed": [
+ "Confirmar"
+ ],
+ "Verified": [
+ "Verificado"
+ ],
+ "Executed at": [
+ "creado"
+ ],
+ "yes": [
+ "si"
+ ],
+ "no": [
+ "no"
+ ],
+ "unknown": [
+ "desconocido"
+ ],
+ "load older transfers": [
+ "cargar viejas transferencias"
+ ],
+ "There is no transfer yet, add more pressing the + sign": [
+ "No hay transferencias todavΓ­a, agregar mas presionando el signo +"
+ ]
+ }
+ }
+};
+
+strings['fr'] = {
+ "domain": "messages",
+ "locale_data": {
+ "messages": {
+ "": {
+ "domain": "messages",
+ "plural_forms": "nplurals=2; plural=(n != 1);",
+ "lang": ""
+ },
+ "Access denied": [
+ ""
+ ],
+ "Check your token is valid": [
+ ""
+ ],
+ "Couldn't access the server.": [
+ ""
+ ],
+ "Could not infer instance id from url %1$s": [
+ ""
+ ],
+ "HTTP status #%1$s: Server reported a problem": [
+ ""
+ ],
+ "Got message: \"%1$s\" from: %2$s": [
+ ""
+ ],
+ "No default instance": [
+ ""
+ ],
+ "in order to use merchant backoffice, you should create the default instance": [
+ ""
+ ],
+ "Server reported a problem: HTTP status #%1$s": [
+ ""
+ ],
+ "Got message: %1$s from: %2$s": [
+ ""
+ ],
+ "Login required": [
+ ""
+ ],
+ "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
+ ""
+ ],
+ "Confirm": [
+ ""
+ ],
+ "The value %1$s is invalid for a payment url": [
+ ""
+ ],
+ "pick a date": [
+ ""
+ ],
+ "clear": [
+ ""
+ ],
+ "never": [
+ ""
+ ],
+ "Image should be smaller than 1 MB": [
+ ""
+ ],
+ "Country": [
+ ""
+ ],
+ "Address": [
+ ""
+ ],
+ "Building number": [
+ ""
+ ],
+ "Building name": [
+ ""
+ ],
+ "Street": [
+ ""
+ ],
+ "Post code": [
+ ""
+ ],
+ "Town location": [
+ ""
+ ],
+ "Town": [
+ ""
+ ],
+ "District": [
+ ""
+ ],
+ "Country subdivision": [
+ ""
+ ],
+ "Product id": [
+ ""
+ ],
+ "Description": [
+ ""
+ ],
+ "Name": [
+ ""
+ ],
+ "loading...": [
+ ""
+ ],
+ "no products found": [
+ ""
+ ],
+ "no results": [
+ ""
+ ],
+ "Deleting": [
+ ""
+ ],
+ "Changing": [
+ ""
+ ],
+ "Manage token": [
+ ""
+ ],
+ "Update": [
+ ""
+ ],
+ "Remove": [
+ ""
+ ],
+ "Cancel": [
+ ""
+ ],
+ "Manage stock": [
+ ""
+ ],
+ "Infinite": [
+ ""
+ ],
+ "lost cannot be greater that current + incoming (max %1$s)": [
+ ""
+ ],
+ "current stock will change from %1$s to %2$s": [
+ ""
+ ],
+ "current stock will stay at %1$s": [
+ ""
+ ],
+ "Incoming": [
+ ""
+ ],
+ "Lost": [
+ ""
+ ],
+ "Current": [
+ ""
+ ],
+ "without stock": [
+ ""
+ ],
+ "Next restock": [
+ ""
+ ],
+ "Delivery address": [
+ ""
+ ],
+ "this product has no taxes": [
+ ""
+ ],
+ "Amount": [
+ ""
+ ],
+ "currency and value separated with colon": [
+ ""
+ ],
+ "Add": [
+ ""
+ ],
+ "Instance": [
+ ""
+ ],
+ "Settings": [
+ ""
+ ],
+ "Orders": [
+ ""
+ ],
+ "Products": [
+ ""
+ ],
+ "Transfers": [
+ ""
+ ],
+ "Connection": [
+ ""
+ ],
+ "Instances": [
+ ""
+ ],
+ "New": [
+ ""
+ ],
+ "List": [
+ ""
+ ],
+ "Log out": [
+ ""
+ ],
+ "Clear": [
+ ""
+ ],
+ "should be the same": [
+ ""
+ ],
+ "cannot be the same as before": [
+ ""
+ ],
+ "You are updating the authorization token from instance %1$s with id %2$s": [
+ ""
+ ],
+ "Old token": [
+ ""
+ ],
+ "New token": [
+ ""
+ ],
+ "Clearing the auth token will mean public access to the instance": [
+ ""
+ ],
+ "ID": [
+ ""
+ ],
+ "Image": [
+ ""
+ ],
+ "Unit": [
+ ""
+ ],
+ "Price": [
+ ""
+ ],
+ "Stock": [
+ ""
+ ],
+ "Taxes": [
+ ""
+ ],
+ "Server not found": [
+ ""
+ ],
+ "Couldn't access the server": [
+ ""
+ ],
+ "Got message %1$s from %2$s": [
+ ""
+ ],
+ "Unexpected Error": [
+ ""
+ ],
+ "Auth token": [
+ ""
+ ],
+ "Account address": [
+ ""
+ ],
+ "Default max deposit fee": [
+ ""
+ ],
+ "Default max wire fee": [
+ ""
+ ],
+ "Default wire fee amortization": [
+ ""
+ ],
+ "Jurisdiction": [
+ ""
+ ],
+ "Default pay delay": [
+ ""
+ ],
+ "Default wire transfer delay": [
+ ""
+ ],
+ "could not create instance": [
+ ""
+ ],
+ "Delete": [
+ ""
+ ],
+ "Edit": [
+ ""
+ ],
+ "There is no instances yet, add more pressing the + sign": [
+ ""
+ ],
+ "Inventory products": [
+ ""
+ ],
+ "Total price": [
+ ""
+ ],
+ "Total tax": [
+ ""
+ ],
+ "Order price": [
+ ""
+ ],
+ "Net": [
+ ""
+ ],
+ "Summary": [
+ ""
+ ],
+ "Payments options": [
+ ""
+ ],
+ "Auto refund deadline": [
+ ""
+ ],
+ "Refund deadline": [
+ ""
+ ],
+ "Pay deadline": [
+ ""
+ ],
+ "Delivery date": [
+ ""
+ ],
+ "Location": [
+ ""
+ ],
+ "Max fee": [
+ ""
+ ],
+ "Max wire fee": [
+ ""
+ ],
+ "Wire fee amortization": [
+ ""
+ ],
+ "Fullfilment url": [
+ ""
+ ],
+ "Extra information": [
+ ""
+ ],
+ "select a product first": [
+ ""
+ ],
+ "should be greater than 0": [
+ ""
+ ],
+ "cannot be greater than current stock and quantity previously added. max: %1$s": [
+ ""
+ ],
+ "cannot be greater than current stock %1$s": [
+ ""
+ ],
+ "Quantity": [
+ ""
+ ],
+ "Order": [
+ ""
+ ],
+ "claimed": [
+ ""
+ ],
+ "copy url": [
+ ""
+ ],
+ "pay at": [
+ ""
+ ],
+ "created at": [
+ ""
+ ],
+ "Timeline": [
+ ""
+ ],
+ "Payment details": [
+ ""
+ ],
+ "Order status": [
+ ""
+ ],
+ "Product list": [
+ ""
+ ],
+ "paid": [
+ ""
+ ],
+ "wired": [
+ ""
+ ],
+ "refunded": [
+ ""
+ ],
+ "refund": [
+ ""
+ ],
+ "Refunded amount": [
+ ""
+ ],
+ "Deposit total": [
+ ""
+ ],
+ "unpaid": [
+ ""
+ ],
+ "Order status URL": [
+ ""
+ ],
+ "Pay URI": [
+ ""
+ ],
+ "Unknown order status. This is an error, please contact the administrator.": [
+ ""
+ ],
+ "refund created successfully": [
+ ""
+ ],
+ "could not create the refund": [
+ ""
+ ],
+ "load newer orders": [
+ ""
+ ],
+ "Date": [
+ ""
+ ],
+ "Refund": [
+ ""
+ ],
+ "load older orders": [
+ ""
+ ],
+ "No orders has been found": [
+ ""
+ ],
+ "date": [
+ ""
+ ],
+ "amount": [
+ ""
+ ],
+ "reason": [
+ ""
+ ],
+ "Max refundable:": [
+ ""
+ ],
+ "Reason": [
+ ""
+ ],
+ "duplicated": [
+ ""
+ ],
+ "requested by the customer": [
+ ""
+ ],
+ "other": [
+ ""
+ ],
+ "go to order id": [
+ ""
+ ],
+ "Paid": [
+ ""
+ ],
+ "Refunded": [
+ ""
+ ],
+ "Not wired": [
+ ""
+ ],
+ "All": [
+ ""
+ ],
+ "could not create product": [
+ ""
+ ],
+ "Sell": [
+ ""
+ ],
+ "Profit": [
+ ""
+ ],
+ "Sold": [
+ ""
+ ],
+ "product updated successfully": [
+ ""
+ ],
+ "could not update the product": [
+ ""
+ ],
+ "product delete successfully": [
+ ""
+ ],
+ "could not delete the product": [
+ ""
+ ],
+ "Tips": [
+ ""
+ ],
+ "Committed amount": [
+ ""
+ ],
+ "Exchange initial amount": [
+ ""
+ ],
+ "Merchant initial amount": [
+ ""
+ ],
+ "There is no tips yet, add more pressing the + sign": [
+ ""
+ ],
+ "cannot be empty": [
+ ""
+ ],
+ "check the id, doest look valid": [
+ ""
+ ],
+ "should have 52 characters, current %1$s": [
+ ""
+ ],
+ "URL doesn't have the right format": [
+ ""
+ ],
+ "Transfer ID": [
+ ""
+ ],
+ "Account Address": [
+ ""
+ ],
+ "Exchange URL": [
+ ""
+ ],
+ "could not inform transfer": [
+ ""
+ ],
+ "load newer transfers": [
+ ""
+ ],
+ "Credit": [
+ ""
+ ],
+ "Confirmed": [
+ ""
+ ],
+ "Verified": [
+ ""
+ ],
+ "Executed at": [
+ ""
+ ],
+ "yes": [
+ ""
+ ],
+ "no": [
+ ""
+ ],
+ "unknown": [
+ ""
+ ],
+ "load older transfers": [
+ ""
+ ],
+ "There is no transfer yet, add more pressing the + sign": [
+ ""
+ ]
+ }
+ }
+};
+
+strings['it'] = {
+ "domain": "messages",
+ "locale_data": {
+ "messages": {
+ "": {
+ "domain": "messages",
+ "plural_forms": "nplurals=2; plural=(n != 1);",
+ "lang": ""
+ },
+ "Access denied": [
+ ""
+ ],
+ "Check your token is valid": [
+ ""
+ ],
+ "Couldn't access the server.": [
+ ""
+ ],
+ "Could not infer instance id from url %1$s": [
+ ""
+ ],
+ "HTTP status #%1$s: Server reported a problem": [
+ ""
+ ],
+ "Got message: \"%1$s\" from: %2$s": [
+ ""
+ ],
+ "No default instance": [
+ ""
+ ],
+ "in order to use merchant backoffice, you should create the default instance": [
+ ""
+ ],
+ "Server reported a problem: HTTP status #%1$s": [
+ ""
+ ],
+ "Got message: %1$s from: %2$s": [
+ ""
+ ],
+ "Login required": [
+ ""
+ ],
+ "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
+ ""
+ ],
+ "Confirm": [
+ ""
+ ],
+ "The value %1$s is invalid for a payment url": [
+ ""
+ ],
+ "pick a date": [
+ ""
+ ],
+ "clear": [
+ ""
+ ],
+ "never": [
+ ""
+ ],
+ "Image should be smaller than 1 MB": [
+ ""
+ ],
+ "Country": [
+ ""
+ ],
+ "Address": [
+ ""
+ ],
+ "Building number": [
+ ""
+ ],
+ "Building name": [
+ ""
+ ],
+ "Street": [
+ ""
+ ],
+ "Post code": [
+ ""
+ ],
+ "Town location": [
+ ""
+ ],
+ "Town": [
+ ""
+ ],
+ "District": [
+ ""
+ ],
+ "Country subdivision": [
+ ""
+ ],
+ "Product id": [
+ ""
+ ],
+ "Description": [
+ ""
+ ],
+ "Name": [
+ ""
+ ],
+ "loading...": [
+ ""
+ ],
+ "no products found": [
+ ""
+ ],
+ "no results": [
+ ""
+ ],
+ "Deleting": [
+ ""
+ ],
+ "Changing": [
+ ""
+ ],
+ "Manage token": [
+ ""
+ ],
+ "Update": [
+ ""
+ ],
+ "Remove": [
+ ""
+ ],
+ "Cancel": [
+ ""
+ ],
+ "Manage stock": [
+ ""
+ ],
+ "Infinite": [
+ ""
+ ],
+ "lost cannot be greater that current + incoming (max %1$s)": [
+ ""
+ ],
+ "current stock will change from %1$s to %2$s": [
+ ""
+ ],
+ "current stock will stay at %1$s": [
+ ""
+ ],
+ "Incoming": [
+ ""
+ ],
+ "Lost": [
+ ""
+ ],
+ "Current": [
+ ""
+ ],
+ "without stock": [
+ ""
+ ],
+ "Next restock": [
+ ""
+ ],
+ "Delivery address": [
+ ""
+ ],
+ "this product has no taxes": [
+ ""
+ ],
+ "Amount": [
+ ""
+ ],
+ "currency and value separated with colon": [
+ ""
+ ],
+ "Add": [
+ ""
+ ],
+ "Instance": [
+ ""
+ ],
+ "Settings": [
+ ""
+ ],
+ "Orders": [
+ ""
+ ],
+ "Products": [
+ ""
+ ],
+ "Transfers": [
+ ""
+ ],
+ "Connection": [
+ ""
+ ],
+ "Instances": [
+ ""
+ ],
+ "New": [
+ ""
+ ],
+ "List": [
+ ""
+ ],
+ "Log out": [
+ ""
+ ],
+ "Clear": [
+ ""
+ ],
+ "should be the same": [
+ ""
+ ],
+ "cannot be the same as before": [
+ ""
+ ],
+ "You are updating the authorization token from instance %1$s with id %2$s": [
+ ""
+ ],
+ "Old token": [
+ ""
+ ],
+ "New token": [
+ ""
+ ],
+ "Clearing the auth token will mean public access to the instance": [
+ ""
+ ],
+ "ID": [
+ ""
+ ],
+ "Image": [
+ ""
+ ],
+ "Unit": [
+ ""
+ ],
+ "Price": [
+ ""
+ ],
+ "Stock": [
+ ""
+ ],
+ "Taxes": [
+ ""
+ ],
+ "Server not found": [
+ ""
+ ],
+ "Couldn't access the server": [
+ ""
+ ],
+ "Got message %1$s from %2$s": [
+ ""
+ ],
+ "Unexpected Error": [
+ ""
+ ],
+ "Auth token": [
+ ""
+ ],
+ "Account address": [
+ ""
+ ],
+ "Default max deposit fee": [
+ ""
+ ],
+ "Default max wire fee": [
+ ""
+ ],
+ "Default wire fee amortization": [
+ ""
+ ],
+ "Jurisdiction": [
+ ""
+ ],
+ "Default pay delay": [
+ ""
+ ],
+ "Default wire transfer delay": [
+ ""
+ ],
+ "could not create instance": [
+ ""
+ ],
+ "Delete": [
+ ""
+ ],
+ "Edit": [
+ ""
+ ],
+ "There is no instances yet, add more pressing the + sign": [
+ ""
+ ],
+ "Inventory products": [
+ ""
+ ],
+ "Total price": [
+ ""
+ ],
+ "Total tax": [
+ ""
+ ],
+ "Order price": [
+ ""
+ ],
+ "Net": [
+ ""
+ ],
+ "Summary": [
+ ""
+ ],
+ "Payments options": [
+ ""
+ ],
+ "Auto refund deadline": [
+ ""
+ ],
+ "Refund deadline": [
+ ""
+ ],
+ "Pay deadline": [
+ ""
+ ],
+ "Delivery date": [
+ ""
+ ],
+ "Location": [
+ ""
+ ],
+ "Max fee": [
+ ""
+ ],
+ "Max wire fee": [
+ ""
+ ],
+ "Wire fee amortization": [
+ ""
+ ],
+ "Fullfilment url": [
+ ""
+ ],
+ "Extra information": [
+ ""
+ ],
+ "select a product first": [
+ ""
+ ],
+ "should be greater than 0": [
+ ""
+ ],
+ "cannot be greater than current stock and quantity previously added. max: %1$s": [
+ ""
+ ],
+ "cannot be greater than current stock %1$s": [
+ ""
+ ],
+ "Quantity": [
+ ""
+ ],
+ "Order": [
+ ""
+ ],
+ "claimed": [
+ ""
+ ],
+ "copy url": [
+ ""
+ ],
+ "pay at": [
+ ""
+ ],
+ "created at": [
+ ""
+ ],
+ "Timeline": [
+ ""
+ ],
+ "Payment details": [
+ ""
+ ],
+ "Order status": [
+ ""
+ ],
+ "Product list": [
+ ""
+ ],
+ "paid": [
+ ""
+ ],
+ "wired": [
+ ""
+ ],
+ "refunded": [
+ ""
+ ],
+ "refund": [
+ ""
+ ],
+ "Refunded amount": [
+ ""
+ ],
+ "Deposit total": [
+ ""
+ ],
+ "unpaid": [
+ ""
+ ],
+ "Order status URL": [
+ ""
+ ],
+ "Pay URI": [
+ ""
+ ],
+ "Unknown order status. This is an error, please contact the administrator.": [
+ ""
+ ],
+ "refund created successfully": [
+ ""
+ ],
+ "could not create the refund": [
+ ""
+ ],
+ "load newer orders": [
+ ""
+ ],
+ "Date": [
+ ""
+ ],
+ "Refund": [
+ ""
+ ],
+ "load older orders": [
+ ""
+ ],
+ "No orders has been found": [
+ ""
+ ],
+ "date": [
+ ""
+ ],
+ "amount": [
+ ""
+ ],
+ "reason": [
+ ""
+ ],
+ "Max refundable:": [
+ ""
+ ],
+ "Reason": [
+ ""
+ ],
+ "duplicated": [
+ ""
+ ],
+ "requested by the customer": [
+ ""
+ ],
+ "other": [
+ ""
+ ],
+ "go to order id": [
+ ""
+ ],
+ "Paid": [
+ ""
+ ],
+ "Refunded": [
+ ""
+ ],
+ "Not wired": [
+ ""
+ ],
+ "All": [
+ ""
+ ],
+ "could not create product": [
+ ""
+ ],
+ "Sell": [
+ ""
+ ],
+ "Profit": [
+ ""
+ ],
+ "Sold": [
+ ""
+ ],
+ "product updated successfully": [
+ ""
+ ],
+ "could not update the product": [
+ ""
+ ],
+ "product delete successfully": [
+ ""
+ ],
+ "could not delete the product": [
+ ""
+ ],
+ "Tips": [
+ ""
+ ],
+ "Committed amount": [
+ ""
+ ],
+ "Exchange initial amount": [
+ ""
+ ],
+ "Merchant initial amount": [
+ ""
+ ],
+ "There is no tips yet, add more pressing the + sign": [
+ ""
+ ],
+ "cannot be empty": [
+ ""
+ ],
+ "check the id, doest look valid": [
+ ""
+ ],
+ "should have 52 characters, current %1$s": [
+ ""
+ ],
+ "URL doesn't have the right format": [
+ ""
+ ],
+ "Transfer ID": [
+ ""
+ ],
+ "Account Address": [
+ ""
+ ],
+ "Exchange URL": [
+ ""
+ ],
+ "could not inform transfer": [
+ ""
+ ],
+ "load newer transfers": [
+ ""
+ ],
+ "Credit": [
+ ""
+ ],
+ "Confirmed": [
+ ""
+ ],
+ "Verified": [
+ ""
+ ],
+ "Executed at": [
+ ""
+ ],
+ "yes": [
+ ""
+ ],
+ "no": [
+ ""
+ ],
+ "unknown": [
+ ""
+ ],
+ "load older transfers": [
+ ""
+ ],
+ "There is no transfer yet, add more pressing the + sign": [
+ ""
+ ]
+ }
+ }
+};
+
+strings['sv'] = {
+ "domain": "messages",
+ "locale_data": {
+ "messages": {
+ "": {
+ "domain": "messages",
+ "plural_forms": "nplurals=2; plural=(n != 1);",
+ "lang": ""
+ },
+ "Access denied": [
+ ""
+ ],
+ "Check your token is valid": [
+ ""
+ ],
+ "Couldn't access the server.": [
+ ""
+ ],
+ "Could not infer instance id from url %1$s": [
+ ""
+ ],
+ "HTTP status #%1$s: Server reported a problem": [
+ ""
+ ],
+ "Got message: \"%1$s\" from: %2$s": [
+ ""
+ ],
+ "No default instance": [
+ ""
+ ],
+ "in order to use merchant backoffice, you should create the default instance": [
+ ""
+ ],
+ "Server reported a problem: HTTP status #%1$s": [
+ ""
+ ],
+ "Got message: %1$s from: %2$s": [
+ ""
+ ],
+ "Login required": [
+ ""
+ ],
+ "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
+ ""
+ ],
+ "Confirm": [
+ ""
+ ],
+ "The value %1$s is invalid for a payment url": [
+ ""
+ ],
+ "pick a date": [
+ ""
+ ],
+ "clear": [
+ ""
+ ],
+ "never": [
+ ""
+ ],
+ "Image should be smaller than 1 MB": [
+ ""
+ ],
+ "Country": [
+ ""
+ ],
+ "Address": [
+ ""
+ ],
+ "Building number": [
+ ""
+ ],
+ "Building name": [
+ ""
+ ],
+ "Street": [
+ ""
+ ],
+ "Post code": [
+ ""
+ ],
+ "Town location": [
+ ""
+ ],
+ "Town": [
+ ""
+ ],
+ "District": [
+ ""
+ ],
+ "Country subdivision": [
+ ""
+ ],
+ "Product id": [
+ ""
+ ],
+ "Description": [
+ ""
+ ],
+ "Name": [
+ ""
+ ],
+ "loading...": [
+ ""
+ ],
+ "no products found": [
+ ""
+ ],
+ "no results": [
+ ""
+ ],
+ "Deleting": [
+ ""
+ ],
+ "Changing": [
+ ""
+ ],
+ "Manage token": [
+ ""
+ ],
+ "Update": [
+ ""
+ ],
+ "Remove": [
+ ""
+ ],
+ "Cancel": [
+ ""
+ ],
+ "Manage stock": [
+ ""
+ ],
+ "Infinite": [
+ ""
+ ],
+ "lost cannot be greater that current + incoming (max %1$s)": [
+ ""
+ ],
+ "current stock will change from %1$s to %2$s": [
+ ""
+ ],
+ "current stock will stay at %1$s": [
+ ""
+ ],
+ "Incoming": [
+ ""
+ ],
+ "Lost": [
+ ""
+ ],
+ "Current": [
+ ""
+ ],
+ "without stock": [
+ ""
+ ],
+ "Next restock": [
+ ""
+ ],
+ "Delivery address": [
+ ""
+ ],
+ "this product has no taxes": [
+ ""
+ ],
+ "Amount": [
+ ""
+ ],
+ "currency and value separated with colon": [
+ ""
+ ],
+ "Add": [
+ ""
+ ],
+ "Instance": [
+ ""
+ ],
+ "Settings": [
+ ""
+ ],
+ "Orders": [
+ ""
+ ],
+ "Products": [
+ ""
+ ],
+ "Transfers": [
+ ""
+ ],
+ "Connection": [
+ ""
+ ],
+ "Instances": [
+ ""
+ ],
+ "New": [
+ ""
+ ],
+ "List": [
+ ""
+ ],
+ "Log out": [
+ ""
+ ],
+ "Clear": [
+ ""
+ ],
+ "should be the same": [
+ ""
+ ],
+ "cannot be the same as before": [
+ ""
+ ],
+ "You are updating the authorization token from instance %1$s with id %2$s": [
+ ""
+ ],
+ "Old token": [
+ ""
+ ],
+ "New token": [
+ ""
+ ],
+ "Clearing the auth token will mean public access to the instance": [
+ ""
+ ],
+ "ID": [
+ ""
+ ],
+ "Image": [
+ ""
+ ],
+ "Unit": [
+ ""
+ ],
+ "Price": [
+ ""
+ ],
+ "Stock": [
+ ""
+ ],
+ "Taxes": [
+ ""
+ ],
+ "Server not found": [
+ ""
+ ],
+ "Couldn't access the server": [
+ ""
+ ],
+ "Got message %1$s from %2$s": [
+ ""
+ ],
+ "Unexpected Error": [
+ ""
+ ],
+ "Auth token": [
+ ""
+ ],
+ "Account address": [
+ ""
+ ],
+ "Default max deposit fee": [
+ ""
+ ],
+ "Default max wire fee": [
+ ""
+ ],
+ "Default wire fee amortization": [
+ ""
+ ],
+ "Jurisdiction": [
+ ""
+ ],
+ "Default pay delay": [
+ ""
+ ],
+ "Default wire transfer delay": [
+ ""
+ ],
+ "could not create instance": [
+ ""
+ ],
+ "Delete": [
+ ""
+ ],
+ "Edit": [
+ ""
+ ],
+ "There is no instances yet, add more pressing the + sign": [
+ ""
+ ],
+ "Inventory products": [
+ ""
+ ],
+ "Total price": [
+ ""
+ ],
+ "Total tax": [
+ ""
+ ],
+ "Order price": [
+ ""
+ ],
+ "Net": [
+ ""
+ ],
+ "Summary": [
+ ""
+ ],
+ "Payments options": [
+ ""
+ ],
+ "Auto refund deadline": [
+ ""
+ ],
+ "Refund deadline": [
+ ""
+ ],
+ "Pay deadline": [
+ ""
+ ],
+ "Delivery date": [
+ ""
+ ],
+ "Location": [
+ ""
+ ],
+ "Max fee": [
+ ""
+ ],
+ "Max wire fee": [
+ ""
+ ],
+ "Wire fee amortization": [
+ ""
+ ],
+ "Fullfilment url": [
+ ""
+ ],
+ "Extra information": [
+ ""
+ ],
+ "select a product first": [
+ ""
+ ],
+ "should be greater than 0": [
+ ""
+ ],
+ "cannot be greater than current stock and quantity previously added. max: %1$s": [
+ ""
+ ],
+ "cannot be greater than current stock %1$s": [
+ ""
+ ],
+ "Quantity": [
+ ""
+ ],
+ "Order": [
+ ""
+ ],
+ "claimed": [
+ ""
+ ],
+ "copy url": [
+ ""
+ ],
+ "pay at": [
+ ""
+ ],
+ "created at": [
+ ""
+ ],
+ "Timeline": [
+ ""
+ ],
+ "Payment details": [
+ ""
+ ],
+ "Order status": [
+ ""
+ ],
+ "Product list": [
+ ""
+ ],
+ "paid": [
+ ""
+ ],
+ "wired": [
+ ""
+ ],
+ "refunded": [
+ ""
+ ],
+ "refund": [
+ ""
+ ],
+ "Refunded amount": [
+ ""
+ ],
+ "Deposit total": [
+ ""
+ ],
+ "unpaid": [
+ ""
+ ],
+ "Order status URL": [
+ ""
+ ],
+ "Pay URI": [
+ ""
+ ],
+ "Unknown order status. This is an error, please contact the administrator.": [
+ ""
+ ],
+ "refund created successfully": [
+ ""
+ ],
+ "could not create the refund": [
+ ""
+ ],
+ "load newer orders": [
+ ""
+ ],
+ "Date": [
+ ""
+ ],
+ "Refund": [
+ ""
+ ],
+ "load older orders": [
+ ""
+ ],
+ "No orders has been found": [
+ ""
+ ],
+ "date": [
+ ""
+ ],
+ "amount": [
+ ""
+ ],
+ "reason": [
+ ""
+ ],
+ "Max refundable:": [
+ ""
+ ],
+ "Reason": [
+ ""
+ ],
+ "duplicated": [
+ ""
+ ],
+ "requested by the customer": [
+ ""
+ ],
+ "other": [
+ ""
+ ],
+ "go to order id": [
+ ""
+ ],
+ "Paid": [
+ ""
+ ],
+ "Refunded": [
+ ""
+ ],
+ "Not wired": [
+ ""
+ ],
+ "All": [
+ ""
+ ],
+ "could not create product": [
+ ""
+ ],
+ "Sell": [
+ ""
+ ],
+ "Profit": [
+ ""
+ ],
+ "Sold": [
+ ""
+ ],
+ "product updated successfully": [
+ ""
+ ],
+ "could not update the product": [
+ ""
+ ],
+ "product delete successfully": [
+ ""
+ ],
+ "could not delete the product": [
+ ""
+ ],
+ "Tips": [
+ ""
+ ],
+ "Committed amount": [
+ ""
+ ],
+ "Exchange initial amount": [
+ ""
+ ],
+ "Merchant initial amount": [
+ ""
+ ],
+ "There is no tips yet, add more pressing the + sign": [
+ ""
+ ],
+ "cannot be empty": [
+ ""
+ ],
+ "check the id, doest look valid": [
+ ""
+ ],
+ "should have 52 characters, current %1$s": [
+ ""
+ ],
+ "URL doesn't have the right format": [
+ ""
+ ],
+ "Transfer ID": [
+ ""
+ ],
+ "Account Address": [
+ ""
+ ],
+ "Exchange URL": [
+ ""
+ ],
+ "could not inform transfer": [
+ ""
+ ],
+ "load newer transfers": [
+ ""
+ ],
+ "Credit": [
+ ""
+ ],
+ "Confirmed": [
+ ""
+ ],
+ "Verified": [
+ ""
+ ],
+ "Executed at": [
+ ""
+ ],
+ "yes": [
+ ""
+ ],
+ "no": [
+ ""
+ ],
+ "unknown": [
+ ""
+ ],
+ "load older transfers": [
+ ""
+ ],
+ "There is no transfer yet, add more pressing the + sign": [
+ ""
+ ]
+ }
+ }
+};
+
diff --git a/packages/backend/src/i18n/sv.po b/packages/backend/src/i18n/sv.po
new file mode 100644
index 0000000..6b35bd0
--- /dev/null
+++ b/packages/backend/src/i18n/sv.po
@@ -0,0 +1,1057 @@
+# This file is part of TALER
+# (C) 2016 GNUnet e.V.
+#
+# 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.
+#
+# 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
+# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Taler Wallet\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-11-23 00:00+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/ApplicationReadyRoutes.tsx:50 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:299
+#, c-format
+msgid "Access denied"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:51 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:300
+#, c-format
+msgid "Check your token is valid"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:72
+#, c-format
+msgid "Couldn't access the server."
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:73
+#, c-format
+msgid "Could not infer instance id from url %1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:109
+#, c-format
+msgid "HTTP status #%1$s: Server reported a problem"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:110
+#, c-format
+msgid "Got message: \"%1$s\" from: %2$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:127
+#, c-format
+msgid "No default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:128
+#, c-format
+msgid ""
+"in order to use merchant backoffice, you should create the default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:288
+#, c-format
+msgid "Server reported a problem: HTTP status #%1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:289
+#, c-format
+msgid "Got message: %1$s from: %2$s"
+msgstr ""
+
+#: src/components/exception/login.tsx:46
+#, c-format
+msgid "Login required"
+msgstr ""
+
+#: src/components/exception/login.tsx:49
+#, c-format
+msgid ""
+"Please enter your auth token. Token should have \"secret-token:\" and start "
+"with Bearer or ApiKey"
+msgstr ""
+
+#: src/components/exception/login.tsx:86 src/components/modal/index.tsx:53
+#: src/components/modal/index.tsx:75 src/paths/admin/create/CreatePage.tsx:115
+#: src/paths/instance/orders/create/CreatePage.tsx:325
+#: src/paths/instance/products/create/CreatePage.tsx:51
+#: src/paths/instance/products/list/Table.tsx:174
+#: src/paths/instance/products/list/Table.tsx:228
+#: src/paths/instance/products/update/UpdatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:134
+#, c-format
+msgid "Confirm"
+msgstr ""
+
+#: src/components/form/InputArray.tsx:72
+#, c-format
+msgid "The value %1$s is invalid for a payment url"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:67
+#: src/paths/instance/orders/list/index.tsx:123
+#, c-format
+msgid "pick a date"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:81
+#, c-format
+msgid "clear"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:83
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "never"
+msgstr ""
+
+#: src/components/form/InputImage.tsx:80
+#, c-format
+msgid "Image should be smaller than 1 MB"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:28
+#, c-format
+msgid "Country"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:30
+#: src/paths/admin/create/CreatePage.tsx:99
+#: src/paths/instance/transfers/list/Table.tsx:124
+#: src/paths/instance/update/UpdatePage.tsx:118
+#, c-format
+msgid "Address"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:34
+#, c-format
+msgid "Building number"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:35
+#, c-format
+msgid "Building name"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:36
+#, c-format
+msgid "Street"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:37
+#, c-format
+msgid "Post code"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:38
+#, c-format
+msgid "Town location"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:39
+#, c-format
+msgid "Town"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:40
+#, c-format
+msgid "District"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:41
+#, c-format
+msgid "Country subdivision"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:59
+#, c-format
+msgid "Product id"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:60
+#: src/components/product/ProductForm.tsx:99
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:122
+#: src/paths/instance/orders/list/Table.tsx:227
+#: src/paths/instance/products/list/Table.tsx:86
+#, c-format
+msgid "Description"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:73
+#: src/components/form/InputTaxes.tsx:81
+#: src/paths/admin/create/CreatePage.tsx:87 src/paths/admin/list/Table.tsx:110
+#: src/paths/instance/details/DetailPage.tsx:76
+#: src/paths/instance/update/UpdatePage.tsx:106
+#, c-format
+msgid "Name"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:102
+#, c-format
+msgid "loading..."
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:108
+#, c-format
+msgid "no products found"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:116
+#, c-format
+msgid "no results"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:33
+#, c-format
+msgid "Deleting"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:34
+#, c-format
+msgid "Changing"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:60
+#, c-format
+msgid "Manage token"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:83
+#, c-format
+msgid "Update"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:100
+#: src/paths/instance/orders/create/CreatePage.tsx:252
+#: src/paths/instance/orders/create/CreatePage.tsx:273
+#, c-format
+msgid "Remove"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:106 src/components/modal/index.tsx:52
+#: src/components/modal/index.tsx:73 src/paths/admin/create/CreatePage.tsx:114
+#: src/paths/instance/orders/create/CreatePage.tsx:324
+#: src/paths/instance/products/create/CreatePage.tsx:50
+#: src/paths/instance/products/list/Table.tsx:166
+#: src/paths/instance/products/list/Table.tsx:218
+#: src/paths/instance/products/update/UpdatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:88
+#: src/paths/instance/update/UpdatePage.tsx:133
+#, c-format
+msgid "Cancel"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:91
+#, c-format
+msgid "Manage stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:93
+#, c-format
+msgid "Infinite"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:105
+#, c-format
+msgid "lost cannot be greater that current + incoming (max %1$s)"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:111
+#, c-format
+msgid "current stock will change from %1$s to %2$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:112
+#, c-format
+msgid "current stock will stay at %1$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:129
+#: src/paths/instance/products/list/Table.tsx:204
+#, c-format
+msgid "Incoming"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:130
+#: src/paths/instance/products/list/Table.tsx:205
+#, c-format
+msgid "Lost"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:142
+#, c-format
+msgid "Current"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:145
+#, c-format
+msgid "without stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:150
+#, c-format
+msgid "Next restock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:152
+#, c-format
+msgid "Delivery address"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:73
+#, c-format
+msgid "this product has no taxes"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:77
+#: src/paths/instance/orders/details/DetailPage.tsx:145
+#: src/paths/instance/orders/details/DetailPage.tsx:296
+#: src/paths/instance/orders/list/Table.tsx:116
+#: src/paths/instance/transfers/create/CreatePage.tsx:84
+#, c-format
+msgid "Amount"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:78
+#, c-format
+msgid "currency and value separated with colon"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:84
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:78
+#, c-format
+msgid "Add"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:53
+#, c-format
+msgid "Instance"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:59
+#, c-format
+msgid "Settings"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:65
+#: src/paths/instance/orders/list/Table.tsx:60
+#, c-format
+msgid "Orders"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:71
+#: src/paths/instance/orders/create/CreatePage.tsx:258
+#: src/paths/instance/products/list/Table.tsx:48
+#, c-format
+msgid "Products"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:77
+#: src/paths/instance/transfers/list/Table.tsx:65
+#, c-format
+msgid "Transfers"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:87
+#, c-format
+msgid "Connection"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:112 src/paths/admin/list/Table.tsx:57
+#, c-format
+msgid "Instances"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:116
+#, c-format
+msgid "New"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:122
+#, c-format
+msgid "List"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:129
+#, c-format
+msgid "Log out"
+msgstr ""
+
+#: src/components/modal/index.tsx:74
+#, c-format
+msgid "Clear"
+msgstr ""
+
+#: src/components/modal/index.tsx:110 src/components/modal/index.tsx:111
+#, c-format
+msgid "should be the same"
+msgstr ""
+
+#: src/components/modal/index.tsx:111
+#, c-format
+msgid "cannot be the same as before"
+msgstr ""
+
+#: src/components/modal/index.tsx:114
+#, c-format
+msgid ""
+"You are updating the authorization token from instance %1$s with id %2$s"
+msgstr ""
+
+#: src/components/modal/index.tsx:124
+#, c-format
+msgid "Old token"
+msgstr ""
+
+#: src/components/modal/index.tsx:125
+#, c-format
+msgid "New token"
+msgstr ""
+
+#: src/components/modal/index.tsx:127
+#, c-format
+msgid "Clearing the auth token will mean public access to the instance"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:96
+#: src/paths/admin/create/CreatePage.tsx:85 src/paths/admin/list/Table.tsx:109
+#: src/paths/instance/transfers/list/Table.tsx:122
+#, c-format
+msgid "ID"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:98
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:121
+#: src/paths/instance/products/list/Table.tsx:85
+#, c-format
+msgid "Image"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:100
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:123
+#, c-format
+msgid "Unit"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:101
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:124
+#: src/paths/instance/products/list/Table.tsx:162
+#: src/paths/instance/products/list/Table.tsx:214
+#, c-format
+msgid "Price"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:103
+#: src/paths/instance/products/list/Table.tsx:90
+#, c-format
+msgid "Stock"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:105
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:128
+#: src/paths/instance/products/list/Table.tsx:88
+#, c-format
+msgid "Taxes"
+msgstr ""
+
+#: src/index.tsx:75
+#, c-format
+msgid "Server not found"
+msgstr ""
+
+#: src/index.tsx:85
+#, c-format
+msgid "Couldn't access the server"
+msgstr ""
+
+#: src/index.tsx:87 src/index.tsx:99
+#, c-format
+msgid "Got message %1$s from %2$s"
+msgstr ""
+
+#: src/index.tsx:97
+#, c-format
+msgid "Unexpected Error"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:108
+#, c-format
+msgid "Auth token"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:91
+#: src/paths/instance/details/DetailPage.tsx:77
+#: src/paths/instance/update/UpdatePage.tsx:110
+#, c-format
+msgid "Account address"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:93
+#: src/paths/instance/update/UpdatePage.tsx:112
+#, c-format
+msgid "Default max deposit fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:95
+#: src/paths/instance/update/UpdatePage.tsx:114
+#, c-format
+msgid "Default max wire fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:97
+#: src/paths/instance/update/UpdatePage.tsx:116
+#, c-format
+msgid "Default wire fee amortization"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:103
+#: src/paths/instance/update/UpdatePage.tsx:122
+#, c-format
+msgid "Jurisdiction"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:107
+#: src/paths/instance/update/UpdatePage.tsx:126
+#, c-format
+msgid "Default pay delay"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:109
+#: src/paths/instance/update/UpdatePage.tsx:128
+#, c-format
+msgid "Default wire transfer delay"
+msgstr ""
+
+#: src/paths/admin/create/index.tsx:58
+#, c-format
+msgid "could not create instance"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:63 src/paths/admin/list/Table.tsx:131
+#: src/paths/instance/transfers/list/Table.tsx:71
+#, c-format
+msgid "Delete"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:128
+#, c-format
+msgid "Edit"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:149
+#: src/paths/instance/products/list/Table.tsx:245
+#, c-format
+msgid "There is no instances yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:237
+#, c-format
+msgid "Inventory products"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:286
+#, c-format
+msgid "Total price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:287
+#, c-format
+msgid "Total tax"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:289
+#: src/paths/instance/orders/create/CreatePage.tsx:297
+#, c-format
+msgid "Order price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:295
+#, c-format
+msgid "Net"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:300
+#: src/paths/instance/orders/details/DetailPage.tsx:144
+#: src/paths/instance/orders/details/DetailPage.tsx:295
+#: src/paths/instance/orders/list/Table.tsx:117
+#, c-format
+msgid "Summary"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:302
+#, c-format
+msgid "Payments options"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:303
+#, c-format
+msgid "Auto refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:304
+#, c-format
+msgid "Refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:305
+#, c-format
+msgid "Pay deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:307
+#, c-format
+msgid "Delivery date"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:308
+#, c-format
+msgid "Location"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:312
+#, c-format
+msgid "Max fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:313
+#, c-format
+msgid "Max wire fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:314
+#, c-format
+msgid "Wire fee amortization"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:315
+#, c-format
+msgid "Fullfilment url"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:318
+#, c-format
+msgid "Extra information"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:44
+#, c-format
+msgid "select a product first"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:51
+#, c-format
+msgid "should be greater than 0"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:58
+#, c-format
+msgid ""
+"cannot be greater than current stock and quantity previously added. max: %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:64
+#, c-format
+msgid "cannot be greater than current stock %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:76
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:126
+#, c-format
+msgid "Quantity"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:92
+#: src/paths/instance/orders/details/DetailPage.tsx:235
+#: src/paths/instance/orders/details/DetailPage.tsx:333
+#, c-format
+msgid "Order"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:93
+#, c-format
+msgid "claimed"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:110
+#: src/paths/instance/orders/details/DetailPage.tsx:261
+#: src/paths/instance/orders/list/Table.tsx:136
+#, c-format
+msgid "copy url"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:126
+#: src/paths/instance/orders/details/DetailPage.tsx:349
+#, c-format
+msgid "pay at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:127
+#: src/paths/instance/orders/details/DetailPage.tsx:350
+#, c-format
+msgid "created at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:138
+#: src/paths/instance/orders/details/DetailPage.tsx:289
+#, c-format
+msgid "Timeline"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:142
+#: src/paths/instance/orders/details/DetailPage.tsx:293
+#, c-format
+msgid "Payment details"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:146
+#: src/paths/instance/orders/details/DetailPage.tsx:299
+#: src/paths/instance/orders/details/DetailPage.tsx:363
+#, c-format
+msgid "Order status"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:156
+#: src/paths/instance/orders/details/DetailPage.tsx:308
+#, c-format
+msgid "Product list"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:236
+#, c-format
+msgid "paid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:238
+#, c-format
+msgid "wired"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:241
+#, c-format
+msgid "refunded"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:258
+#, c-format
+msgid "refund"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:297
+#, c-format
+msgid "Refunded amount"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:298
+#, c-format
+msgid "Deposit total"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:336
+#, c-format
+msgid "unpaid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:364
+#, c-format
+msgid "Order status URL"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:365
+#, c-format
+msgid "Pay URI"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:383
+#, c-format
+msgid ""
+"Unknown order status. This is an error, please contact the administrator."
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:56
+#: src/paths/instance/orders/list/index.tsx:147
+#, c-format
+msgid "refund created successfully"
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:59
+#: src/paths/instance/orders/list/index.tsx:150
+#, c-format
+msgid "could not create the refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:111
+#, c-format
+msgid "load newer orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:115
+#, c-format
+msgid "Date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:131
+#: src/paths/instance/orders/list/Table.tsx:223
+#, c-format
+msgid "Refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:145
+#, c-format
+msgid "load older orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:154
+#, c-format
+msgid "No orders has been found"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:202
+#, c-format
+msgid "date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:203
+#, c-format
+msgid "amount"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:204
+#, c-format
+msgid "reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:224
+#, c-format
+msgid "Max refundable:"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "Reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "duplicated"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "requested by the customer"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "other"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:91
+#, c-format
+msgid "go to order id"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:107
+#, c-format
+msgid "Paid"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:108
+#, c-format
+msgid "Refunded"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:109
+#, c-format
+msgid "Not wired"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:110
+#, c-format
+msgid "All"
+msgstr ""
+
+#: src/paths/instance/products/create/index.tsx:48
+#: src/paths/instance/products/update/index.tsx:64
+#, c-format
+msgid "could not create product"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:87
+#, c-format
+msgid "Sell"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:89
+#, c-format
+msgid "Profit"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:91
+#, c-format
+msgid "Sold"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:59
+#, c-format
+msgid "product updated successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:62
+#, c-format
+msgid "could not update the product"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:70
+#, c-format
+msgid "product delete successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:73
+#, c-format
+msgid "could not delete the product"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:59
+#, c-format
+msgid "Tips"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:111
+#, c-format
+msgid "Committed amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:112
+#, c-format
+msgid "Exchange initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:113
+#, c-format
+msgid "Merchant initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:148
+#, c-format
+msgid "There is no tips yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:50
+#: src/paths/instance/transfers/create/CreatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:56
+#, c-format
+msgid "cannot be empty"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:51
+#, c-format
+msgid "check the id, doest look valid"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:52
+#, c-format
+msgid "should have 52 characters, current %1$s"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:57
+#, c-format
+msgid "URL doesn't have the right format"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:74
+#, c-format
+msgid "Transfer ID"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:76
+#, c-format
+msgid "Account Address"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:82
+#: src/paths/instance/transfers/list/Table.tsx:125
+#, c-format
+msgid "Exchange URL"
+msgstr ""
+
+#: src/paths/instance/transfers/create/index.tsx:49
+#, c-format
+msgid "could not inform transfer"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:118
+#, c-format
+msgid "load newer transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:123
+#, c-format
+msgid "Credit"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:126
+#, c-format
+msgid "Confirmed"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:127
+#: src/paths/instance/transfers/list/index.tsx:60
+#, c-format
+msgid "Verified"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:128
+#, c-format
+msgid "Executed at"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "yes"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "no"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "unknown"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:145
+#, c-format
+msgid "load older transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:154
+#, c-format
+msgid "There is no transfer yet, add more pressing the + sign"
+msgstr ""
diff --git a/packages/backend/src/i18n/taler-merchant-backoffice.pot b/packages/backend/src/i18n/taler-merchant-backoffice.pot
new file mode 100644
index 0000000..21fd863
--- /dev/null
+++ b/packages/backend/src/i18n/taler-merchant-backoffice.pot
@@ -0,0 +1,1054 @@
+# This file is part of GNU Taler
+# (C) 2021 Taler Systems S.A.
+# 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/>
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Taler Wallet\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-11-23 00:00+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/ApplicationReadyRoutes.tsx:50 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:299
+#, c-format
+msgid "Access denied"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:51 src/InstanceRoutes.tsx:118
+#: src/InstanceRoutes.tsx:300
+#, c-format
+msgid "Check your token is valid"
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:72
+#, c-format
+msgid "Couldn't access the server."
+msgstr ""
+
+#: src/ApplicationReadyRoutes.tsx:73
+#, c-format
+msgid "Could not infer instance id from url %1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:109
+#, c-format
+msgid "HTTP status #%1$s: Server reported a problem"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:110
+#, c-format
+msgid "Got message: \"%1$s\" from: %2$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:127
+#, c-format
+msgid "No default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:128
+#, c-format
+msgid ""
+"in order to use merchant backoffice, you should create the default instance"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:288
+#, c-format
+msgid "Server reported a problem: HTTP status #%1$s"
+msgstr ""
+
+#: src/InstanceRoutes.tsx:289
+#, c-format
+msgid "Got message: %1$s from: %2$s"
+msgstr ""
+
+#: src/components/exception/login.tsx:46
+#, c-format
+msgid "Login required"
+msgstr ""
+
+#: src/components/exception/login.tsx:49
+#, c-format
+msgid ""
+"Please enter your auth token. Token should have \"secret-token:\" and start "
+"with Bearer or ApiKey"
+msgstr ""
+
+#: src/components/exception/login.tsx:86 src/components/modal/index.tsx:53
+#: src/components/modal/index.tsx:75 src/paths/admin/create/CreatePage.tsx:115
+#: src/paths/instance/orders/create/CreatePage.tsx:325
+#: src/paths/instance/products/create/CreatePage.tsx:51
+#: src/paths/instance/products/list/Table.tsx:174
+#: src/paths/instance/products/list/Table.tsx:228
+#: src/paths/instance/products/update/UpdatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:134
+#, c-format
+msgid "Confirm"
+msgstr ""
+
+#: src/components/form/InputArray.tsx:72
+#, c-format
+msgid "The value %1$s is invalid for a payment url"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:67
+#: src/paths/instance/orders/list/index.tsx:123
+#, c-format
+msgid "pick a date"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:81
+#, c-format
+msgid "clear"
+msgstr ""
+
+#: src/components/form/InputDate.tsx:83
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "never"
+msgstr ""
+
+#: src/components/form/InputImage.tsx:80
+#, c-format
+msgid "Image should be smaller than 1 MB"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:28
+#, c-format
+msgid "Country"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:30
+#: src/paths/admin/create/CreatePage.tsx:99
+#: src/paths/instance/transfers/list/Table.tsx:124
+#: src/paths/instance/update/UpdatePage.tsx:118
+#, c-format
+msgid "Address"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:34
+#, c-format
+msgid "Building number"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:35
+#, c-format
+msgid "Building name"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:36
+#, c-format
+msgid "Street"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:37
+#, c-format
+msgid "Post code"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:38
+#, c-format
+msgid "Town location"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:39
+#, c-format
+msgid "Town"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:40
+#, c-format
+msgid "District"
+msgstr ""
+
+#: src/components/form/InputLocation.tsx:41
+#, c-format
+msgid "Country subdivision"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:59
+#, c-format
+msgid "Product id"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:60
+#: src/components/product/ProductForm.tsx:99
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:122
+#: src/paths/instance/orders/list/Table.tsx:227
+#: src/paths/instance/products/list/Table.tsx:86
+#, c-format
+msgid "Description"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:73
+#: src/components/form/InputTaxes.tsx:81
+#: src/paths/admin/create/CreatePage.tsx:87 src/paths/admin/list/Table.tsx:110
+#: src/paths/instance/details/DetailPage.tsx:76
+#: src/paths/instance/update/UpdatePage.tsx:106
+#, c-format
+msgid "Name"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:102
+#, c-format
+msgid "loading..."
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:108
+#, c-format
+msgid "no products found"
+msgstr ""
+
+#: src/components/form/InputSearchProduct.tsx:116
+#, c-format
+msgid "no results"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:33
+#, c-format
+msgid "Deleting"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:34
+#, c-format
+msgid "Changing"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:60
+#, c-format
+msgid "Manage token"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:83
+#, c-format
+msgid "Update"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:100
+#: src/paths/instance/orders/create/CreatePage.tsx:252
+#: src/paths/instance/orders/create/CreatePage.tsx:273
+#, c-format
+msgid "Remove"
+msgstr ""
+
+#: src/components/form/InputSecured.tsx:106 src/components/modal/index.tsx:52
+#: src/components/modal/index.tsx:73 src/paths/admin/create/CreatePage.tsx:114
+#: src/paths/instance/orders/create/CreatePage.tsx:324
+#: src/paths/instance/products/create/CreatePage.tsx:50
+#: src/paths/instance/products/list/Table.tsx:166
+#: src/paths/instance/products/list/Table.tsx:218
+#: src/paths/instance/products/update/UpdatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:88
+#: src/paths/instance/update/UpdatePage.tsx:133
+#, c-format
+msgid "Cancel"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:91
+#, c-format
+msgid "Manage stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:93
+#, c-format
+msgid "Infinite"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:105
+#, c-format
+msgid "lost cannot be greater that current + incoming (max %1$s)"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:111
+#, c-format
+msgid "current stock will change from %1$s to %2$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:112
+#, c-format
+msgid "current stock will stay at %1$s"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:129
+#: src/paths/instance/products/list/Table.tsx:204
+#, c-format
+msgid "Incoming"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:130
+#: src/paths/instance/products/list/Table.tsx:205
+#, c-format
+msgid "Lost"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:142
+#, c-format
+msgid "Current"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:145
+#, c-format
+msgid "without stock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:150
+#, c-format
+msgid "Next restock"
+msgstr ""
+
+#: src/components/form/InputStock.tsx:152
+#, c-format
+msgid "Delivery address"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:73
+#, c-format
+msgid "this product has no taxes"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:77
+#: src/paths/instance/orders/details/DetailPage.tsx:145
+#: src/paths/instance/orders/details/DetailPage.tsx:296
+#: src/paths/instance/orders/list/Table.tsx:116
+#: src/paths/instance/transfers/create/CreatePage.tsx:84
+#, c-format
+msgid "Amount"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:78
+#, c-format
+msgid "currency and value separated with colon"
+msgstr ""
+
+#: src/components/form/InputTaxes.tsx:84
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:78
+#, c-format
+msgid "Add"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:53
+#, c-format
+msgid "Instance"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:59
+#, c-format
+msgid "Settings"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:65
+#: src/paths/instance/orders/list/Table.tsx:60
+#, c-format
+msgid "Orders"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:71
+#: src/paths/instance/orders/create/CreatePage.tsx:258
+#: src/paths/instance/products/list/Table.tsx:48
+#, c-format
+msgid "Products"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:77
+#: src/paths/instance/transfers/list/Table.tsx:65
+#, c-format
+msgid "Transfers"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:87
+#, c-format
+msgid "Connection"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:112 src/paths/admin/list/Table.tsx:57
+#, c-format
+msgid "Instances"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:116
+#, c-format
+msgid "New"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:122
+#, c-format
+msgid "List"
+msgstr ""
+
+#: src/components/menu/SideBar.tsx:129
+#, c-format
+msgid "Log out"
+msgstr ""
+
+#: src/components/modal/index.tsx:74
+#, c-format
+msgid "Clear"
+msgstr ""
+
+#: src/components/modal/index.tsx:110 src/components/modal/index.tsx:111
+#, c-format
+msgid "should be the same"
+msgstr ""
+
+#: src/components/modal/index.tsx:111
+#, c-format
+msgid "cannot be the same as before"
+msgstr ""
+
+#: src/components/modal/index.tsx:114
+#, c-format
+msgid ""
+"You are updating the authorization token from instance %1$s with id %2$s"
+msgstr ""
+
+#: src/components/modal/index.tsx:124
+#, c-format
+msgid "Old token"
+msgstr ""
+
+#: src/components/modal/index.tsx:125
+#, c-format
+msgid "New token"
+msgstr ""
+
+#: src/components/modal/index.tsx:127
+#, c-format
+msgid "Clearing the auth token will mean public access to the instance"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:96
+#: src/paths/admin/create/CreatePage.tsx:85 src/paths/admin/list/Table.tsx:109
+#: src/paths/instance/transfers/list/Table.tsx:122
+#, c-format
+msgid "ID"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:98
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:121
+#: src/paths/instance/products/list/Table.tsx:85
+#, c-format
+msgid "Image"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:100
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:123
+#, c-format
+msgid "Unit"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:101
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:124
+#: src/paths/instance/products/list/Table.tsx:162
+#: src/paths/instance/products/list/Table.tsx:214
+#, c-format
+msgid "Price"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:103
+#: src/paths/instance/products/list/Table.tsx:90
+#, c-format
+msgid "Stock"
+msgstr ""
+
+#: src/components/product/ProductForm.tsx:105
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:128
+#: src/paths/instance/products/list/Table.tsx:88
+#, c-format
+msgid "Taxes"
+msgstr ""
+
+#: src/index.tsx:75
+#, c-format
+msgid "Server not found"
+msgstr ""
+
+#: src/index.tsx:85
+#, c-format
+msgid "Couldn't access the server"
+msgstr ""
+
+#: src/index.tsx:87 src/index.tsx:99
+#, c-format
+msgid "Got message %1$s from %2$s"
+msgstr ""
+
+#: src/index.tsx:97
+#, c-format
+msgid "Unexpected Error"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:89
+#: src/paths/instance/update/UpdatePage.tsx:108
+#, c-format
+msgid "Auth token"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:91
+#: src/paths/instance/details/DetailPage.tsx:77
+#: src/paths/instance/update/UpdatePage.tsx:110
+#, c-format
+msgid "Account address"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:93
+#: src/paths/instance/update/UpdatePage.tsx:112
+#, c-format
+msgid "Default max deposit fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:95
+#: src/paths/instance/update/UpdatePage.tsx:114
+#, c-format
+msgid "Default max wire fee"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:97
+#: src/paths/instance/update/UpdatePage.tsx:116
+#, c-format
+msgid "Default wire fee amortization"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:103
+#: src/paths/instance/update/UpdatePage.tsx:122
+#, c-format
+msgid "Jurisdiction"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:107
+#: src/paths/instance/update/UpdatePage.tsx:126
+#, c-format
+msgid "Default pay delay"
+msgstr ""
+
+#: src/paths/admin/create/CreatePage.tsx:109
+#: src/paths/instance/update/UpdatePage.tsx:128
+#, c-format
+msgid "Default wire transfer delay"
+msgstr ""
+
+#: src/paths/admin/create/index.tsx:58
+#, c-format
+msgid "could not create instance"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:63 src/paths/admin/list/Table.tsx:131
+#: src/paths/instance/transfers/list/Table.tsx:71
+#, c-format
+msgid "Delete"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:128
+#, c-format
+msgid "Edit"
+msgstr ""
+
+#: src/paths/admin/list/Table.tsx:149
+#: src/paths/instance/products/list/Table.tsx:245
+#, c-format
+msgid "There is no instances yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:237
+#, c-format
+msgid "Inventory products"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:286
+#, c-format
+msgid "Total price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:287
+#, c-format
+msgid "Total tax"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:289
+#: src/paths/instance/orders/create/CreatePage.tsx:297
+#, c-format
+msgid "Order price"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:295
+#, c-format
+msgid "Net"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:300
+#: src/paths/instance/orders/details/DetailPage.tsx:144
+#: src/paths/instance/orders/details/DetailPage.tsx:295
+#: src/paths/instance/orders/list/Table.tsx:117
+#, c-format
+msgid "Summary"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:302
+#, c-format
+msgid "Payments options"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:303
+#, c-format
+msgid "Auto refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:304
+#, c-format
+msgid "Refund deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:305
+#, c-format
+msgid "Pay deadline"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:307
+#, c-format
+msgid "Delivery date"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:308
+#, c-format
+msgid "Location"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:312
+#, c-format
+msgid "Max fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:313
+#, c-format
+msgid "Max wire fee"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:314
+#, c-format
+msgid "Wire fee amortization"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:315
+#, c-format
+msgid "Fullfilment url"
+msgstr ""
+
+#: src/paths/instance/orders/create/CreatePage.tsx:318
+#, c-format
+msgid "Extra information"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:44
+#, c-format
+msgid "select a product first"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:51
+#, c-format
+msgid "should be greater than 0"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:58
+#, c-format
+msgid ""
+"cannot be greater than current stock and quantity previously added. max: %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:64
+#, c-format
+msgid "cannot be greater than current stock %1$s"
+msgstr ""
+
+#: src/paths/instance/orders/create/InventoryProductForm.tsx:76
+#: src/paths/instance/orders/create/NonInventoryProductForm.tsx:126
+#, c-format
+msgid "Quantity"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:92
+#: src/paths/instance/orders/details/DetailPage.tsx:235
+#: src/paths/instance/orders/details/DetailPage.tsx:333
+#, c-format
+msgid "Order"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:93
+#, c-format
+msgid "claimed"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:110
+#: src/paths/instance/orders/details/DetailPage.tsx:261
+#: src/paths/instance/orders/list/Table.tsx:136
+#, c-format
+msgid "copy url"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:126
+#: src/paths/instance/orders/details/DetailPage.tsx:349
+#, c-format
+msgid "pay at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:127
+#: src/paths/instance/orders/details/DetailPage.tsx:350
+#, c-format
+msgid "created at"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:138
+#: src/paths/instance/orders/details/DetailPage.tsx:289
+#, c-format
+msgid "Timeline"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:142
+#: src/paths/instance/orders/details/DetailPage.tsx:293
+#, c-format
+msgid "Payment details"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:146
+#: src/paths/instance/orders/details/DetailPage.tsx:299
+#: src/paths/instance/orders/details/DetailPage.tsx:363
+#, c-format
+msgid "Order status"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:156
+#: src/paths/instance/orders/details/DetailPage.tsx:308
+#, c-format
+msgid "Product list"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:236
+#, c-format
+msgid "paid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:238
+#, c-format
+msgid "wired"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:241
+#, c-format
+msgid "refunded"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:258
+#, c-format
+msgid "refund"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:297
+#, c-format
+msgid "Refunded amount"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:298
+#, c-format
+msgid "Deposit total"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:336
+#, c-format
+msgid "unpaid"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:364
+#, c-format
+msgid "Order status URL"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:365
+#, c-format
+msgid "Pay URI"
+msgstr ""
+
+#: src/paths/instance/orders/details/DetailPage.tsx:383
+#, c-format
+msgid ""
+"Unknown order status. This is an error, please contact the administrator."
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:56
+#: src/paths/instance/orders/list/index.tsx:147
+#, c-format
+msgid "refund created successfully"
+msgstr ""
+
+#: src/paths/instance/orders/details/index.tsx:59
+#: src/paths/instance/orders/list/index.tsx:150
+#, c-format
+msgid "could not create the refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:111
+#, c-format
+msgid "load newer orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:115
+#, c-format
+msgid "Date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:131
+#: src/paths/instance/orders/list/Table.tsx:223
+#, c-format
+msgid "Refund"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:145
+#, c-format
+msgid "load older orders"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:154
+#, c-format
+msgid "No orders has been found"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:202
+#, c-format
+msgid "date"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:203
+#, c-format
+msgid "amount"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:204
+#, c-format
+msgid "reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:224
+#, c-format
+msgid "Max refundable:"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "Reason"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "duplicated"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "requested by the customer"
+msgstr ""
+
+#: src/paths/instance/orders/list/Table.tsx:226
+#, c-format
+msgid "other"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:91
+#, c-format
+msgid "go to order id"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:107
+#, c-format
+msgid "Paid"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:108
+#, c-format
+msgid "Refunded"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:109
+#, c-format
+msgid "Not wired"
+msgstr ""
+
+#: src/paths/instance/orders/list/index.tsx:110
+#, c-format
+msgid "All"
+msgstr ""
+
+#: src/paths/instance/products/create/index.tsx:48
+#: src/paths/instance/products/update/index.tsx:64
+#, c-format
+msgid "could not create product"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:87
+#, c-format
+msgid "Sell"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:89
+#, c-format
+msgid "Profit"
+msgstr ""
+
+#: src/paths/instance/products/list/Table.tsx:91
+#, c-format
+msgid "Sold"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:59
+#, c-format
+msgid "product updated successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:62
+#, c-format
+msgid "could not update the product"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:70
+#, c-format
+msgid "product delete successfully"
+msgstr ""
+
+#: src/paths/instance/products/list/index.tsx:73
+#, c-format
+msgid "could not delete the product"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:59
+#, c-format
+msgid "Tips"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:111
+#, c-format
+msgid "Committed amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:112
+#, c-format
+msgid "Exchange initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:113
+#, c-format
+msgid "Merchant initial amount"
+msgstr ""
+
+#: src/paths/instance/tips/list/Table.tsx:148
+#, c-format
+msgid "There is no tips yet, add more pressing the + sign"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:50
+#: src/paths/instance/transfers/create/CreatePage.tsx:54
+#: src/paths/instance/transfers/create/CreatePage.tsx:55
+#: src/paths/instance/transfers/create/CreatePage.tsx:56
+#, c-format
+msgid "cannot be empty"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:51
+#, c-format
+msgid "check the id, doest look valid"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:52
+#, c-format
+msgid "should have 52 characters, current %1$s"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:57
+#, c-format
+msgid "URL doesn't have the right format"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:74
+#, c-format
+msgid "Transfer ID"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:76
+#, c-format
+msgid "Account Address"
+msgstr ""
+
+#: src/paths/instance/transfers/create/CreatePage.tsx:82
+#: src/paths/instance/transfers/list/Table.tsx:125
+#, c-format
+msgid "Exchange URL"
+msgstr ""
+
+#: src/paths/instance/transfers/create/index.tsx:49
+#, c-format
+msgid "could not inform transfer"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:118
+#, c-format
+msgid "load newer transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:123
+#, c-format
+msgid "Credit"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:126
+#, c-format
+msgid "Confirmed"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:127
+#: src/paths/instance/transfers/list/index.tsx:60
+#, c-format
+msgid "Verified"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:128
+#, c-format
+msgid "Executed at"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "yes"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:138
+#: src/paths/instance/transfers/list/Table.tsx:139
+#, c-format
+msgid "no"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:140
+#, c-format
+msgid "unknown"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:145
+#, c-format
+msgid "load older transfers"
+msgstr ""
+
+#: src/paths/instance/transfers/list/Table.tsx:154
+#, c-format
+msgid "There is no transfer yet, add more pressing the + sign"
+msgstr ""
diff --git a/packages/backend/src/index.tsx b/packages/backend/src/index.tsx
new file mode 100644
index 0000000..0babb26
--- /dev/null
+++ b/packages/backend/src/index.tsx
@@ -0,0 +1,67 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { h, VNode, Fragment } from 'preact';
+import { BackendContextProvider } from './context/backend';
+import { TranslationProvider } from './context/translation';
+// import { Page as RequestPayment } from './RequestPayment';
+import "./css/pure-min.css"
+import { Route, Router } from 'preact-router';
+// import OfferTip from './pages/OfferTip';
+// import {OfferRefund} from './pages/OfferRefund';
+// import DepletedTip from './pages/DepletedTip';
+// import RequestPayment from './pages/RequestPayment';
+// import ShowOrderDetails from './pages/ShowOrderDetails';
+
+export default function Application(): VNode {
+ return (
+ // <FetchContextProvider>
+ <BackendContextProvider>
+ <TranslationProvider>
+ <ApplicationStatusRoutes />
+ </TranslationProvider>
+ </BackendContextProvider>
+ // </FetchContextProvider>
+ );
+}
+
+function Footer() {
+ return <div class="talerbar">
+ <p>You can learn more about GNU Taler on our <a href="https://taler.net/">website</a>.<br />
+ Copyright &copy; 2014&mdash;2021 Taler Systems SA</p>
+ </div>
+}
+
+function ApplicationStatusRoutes(): VNode {
+ return <Fragment>
+ <Router>
+ {/* <Route path="offer_tip" component={OfferTip} />
+ <Route path="offer_refund" component={OfferRefund} />
+ <Route path="depleted_tip" component={DepletedTip} />
+ <Route path="request_payment" component={RequestPayment} />
+ <Route path="show_order_details" component={ShowOrderDetails} /> */}
+ <Route default component={() => <div>
+ hello!
+ </div>} />
+ </Router>
+ <Footer />
+ </Fragment>
+}
diff --git a/packages/backend/src/pages/DepletedTip.stories.tsx b/packages/backend/src/pages/DepletedTip.stories.tsx
new file mode 100644
index 0000000..c20f6dc
--- /dev/null
+++ b/packages/backend/src/pages/DepletedTip.stories.tsx
@@ -0,0 +1,40 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { h, VNode, FunctionalComponent } from 'preact';
+import { DepletedTip as TestedComponent } from './DepletedTip';
+
+
+export default {
+ title: 'DepletedTip',
+ component: TestedComponent,
+ argTypes: {
+ },
+};
+
+function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
+ const r = (args: any) => <Component {...args} />
+ r.args = props
+ return r
+}
+
+export const Example = createExample(TestedComponent, {
+});
diff --git a/packages/backend/src/pages/DepletedTip.tsx b/packages/backend/src/pages/DepletedTip.tsx
new file mode 100644
index 0000000..f9cf9bb
--- /dev/null
+++ b/packages/backend/src/pages/DepletedTip.tsx
@@ -0,0 +1,45 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+import { h, render, VNode } from 'preact';
+
+export function DepletedTip(): VNode {
+ return <div>
+ You have already collected this tip.
+ </div>
+}
+
+export function Title(): VNode {
+ return <title>Status of your tip</title>
+}
+
+
+export function mountIntoBody(): void {
+ try {
+ const params = new URL(window.location.href).searchParams
+ render(<DepletedTip
+ // taler_refund_uri={params.get('taler_refund_uri') || undefined}
+ />, document.body);
+ } catch (e) {
+ console.error("got error", e);
+ document.body.innerText = `Fatal error: "${e.message}". Please report this bug at https://bugs.gnunet.org/.`;
+ }
+}
+
diff --git a/packages/backend/src/pages/OfferRefund.stories.tsx b/packages/backend/src/pages/OfferRefund.stories.tsx
new file mode 100644
index 0000000..f1b2f3a
--- /dev/null
+++ b/packages/backend/src/pages/OfferRefund.stories.tsx
@@ -0,0 +1,40 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { h, VNode, FunctionalComponent } from 'preact';
+import { OfferRefund as TestedComponent } from './OfferRefund';
+
+
+export default {
+ title: 'OfferRefund',
+ component: TestedComponent,
+ argTypes: {
+ },
+};
+
+function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
+ const r = (args: any) => <Component {...args} />
+ r.args = props
+ return r
+}
+
+export const Example = createExample(TestedComponent, {
+});
diff --git a/packages/backend/src/pages/OfferRefund.tsx b/packages/backend/src/pages/OfferRefund.tsx
new file mode 100644
index 0000000..6c6b77e
--- /dev/null
+++ b/packages/backend/src/pages/OfferRefund.tsx
@@ -0,0 +1,103 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+import { render, h, VNode } from 'preact';
+import { useEffect } from 'preact/hooks';
+
+export function OfferRefund(): VNode {
+ useEffect(() => {
+ const checkUrl = new URL("{{& order_status_url }}");
+ checkUrl.searchParams.set("await_refund_obtained", "yes");
+ const delayMs = 500;
+ function check() {
+ let retried = false;
+ function retryOnce() {
+ if (!retried) {
+ retried = true;
+ check();
+ }
+ }
+ const req = new XMLHttpRequest();
+ req.onreadystatechange = function () {
+ if (req.readyState === XMLHttpRequest.DONE) {
+ if (req.status === 200) {
+ try {
+ const resp = JSON.parse(req.responseText);
+ if (!resp.refund_pending) {
+ window.location.reload(true);
+ }
+ } catch (e) {
+ console.error("could not parse response:", e);
+ }
+ }
+ setTimeout(retryOnce, delayMs);
+ }
+ };
+ req.onerror = function () {
+ setTimeout(retryOnce, delayMs);
+ }
+ req.open("GET", checkUrl.href);
+ req.send();
+ }
+
+ setTimeout(check, delayMs);
+ })
+ return <section id="main" class="content">
+ <h1 >Collect Taler refund</h1>
+ <div class="taler-installed-hide">
+ <p>
+ Scan this QR code with your Taler mobile wallet:
+ </p>
+ <div class="qr">
+ {/* {{{taler_refund_qrcode_svg}}} */}
+ </div>
+ <p>
+ <button onClick={() => {
+ window.location.href = '{{taler_refund_uri}}'
+ }}>
+ Or open your Taller wallet
+ </button>
+ </p>
+ <p>
+ <a href="https://wallet.taler.net/">Don't have a Taler wallet yet? Install it!</a>
+ </p>
+ </div>
+ <hr />
+ </section>
+}
+
+export function Title(): VNode {
+ return <title>Refund available for {`{order_summary}`}</title>
+}
+
+export function mountIntoBody(): void {
+ try {
+ const params = new URL(window.location.href).searchParams
+ render(<OfferRefund
+ // taler_refund_uri={params.get('taler_refund_uri') || undefined}
+ />, document.body);
+ } catch (e) {
+ console.error("got error", e);
+ document.body.innerText = `Fatal error: "${e.message}". Please report this bug at https://bugs.gnunet.org/.`;
+ }
+}
+
+
+
diff --git a/packages/backend/src/pages/OfferTip.stories.tsx b/packages/backend/src/pages/OfferTip.stories.tsx
new file mode 100644
index 0000000..09bffb8
--- /dev/null
+++ b/packages/backend/src/pages/OfferTip.stories.tsx
@@ -0,0 +1,40 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { h, VNode, FunctionalComponent } from 'preact';
+import { OfferTip as TestedComponent } from './OfferTip';
+
+
+export default {
+ title: 'OfferTip',
+ component: TestedComponent,
+ argTypes: {
+ },
+};
+
+function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
+ const r = (args: any) => <Component {...args} />
+ r.args = props
+ return r
+}
+
+export const Example = createExample(TestedComponent, {
+});
diff --git a/packages/backend/src/pages/OfferTip.tsx b/packages/backend/src/pages/OfferTip.tsx
new file mode 100644
index 0000000..fd14354
--- /dev/null
+++ b/packages/backend/src/pages/OfferTip.tsx
@@ -0,0 +1,113 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+import { render, h, VNode, Fragment } from 'preact';
+import { useEffect } from 'preact/hooks';
+import { styled } from "@linaria/react"
+import "../css/pure-min.css"
+import "../css/style.css"
+
+interface Props {
+ taler_refund_uri?: string,
+ tip_status_url?: string,
+ taler_tip_qrcode_svg?: string,
+}
+export function OfferTip({ taler_refund_uri, tip_status_url, taler_tip_qrcode_svg }: Props): VNode {
+ useEffect(() => {
+ const delayMs = 500;
+ function check() {
+ let retried = false;
+ function retryOnce() {
+ if (!retried) {
+ retried = true;
+ check();
+ }
+ }
+ const req = new XMLHttpRequest();
+ req.onreadystatechange = function () {
+ if (req.readyState === XMLHttpRequest.DONE) {
+ if (req.status === 410) {
+ window.location.reload(true);
+ }
+ setTimeout(retryOnce, delayMs);
+ }
+ };
+ req.onerror = function () {
+ setTimeout(retryOnce, delayMs);
+ }
+ req.open("GET", taler_refund_uri || '');
+ req.send();
+ }
+
+ setTimeout(check, delayMs);
+ })
+ return <Fragment>
+ <section id="main" class="content">
+ <h1>Collect Taler tip</h1>
+ <div class="taler-installed-hide">
+ <p>
+ Scan this QR code with your Taler mobile wallet:
+ </p>
+ <div class="qr">
+ {taler_tip_qrcode_svg}
+ </div>
+ <p>
+ <button onClick={() => {
+ window.location.href = tip_status_url || '#'
+ }}>
+ Or open your Taller wallet
+ </button>
+ </p>
+ <p>
+ <a href="https://wallet.taler.net/">Don't have a Taler wallet yet? Install it!</a>
+ </p>
+ </div>
+ <hr />
+ </section>
+ <Footer />
+ </Fragment>
+}
+
+function Footer() {
+ return <div class="talerbar">
+ <p>You can learn more about GNU Taler on our <a href="https://taler.net/">website</a>.<br />
+ Copyright &copy; 2014&mdash;2021 Taler Systems SA</p>
+ </div>
+}
+
+
+export function Title(): VNode {
+ return <title>Tip available</title>
+}
+
+export function mountIntoBody(): void {
+ try {
+ const params = new URL(window.location.href).searchParams
+ render(<OfferTip
+ taler_refund_uri={params.get('taler_refund_uri') || undefined}
+ taler_tip_qrcode_svg={params.get('taler_tip_qrcode_svg') || undefined}
+ tip_status_url={params.get('tip_status_url') || undefined}
+ />, document.body);
+ } catch (e) {
+ console.error("got error", e);
+ document.body.innerText = `Fatal error: "${e.message}". Please report this bug at https://bugs.gnunet.org/.`;
+ }
+}
+
diff --git a/packages/backend/src/pages/RequestPayment.stories.tsx b/packages/backend/src/pages/RequestPayment.stories.tsx
new file mode 100644
index 0000000..1aed570
--- /dev/null
+++ b/packages/backend/src/pages/RequestPayment.stories.tsx
@@ -0,0 +1,40 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { h, VNode, FunctionalComponent } from 'preact';
+import { RequestPayment as TestedComponent } from './RequestPayment';
+
+
+export default {
+ title: 'RequestPayment',
+ component: TestedComponent,
+ argTypes: {
+ },
+};
+
+function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
+ const r = (args: any) => <Component {...args} />
+ r.args = props
+ return r
+}
+
+export const Example = createExample(TestedComponent, {
+});
diff --git a/packages/backend/src/pages/RequestPayment.tsx b/packages/backend/src/pages/RequestPayment.tsx
new file mode 100644
index 0000000..d1fb8d4
--- /dev/null
+++ b/packages/backend/src/pages/RequestPayment.tsx
@@ -0,0 +1,125 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+import { h, render, VNode } from 'preact';
+import { useEffect } from 'preact/hooks';
+
+export function RequestPayment(): VNode {
+ useEffect(() => {
+ const longpollDelayMs = 60000;
+ const checkUrl = new URL("{{& order_status_url }}");
+ checkUrl.searchParams.set("timeout_ms", longpollDelayMs.toString());
+ function check() {
+ let retried = false;
+ function retryOnce() {
+ if (!retried) {
+ retried = true;
+ check();
+ }
+ }
+ const req = new XMLHttpRequest();
+ req.onreadystatechange = function () {
+ if (req.readyState === XMLHttpRequest.DONE) {
+ if (req.status === 200) {
+ try {
+ const resp = JSON.parse(req.responseText);
+ if (resp.fulfillment_url) {
+ window.location.replace(resp.fulfillment_url);
+ }
+ } catch (e) {
+ console.error("could not parse response:", e);
+ }
+ }
+ if (req.status === 202) {
+ try {
+ const resp = JSON.parse(req.responseText);
+ if (resp.fulfillment_url) {
+ window.location.replace(resp.fulfillment_url);
+ }
+ } catch (e) {
+ console.error("could not parse response:", e);
+ }
+ }
+ if (req.status === 402) {
+ try {
+ const resp = JSON.parse(req.responseText);
+ if (resp.already_paid_order_id && resp.fulfillment_url) {
+ window.location.replace(resp.fulfillment_url);
+ }
+ } catch (e) {
+ console.error("could not parse response:", e);
+ }
+ }
+ setTimeout(retryOnce, 500);
+ }
+ };
+ req.onerror = function () {
+ setTimeout(retryOnce, 500);
+ }
+ req.ontimeout = function () {
+ setTimeout(retryOnce, 500);
+ }
+ req.timeout = longpollDelayMs;
+ req.open("GET", checkUrl.href);
+ req.send();
+ }
+ setTimeout(check, 500);
+ })
+ return <section id="main" class="content">
+ <h1>Pay with Taler</h1>
+ <div class="taler-installed-hide">
+ <p>
+ Scan this QR code with your mobile wallet:
+ </p>
+ <div class="qr">
+ {/* {{{taler_pay_qrcode_svg}}} */}
+ </div>
+ <p>
+ <button onClick={() => {
+ window.location.href = '{{taler_refund_uri}}'
+ }}>
+ Or open your Taller wallet
+ </button>
+ </p>
+ <p>
+ <a href="https://wallet.taler.net/">Don't have a Taler wallet yet? Install it!</a>
+ </p>
+ </div>
+ <hr />
+ </section>
+
+}
+export function Title(): VNode {
+ return <title>Payment requested for {`{order_summary}`}</title>
+}
+
+export function mountIntoBody(): void {
+ try {
+ const params = new URL(window.location.href).searchParams
+ render(<RequestPayment
+ // taler_refund_uri={params.get('taler_refund_uri') || undefined}
+ />, document.body);
+ } catch (e) {
+ console.error("got error", e);
+ document.body.innerText = `Fatal error: "${e.message}". Please report this bug at https://bugs.gnunet.org/.`;
+ }
+}
+
+
diff --git a/packages/backend/src/pages/ShowOrderDetails.stories.tsx b/packages/backend/src/pages/ShowOrderDetails.stories.tsx
new file mode 100644
index 0000000..88fa393
--- /dev/null
+++ b/packages/backend/src/pages/ShowOrderDetails.stories.tsx
@@ -0,0 +1,40 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { h, VNode, FunctionalComponent } from 'preact';
+import { ShowOrderDetails as TestedComponent } from './ShowOrderDetails';
+
+
+export default {
+ title: 'ShowOrderDetails',
+ component: TestedComponent,
+ argTypes: {
+ },
+};
+
+function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
+ const r = (args: any) => <Component {...args} />
+ r.args = props
+ return r
+}
+
+export const Example = createExample(TestedComponent, {
+});
diff --git a/packages/backend/src/pages/ShowOrderDetails.tsx b/packages/backend/src/pages/ShowOrderDetails.tsx
new file mode 100644
index 0000000..4aae556
--- /dev/null
+++ b/packages/backend/src/pages/ShowOrderDetails.tsx
@@ -0,0 +1,125 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+import { Fragment, render, h, VNode } from 'preact';
+import { useEffect } from 'preact/hooks';
+
+export function ShowOrderDetails(): VNode {
+ useEffect(() => {
+ const longpollDelayMs = 60000;
+ const checkUrl = new URL("{{& order_status_url }}");
+ checkUrl.searchParams.set("timeout_ms", longpollDelayMs.toString());
+ function check() {
+ let retried = false;
+ function retryOnce() {
+
+ if (!retried) {
+ retried = true;
+ check();
+ }
+ }
+ const req = new XMLHttpRequest();
+ req.onreadystatechange = function () {
+ if (req.readyState === XMLHttpRequest.DONE) {
+ if (req.status === 200) {
+ try {
+ const resp = JSON.parse(req.responseText);
+ if (resp.fulfillment_url) {
+ window.location.replace(resp.fulfillment_url);
+ }
+ } catch (e) {
+ console.error("could not parse response:", e);
+ }
+ }
+ if (req.status === 202) {
+ try {
+ const resp = JSON.parse(req.responseText);
+ if (resp.fulfillment_url) {
+ window.location.replace(resp.fulfillment_url);
+ }
+ } catch (e) {
+ console.error("could not parse response:", e);
+ }
+ }
+ if (req.status === 402) {
+ try {
+ const resp = JSON.parse(req.responseText);
+ if (resp.already_paid_order_id && resp.fulfillment_url) {
+ window.location.replace(resp.fulfillment_url);
+ }
+ } catch (e) {
+ console.error("could not parse response:", e);
+ }
+ }
+ setTimeout(retryOnce, 500);
+ }
+ };
+ req.onerror = function () {
+ setTimeout(retryOnce, 500);
+ }
+ req.ontimeout = function () {
+ setTimeout(retryOnce, 500);
+ }
+ req.timeout = longpollDelayMs;
+ req.open("GET", checkUrl.href);
+ req.send();
+ }
+ setTimeout(check, 500);
+ })
+ return <Fragment>
+ <h1>Order details</h1>
+
+ <div>
+ This is the default status page for your order for <b>{`{ order_summary }`}</b>.
+ </div>
+
+
+ <h2>Refund status</h2>
+ <div>
+ The merchant has granted you refunds on the purchase of <b>{`{ refund_amount }`}</b>.
+ </div>
+
+ <h2>Full contract details</h2>
+
+ {/* <!-- FIXME #6459: expand the contract JSON in all its glory here --> */}
+ <pre>
+ {/* {{{contract_terms!stringify }}} */}
+ </pre>
+
+ </Fragment>
+
+}
+
+function Title(): VNode {
+ return <title>Status of your order for {`{order_summary}`}</title>
+}
+
+export function mountIntoBody(): void {
+ try {
+ const params = new URL(window.location.href).searchParams
+ render(<ShowOrderDetails
+ // taler_refund_uri={params.get('taler_refund_uri') || undefined}
+ />, document.body);
+ } catch (e) {
+ console.error("got error", e);
+ document.body.innerText = `Fatal error: "${e.message}". Please report this bug at https://bugs.gnunet.org/.`;
+ }
+}
+
diff --git a/packages/backend/src/utils/amount.ts b/packages/backend/src/utils/amount.ts
new file mode 100644
index 0000000..062ddaf
--- /dev/null
+++ b/packages/backend/src/utils/amount.ts
@@ -0,0 +1,69 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 { amountFractionalBase, AmountJson, Amounts } from "@gnu-taler/taler-util";
+import { MerchantBackend } from "../declaration";
+
+/**
+ * sums two prices,
+ * @param one
+ * @param two
+ * @returns
+ */
+const sumPrices = (one: string, two: string) => {
+ const [currency, valueOne] = one.split(':')
+ const [, valueTwo] = two.split(':')
+ return `${currency}:${parseInt(valueOne, 10) + parseInt(valueTwo, 10)}`
+}
+
+/**
+ * merge refund with the same description and a difference less than one minute
+ * @param prev list of refunds that will hold the merged refunds
+ * @param cur new refund to add to the list
+ * @returns list with the new refund, may be merged with the last
+ */
+export function mergeRefunds(prev: MerchantBackend.Orders.RefundDetails[], cur: MerchantBackend.Orders.RefundDetails) {
+ let tail;
+
+ if (prev.length === 0 || //empty list
+ cur.timestamp.t_ms === 'never' || //current doesnt have timestamp
+ (tail = prev[prev.length - 1]).timestamp.t_ms === 'never' || // last doesnt have timestamp
+ cur.reason !== tail.reason || //different reason
+ Math.abs(cur.timestamp.t_ms - tail.timestamp.t_ms) > 1000 * 60) {//more than 1 minute difference
+
+ prev.push(cur)
+ return prev
+ }
+
+ prev[prev.length - 1] = {
+ ...tail,
+ amount: sumPrices(tail.amount, cur.amount)
+ }
+
+ return prev
+}
+
+export const rate = (one: string, two: string) => {
+ const a = Amounts.parseOrThrow(one)
+ const b = Amounts.parseOrThrow(two)
+ const af = toFloat(a)
+ const bf = toFloat(b)
+ if (bf === 0) return 0
+ return af / bf
+}
+
+function toFloat(amount: AmountJson) {
+ return amount.value + (amount.fraction / amountFractionalBase);
+}
diff --git a/packages/backend/src/utils/constants.ts b/packages/backend/src/utils/constants.ts
new file mode 100644
index 0000000..37c46e4
--- /dev/null
+++ b/packages/backend/src/utils/constants.ts
@@ -0,0 +1,47 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+//https://tools.ietf.org/html/rfc8905
+export const PAYTO_REGEX = /^payto:\/\/[a-zA-Z][a-zA-Z0-9-.]+(\/[a-zA-Z0-9\-\.\~\(\)@_%:!$&'*+,;=]*)*\??((amount|receiver-name|sender-name|instruction|message)=[a-zA-Z0-9\-\.\~\(\)@_%:!$'*+,;=]*&?)*$/
+export const PAYTO_WIRE_METHOD_LOOKUP = /payto:\/\/([a-zA-Z][a-zA-Z0-9-.]+)\/.*/
+
+export const AMOUNT_REGEX = /^[a-zA-Z][a-zA-Z]*:[0-9][0-9,]*\.?[0-9,]*$/
+
+export const INSTANCE_ID_LOOKUP = /^\/instances\/([^/]*)\/?$/
+
+export const AMOUNT_ZERO_REGEX = /^[a-zA-Z][a-zA-Z]*:0$/
+
+export const CROCKFORD_BASE32_REGEX = /^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]+[*~$=U]*$/
+
+export const URL_REGEX = /^((https?:)(\/\/\/?)([\w]*(?::[\w]*)?@)?([\d\w\.-]+)(?::(\d+))?)\/$/
+
+// how much rows we add every time user hit load more
+export const PAGE_SIZE = 20
+// how bigger can be the result set
+// after this threshold, load more with move the cursor
+export const MAX_RESULT_SIZE = PAGE_SIZE * 2 - 1;
+
+// how much we will wait for all request, in seconds
+export const DEFAULT_REQUEST_TIMEOUT = 10;
+
+export const MAX_IMAGE_SIZE = 1024 * 1024;
+
+export const INSTANCE_ID_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9_.@-]+$/
diff --git a/packages/backend/src/utils/table.ts b/packages/backend/src/utils/table.ts
new file mode 100644
index 0000000..3d713a6
--- /dev/null
+++ b/packages/backend/src/utils/table.ts
@@ -0,0 +1,37 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 { WithId } from "../declaration";
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+export interface Actions<T extends WithId> {
+ element: T;
+ type: 'DELETE' | 'UPDATE';
+}
+
+function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
+ return value !== null && value !== undefined;
+}
+
+export function buildActions<T extends WithId>(intances: T[], selected: string[], action: 'DELETE'): Actions<T>[] {
+ return selected.map(id => intances.find(i => i.id === id))
+ .filter(notEmpty)
+ .map(id => ({ element: id, type: action }))
+}
diff --git a/packages/backend/src/utils/types.ts b/packages/backend/src/utils/types.ts
new file mode 100644
index 0000000..9e49d39
--- /dev/null
+++ b/packages/backend/src/utils/types.ts
@@ -0,0 +1,31 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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 { VNode } from "preact"
+
+export interface KeyValue {
+ [key: string]: string;
+}
+
+export interface Notification {
+ message: string;
+ description?: string | VNode;
+ type: MessageType;
+}
+
+export type ValueOrFunction<T> = T | ((p: T) => T)
+export type MessageType = 'INFO' | 'WARN' | 'ERROR' | 'SUCCESS'
+
diff --git a/packages/backend/tests/__mocks__/browserMocks.ts b/packages/backend/tests/__mocks__/browserMocks.ts
new file mode 100644
index 0000000..ee6bba5
--- /dev/null
+++ b/packages/backend/tests/__mocks__/browserMocks.ts
@@ -0,0 +1,42 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+ /**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
+
+// Mock Browser API's which are not supported by JSDOM, e.g. ServiceWorker, LocalStorage
+/**
+ * An example how to mock localStorage is given below πŸ‘‡
+ */
+
+/*
+// Mocks localStorage
+const localStorageMock = (function() {
+ let store = {};
+
+ return {
+ getItem: (key) => store[key] || null,
+ setItem: (key, value) => store[key] = value.toString(),
+ clear: () => store = {}
+ };
+
+})();
+
+Object.defineProperty(window, 'localStorage', {
+ value: localStorageMock
+}); */
diff --git a/packages/backend/tests/__mocks__/fileMocks.ts b/packages/backend/tests/__mocks__/fileMocks.ts
new file mode 100644
index 0000000..0c045e9
--- /dev/null
+++ b/packages/backend/tests/__mocks__/fileMocks.ts
@@ -0,0 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+ /**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
+
+// This fixed an error related to the CSS and loading gif breaking my Jest test
+// See https://facebook.github.io/jest/docs/en/webpack.html#handling-static-assets
+export default 'test-file-stub';
diff --git a/packages/backend/tests/__mocks__/fileTransformer.js b/packages/backend/tests/__mocks__/fileTransformer.js
new file mode 100644
index 0000000..e6193f8
--- /dev/null
+++ b/packages/backend/tests/__mocks__/fileTransformer.js
@@ -0,0 +1,31 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+// fileTransformer.js
+
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const path = require('path');
+
+module.exports = {
+ process(src, filename, config, options) {
+ return 'module.exports = ' + JSON.stringify(path.basename(filename)) + ';';
+ },
+};
+
diff --git a/packages/backend/tests/__mocks__/setupTests.ts b/packages/backend/tests/__mocks__/setupTests.ts
new file mode 100644
index 0000000..ab0f08b
--- /dev/null
+++ b/packages/backend/tests/__mocks__/setupTests.ts
@@ -0,0 +1,28 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+ /**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
+
+import 'regenerator-runtime/runtime'
+import { configure } from 'enzyme';
+import Adapter from 'enzyme-adapter-preact-pure';
+
+configure({
+ adapter: new Adapter()
+});
diff --git a/packages/backend/tests/funcitons/regex.test.ts b/packages/backend/tests/funcitons/regex.test.ts
new file mode 100644
index 0000000..fc8a6a4
--- /dev/null
+++ b/packages/backend/tests/funcitons/regex.test.ts
@@ -0,0 +1,87 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+ /**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
+
+import { AMOUNT_REGEX, PAYTO_REGEX } from "../../src/utils/constants";
+
+describe('payto uri format', () => {
+ const valids = [
+ 'payto://iban/DE75512108001245126199?amount=EUR:200.0&message=hello',
+ 'payto://ach/122000661/1234',
+ 'payto://upi/alice@example.com?receiver-name=Alice&amount=INR:200',
+ 'payto://void/?amount=EUR:10.5',
+ 'payto://ilp/g.acme.bob'
+ ]
+
+ test('should be valid', () => {
+ valids.forEach(v => expect(v).toMatch(PAYTO_REGEX))
+ });
+
+ const invalids = [
+ // has two question marks
+ 'payto://iban/DE75?512108001245126199?amount=EUR:200.0&message=hello',
+ // has a space
+ 'payto://ach /122000661/1234',
+ // has a space
+ 'payto://upi/alice@ example.com?receiver-name=Alice&amount=INR:200',
+ // invalid field name (mount instead of amount)
+ 'payto://void/?mount=EUR:10.5',
+ // payto:// is incomplete
+ 'payto: //ilp/g.acme.bob'
+ ]
+
+ test('should not be valid', () => {
+ invalids.forEach(v => expect(v).not.toMatch(PAYTO_REGEX))
+ });
+})
+
+describe('amount format', () => {
+ const valids = [
+ 'ARS:10',
+ 'COL:10.2',
+ 'UY:1,000.2',
+ 'ARS:10.123,123',
+ 'ARS:1,000,000',
+ 'ARSCOL:10',
+ 'THISISTHEMOTHERCOIN:1,000,000.123,123',
+ ]
+
+ test('should be valid', () => {
+ valids.forEach(v => expect(v).toMatch(AMOUNT_REGEX))
+ });
+
+ const invalids = [
+ //no currency name
+ ':10',
+ //use . instead of ,
+ 'ARS:1.000.000',
+ //currency name with numbers
+ '1ARS:10',
+ //currency name with numbers
+ 'AR5:10',
+ //missing value
+ 'USD:',
+ ]
+
+ test('should not be valid', () => {
+ invalids.forEach(v => expect(v).not.toMatch(AMOUNT_REGEX))
+ });
+
+}) \ No newline at end of file
diff --git a/packages/backend/tests/util.ts b/packages/backend/tests/util.ts
new file mode 100644
index 0000000..14b82b5
--- /dev/null
+++ b/packages/backend/tests/util.ts
@@ -0,0 +1,62 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ 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/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+import * as axios from 'axios';
+
+type Query<Req, Res> = (GetQuery | PostQuery | DeleteQuery | PatchQuery) & RequestResponse<Req, Res>
+
+interface RequestResponse<Req, Res> {
+ request?: Req,
+ params?: any,
+ response?: Res,
+}
+interface GetQuery { get: string }
+interface PostQuery { post: string }
+interface DeleteQuery { delete: string }
+interface PatchQuery { patch: string }
+
+export function simulateBackendResponse<R, T>(query: Query<R, T>): void {
+ (axios.default as jest.MockedFunction<axios.AxiosStatic>).mockImplementationOnce(function (opt?: axios.AxiosRequestConfig): axios.AxiosPromise {
+ // console.log(opt, JSON.stringify(query,undefined,2))
+ expect(opt).toBeDefined();
+ if (!opt)
+ return Promise.reject();
+
+ // expect(query.request).toStrictEqual(opt.data);
+ // expect(query.params).toStrictEqual(opt.params);
+ if ('get' in query) {
+ expect(opt.method).toBe('get');
+ expect(opt.url).toBe(query.get);
+ }
+ if ('post' in query) {
+ expect(opt.method).toBe('post');
+ expect(opt.url).toBe(query.post);
+ }
+ if ('delete' in query) {
+ expect(opt.method).toBe('delete');
+ expect(opt.url).toBe(query.delete);
+ }
+ if ('patch' in query) {
+ expect(opt.method).toBe('patch');
+ expect(opt.url).toBe(query.patch);
+ }
+ return ({ data: query.response, config: {} } as any);
+ } as any)
+}
diff --git a/packages/backend/tsconfig.back.json b/packages/backend/tsconfig.back.json
new file mode 100644
index 0000000..9ac5a3c
--- /dev/null
+++ b/packages/backend/tsconfig.back.json
@@ -0,0 +1,23 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "lib": ["es6", "DOM"],
+ "jsx": "react",
+ "jsxFactory": "h",
+ "jsxFragmentFactory": "Fragment",
+ "moduleResolution": "Node",
+ "module": "ESNext",
+ "target": "ES6",
+ "noImplicitAny": true,
+ "noEmitOnError": true,
+ "strict": true,
+ "incremental": true,
+ "sourceMap": true,
+ "esModuleInterop": true,
+ "importHelpers": true,
+ "rootDir": "./src",
+ "typeRoots": ["./node_modules/@types"]
+ },
+ "include": ["src/**/*"]
+ }
+ \ No newline at end of file
diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json
new file mode 100644
index 0000000..7a4d70a
--- /dev/null
+++ b/packages/backend/tsconfig.json
@@ -0,0 +1,61 @@
+{
+ "compilerOptions": {
+ /* Basic Options */
+ "target": "ES6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
+ "module": "ESNext", /* Specify module code generation: 'none', commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
+ // "lib": [], /* Specify library files to be included in the compilation: */
+ "allowJs": true, /* Allow javascript files to be compiled. */
+ // "checkJs": true, /* Report errors in .js files. */
+ "jsx": "react", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
+ "jsxFactory": "h", /* Specify the JSX factory function to use when targeting react JSX emit, e.g. React.createElement or h. */
+ "jsxFragmentFactory": "Fragment", // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#custom-jsx-factories
+ // "declaration": true, /* Generates corresponding '.d.ts' file. */
+ // "sourceMap": true, /* Generates corresponding '.map' file. */
+ // "outFile": "./", /* Concatenate and emit output to single file. */
+ // "outDir": "./", /* Redirect output structure to the directory. */
+ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
+ // "removeComments": true, /* Do not emit comments to output. */
+ "noEmit": true, /* Do not emit outputs. */
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+
+ /* Strict Type-Checking Options */
+ "strict": true, /* Enable all strict type-checking options. */
+ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
+ // "strictNullChecks": true, /* Enable strict null checks. */
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
+
+ /* Additional Checks */
+ // "noUnusedLocals": true, /* Report errors on unused locals. */
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
+ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
+
+ /* Module Resolution Options */
+ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
+ "esModuleInterop": true, /* */
+ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
+ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
+ // "typeRoots": [], /* List of folders to include type definitions from. */
+ // "types": [], /* Type declaration files to be included in compilation. */
+ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
+
+ /* Source Map Options */
+ // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
+ // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
+ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
+
+ /* Experimental Options */
+ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
+
+ /* Advanced Options */
+ "skipLibCheck": true /* Skip type checking of declaration files. */
+ },
+ "include": ["src/**/*", "tests/**/*"]
+}
diff --git a/packages/backend/tsconfig.tsbuildinfo b/packages/backend/tsconfig.tsbuildinfo
new file mode 100644
index 0000000..625b637
--- /dev/null
+++ b/packages/backend/tsconfig.tsbuildinfo
@@ -0,0 +1,2147 @@
+{
+ "program": {
+ "fileInfos": {
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es5.d.ts": {
+ "version": "b3584bc5798ed422ce2516df360ffa9cf2d80b5eae852867db9ba3743145f895",
+ "signature": "b3584bc5798ed422ce2516df360ffa9cf2d80b5eae852867db9ba3743145f895",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.d.ts": {
+ "version": "dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6",
+ "signature": "dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2016.d.ts": {
+ "version": "7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467",
+ "signature": "7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.d.ts": {
+ "version": "8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9",
+ "signature": "8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.d.ts": {
+ "version": "5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06",
+ "signature": "5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.dom.d.ts": {
+ "version": "feeeb1dd8a80fb76be42b0426e8f3ffa9bdef3c2f3c12c147e7660b1c5ba8b3b",
+ "signature": "feeeb1dd8a80fb76be42b0426e8f3ffa9bdef3c2f3c12c147e7660b1c5ba8b3b",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.core.d.ts": {
+ "version": "46ee15e9fefa913333b61eaf6b18885900b139867d89832a515059b62cf16a17",
+ "signature": "46ee15e9fefa913333b61eaf6b18885900b139867d89832a515059b62cf16a17",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.collection.d.ts": {
+ "version": "43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c",
+ "signature": "43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.generator.d.ts": {
+ "version": "cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a",
+ "signature": "cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts": {
+ "version": "8b2a5df1ce95f78f6b74f1a555ccdb6baab0486b42d8345e0871dd82811f9b9a",
+ "signature": "8b2a5df1ce95f78f6b74f1a555ccdb6baab0486b42d8345e0871dd82811f9b9a",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.promise.d.ts": {
+ "version": "2bb4b3927299434052b37851a47bf5c39764f2ba88a888a107b32262e9292b7c",
+ "signature": "2bb4b3927299434052b37851a47bf5c39764f2ba88a888a107b32262e9292b7c",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts": {
+ "version": "810627a82ac06fb5166da5ada4159c4ec11978dfbb0805fe804c86406dab8357",
+ "signature": "810627a82ac06fb5166da5ada4159c4ec11978dfbb0805fe804c86406dab8357",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts": {
+ "version": "62d80405c46c3f4c527ee657ae9d43fda65a0bf582292429aea1e69144a522a6",
+ "signature": "62d80405c46c3f4c527ee657ae9d43fda65a0bf582292429aea1e69144a522a6",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts": {
+ "version": "3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93",
+ "signature": "3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts": {
+ "version": "9d122b7e8c1a5c72506eea50c0973cba55b92b5532d5cafa8a6ce2c547d57551",
+ "signature": "9d122b7e8c1a5c72506eea50c0973cba55b92b5532d5cafa8a6ce2c547d57551",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts": {
+ "version": "3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006",
+ "signature": "3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.object.d.ts": {
+ "version": "17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a",
+ "signature": "17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts": {
+ "version": "7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98",
+ "signature": "7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.string.d.ts": {
+ "version": "6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577",
+ "signature": "6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.intl.d.ts": {
+ "version": "12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d",
+ "signature": "12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts": {
+ "version": "b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e",
+ "signature": "b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts": {
+ "version": "0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a",
+ "signature": "0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts": {
+ "version": "a40c4d82bf13fcded295ac29f354eb7d40249613c15e07b53f2fc75e45e16359",
+ "signature": "a40c4d82bf13fcded295ac29f354eb7d40249613c15e07b53f2fc75e45e16359",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.intl.d.ts": {
+ "version": "df9c8a72ca8b0ed62f5470b41208a0587f0f73f0a7db28e5a1272cf92537518e",
+ "signature": "df9c8a72ca8b0ed62f5470b41208a0587f0f73f0a7db28e5a1272cf92537518e",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.promise.d.ts": {
+ "version": "bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c",
+ "signature": "bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts": {
+ "version": "c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8",
+ "signature": "c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts": {
+ "version": "7b5a10e3c897fabece5a51aa85b4111727d7adb53c2734b5d37230ff96802a09",
+ "signature": "7b5a10e3c897fabece5a51aa85b4111727d7adb53c2734b5d37230ff96802a09",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.esnext.intl.d.ts": {
+ "version": "506b80b9951c9381dc5f11897b31fca5e2a65731d96ddefa19687fbc26b23c6e",
+ "signature": "506b80b9951c9381dc5f11897b31fca5e2a65731d96ddefa19687fbc26b23c6e",
+ "affectsGlobalScope": true
+ },
+ "./src/custom.d.ts": {
+ "version": "3ead1762961f8a6387850c685954ebfda45a699b35ecc4be8b74b1d30418e346",
+ "signature": "3ead1762961f8a6387850c685954ebfda45a699b35ecc4be8b74b1d30418e346",
+ "affectsGlobalScope": false
+ },
+ "./src/declaration.d.ts": {
+ "version": "1dc27e1406e72863144904ab53e62fb3cb398b58afdce89482ff38b0d017f5a6",
+ "signature": "1dc27e1406e72863144904ab53e62fb3cb398b58afdce89482ff38b0d017f5a6",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts": {
+ "version": "12f4cfe2fe60b810c3174537bc2ddb20c1067b7768643d12cb1266fd183afb75",
+ "signature": "12f4cfe2fe60b810c3174537bc2ddb20c1067b7768643d12cb1266fd183afb75",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/jsx.d.ts": {
+ "version": "4df92626badc45649b66f8580e9c1c2b558ee378429c6b057f7b9a059847ead4",
+ "signature": "4df92626badc45649b66f8580e9c1c2b558ee378429c6b057f7b9a059847ead4",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts": {
+ "version": "8644215eab976590c24dc61e1ebdc2190725dcb3768d21b76ce703256857f9e6",
+ "signature": "8644215eab976590c24dc61e1ebdc2190725dcb3768d21b76ce703256857f9e6",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts": {
+ "version": "c405ed0b2c7156d552b198b93442d893772c6d273cde8f1e475670cbbcf2f3b3",
+ "signature": "c405ed0b2c7156d552b198b93442d893772c6d273cde8f1e475670cbbcf2f3b3",
+ "affectsGlobalScope": false
+ },
+ "./src/utils/types.ts": {
+ "version": "c11363a75a256fa1acaf10aca90c97f9623716967cec356965980f2fd610b493",
+ "signature": "2ab3afb32269a6fe4b75a2abe5036be8b4bbcf7d3b73b91869729692ed073971",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/index.ts": {
+ "version": "096f1bb5bebb122698637e9e8abfc7d055f922c779248ccd9cfacfeb2dac7302",
+ "signature": "207bfc50245ab47e02f8854fba1c7a0ae7b010dd05bcaa60c687ed3e9b5d8a0c",
+ "affectsGlobalScope": false
+ },
+ "./src/context/backend.ts": {
+ "version": "c312a3d59f926836242252819296a6af1e969e3a6c8f34a58cca90a4a7024db9",
+ "signature": "397025dd1712c07363bed3285b5dd05010f5c19a2246a28b3fda9be2db8f8d2b",
+ "affectsGlobalScope": false
+ },
+ "./src/i18n/strings.ts": {
+ "version": "029f6eeb6fcec971eeb8c743a214eb9bb62b51fec07408d95b41a4feaa04fa6c",
+ "signature": "f2255859ce54a5a7de8498611e5264964df4b46060aa847e04b96b57318001f2",
+ "affectsGlobalScope": false
+ },
+ "./src/context/translation.ts": {
+ "version": "c157e86196fb6ea61ef2067ffbc65d51f3a6f771ce4458ef3eca0fbef14905b9",
+ "signature": "f778768280b324deca5625c8163cdfce55ebbb0988a68c7a676b0ba9e5d983ae",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/preact-router@3.2.1_preact@10.5.13/node_modules/preact-router/index.d.ts": {
+ "version": "934298f9c4b63b480efa1cb8055958ccd79166ff4788290c242a0ba9c8bc371b",
+ "signature": "934298f9c4b63b480efa1cb8055958ccd79166ff4788290c242a0ba9c8bc371b",
+ "affectsGlobalScope": false
+ },
+ "./src/index.tsx": {
+ "version": "c1f1a0bd7293562a69579f48a6588c03bfa946edb7887c9f22ed832cdb67b57c",
+ "signature": "ad890ac8f5c2749920f3e25738c791781081a113205bd5bb777bad6e83af5872",
+ "affectsGlobalScope": false
+ },
+ "./src/context/config.ts": {
+ "version": "818e52cb36b58a10c2345180f0097888dddf3e4fe657184818cf6d1c9d138f46",
+ "signature": "f3053b202e6fc97a98894ccc3761b320e8bdf2cdfc8929c14e0069494d3a0f95",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts": {
+ "version": "4620a98b47b2a31a62ffcb5337e0d525c43fceb48971bcb083f5d64fe3eab82b",
+ "signature": "4620a98b47b2a31a62ffcb5337e0d525c43fceb48971bcb083f5d64fe3eab82b",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/global.d.ts": {
+ "version": "ecf78e637f710f340ec08d5d92b3f31b134a46a4fcf2e758690d8c46ce62cba6",
+ "signature": "ecf78e637f710f340ec08d5d92b3f31b134a46a4fcf2e758690d8c46ce62cba6",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/csstype@3.0.8/node_modules/csstype/index.d.ts": {
+ "version": "4ee363f83d7be2202f34fcd84c44da71bf3a9329fee8a05f976f75083a52ea94",
+ "signature": "4ee363f83d7be2202f34fcd84c44da71bf3a9329fee8a05f976f75083a52ea94",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+prop-types@15.7.3/node_modules/@types/prop-types/index.d.ts": {
+ "version": "a7e32dcb90bf0c1b7a1e4ac89b0f7747cbcba25e7beddc1ebf17be1e161842ad",
+ "signature": "a7e32dcb90bf0c1b7a1e4ac89b0f7747cbcba25e7beddc1ebf17be1e161842ad",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+scheduler@0.16.1/node_modules/@types/scheduler/tracing.d.ts": {
+ "version": "f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",
+ "signature": "f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts": {
+ "version": "5d708266116e778d6a4140fca2ac36f71d99b4c68bc3be63a45ba8bf5ade5348",
+ "signature": "5d708266116e778d6a4140fca2ac36f71d99b4c68bc3be63a45ba8bf5ade5348",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr.d.ts": {
+ "version": "5f128915c2b4262a78770fc5e48b950276e512435b3ec12901aa8f52b989c2f3",
+ "signature": "5f128915c2b4262a78770fc5e48b950276e512435b3ec12901aa8f52b989c2f3",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr-infinite.d.ts": {
+ "version": "acbaa225ae58e247b0d882636a10b8d4e8d8c8a3afe3b3b84b4569d9bdc0d8cc",
+ "signature": "acbaa225ae58e247b0d882636a10b8d4e8d8c8a3afe3b3b84b4569d9bdc0d8cc",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/dequal@2.0.2/node_modules/dequal/lite/index.d.ts": {
+ "version": "41a5ae482e864a6128e6054e88f1c0e06884793f92aff5c67144fb02d2373079",
+ "signature": "41a5ae482e864a6128e6054e88f1c0e06884793f92aff5c67144fb02d2373079",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/cache.d.ts": {
+ "version": "2e8e9b7d35291ee9d6c40f94f0f9b15e37565cbecf694c926737e1e5cf22f1ca",
+ "signature": "2e8e9b7d35291ee9d6c40f94f0f9b15e37565cbecf694c926737e1e5cf22f1ca",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/config.d.ts": {
+ "version": "5148074c9e3937b8c251521ae25322257d672ff80a65556c866cc40ad58e93bf",
+ "signature": "5148074c9e3937b8c251521ae25322257d672ff80a65556c866cc40ad58e93bf",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts": {
+ "version": "0e2173eeb5f884769801cdaa741ebb92bd70beb397eb31355f87000e4b09fb78",
+ "signature": "0e2173eeb5f884769801cdaa741ebb92bd70beb397eb31355f87000e4b09fb78",
+ "affectsGlobalScope": false
+ },
+ "./src/context/fetch.ts": {
+ "version": "860378ceb989d1ead99e3c6eb6880825d500fe54af37591d32ba162049973eb4",
+ "signature": "5714aa731be71fded434162842dc4c1843e2702cb1675dbc110709a7fca8e807",
+ "affectsGlobalScope": false
+ },
+ "./src/context/instance.ts": {
+ "version": "032bbb0efa80f64179fc565a94dcb6917eda2e889879c7746c3d323b522a6d97",
+ "signature": "2aa83f05978ffeb855677d1d949bfd3bda6bf4c0a843c61b6506fac6ad1814e3",
+ "affectsGlobalScope": false
+ },
+ "./src/context/listener.ts": {
+ "version": "e5a49e5fca1091640fba5d86d39d9468f4071ef5a26a1711a07066d939d8211f",
+ "signature": "c8de4d2a55470bc8334ff0a25097908bdfa91a903c5e8ef6ae554e8bbf95c6a9",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/axios@0.21.1/node_modules/axios/index.d.ts": {
+ "version": "0d892f035dbee4534f0ba096407136877595ca592f67ec9bb8a5c912b9c967e8",
+ "signature": "0d892f035dbee4534f0ba096407136877595ca592f67ec9bb8a5c912b9c967e8",
+ "affectsGlobalScope": false
+ },
+ "./src/utils/constants.ts": {
+ "version": "76c0c50519f341c32ed665cdd5ad02f20a833e84096de4953fe6a545b63a1677",
+ "signature": "7bc253933a00f6c7fd51e68636b1bb0dd85b6cd29f0fff27e005e49c00c07e73",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/backend.ts": {
+ "version": "9b17e7e527224eed40c2dfd27db6479a01233b6f2c8dfa59de11a4eb8ed254c8",
+ "signature": "9cceb6c1909fb47340f428fd444c924f974aa49740d4e8245e7ccaac6a1cc6bf",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/async.ts": {
+ "version": "d010edbf34a97c5b1f8837e429433ca097372d0decf69bbe49b540bc27fa82fd",
+ "signature": "88069e8a2f9667a985c777d6d72be006095e545072bf36d7d7f481dd32397854",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/instance.ts": {
+ "version": "29914aebad9fffb68717e16a9699fe26beeedda2337b1033ed14deef98e9d692",
+ "signature": "100a8c92d7faf34f6b60170d298b78246f675f6b042453e92380a64f1439f6b3",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/listener.ts": {
+ "version": "3f8194b8f56b1518865e6eb0978d64716887dd6f372b64e0a493e1adfe0eac53",
+ "signature": "b7fa11a29212b20267d66c7aa6d9d6c4b7321152dcfe5fea8b97cbba6b06eb8c",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/notification.ts": {
+ "version": "23da51c3574ae4a4eafe4dc36cb44b098105d763c0ad105ec05cb67368080bab",
+ "signature": "7addb846a4bb53a1b25ac8900334fd6b73340c134a1be1effc9267347f1c9555",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/notifications.ts": {
+ "version": "590300a89ef4719ad2b69908057b65901991580588fcb4ca998b5efb97461469",
+ "signature": "2137b357069b96c9ec9afd2a70140e74a8c97d3fddc503b3e5943940be272c0a",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/order.ts": {
+ "version": "0f74614b3539f8d76f6cc9be337b14eaa59bce0b519b3ab6284e1e9895fd96f9",
+ "signature": "e221b2a7e9092966d245443db820f4059462bc71bcf7f547d0844c2445fe7f10",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/product.ts": {
+ "version": "a6837709e078ffc860f4b166ed06a6592e1a3d8ae30ba28f9cbdd364f1383fa8",
+ "signature": "2a9eed2d24bd3af773eb764df4aa19fee0119602439eb172872281be9fd0d8ff",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/tips.ts": {
+ "version": "6dd3685ea439b7e06531cb3db0bab85d0fe71b466349afd3a65cf0dff3322a01",
+ "signature": "0ab04f7e8a3f649db8a7ce73882b40c6e88761faabebfab4126a4bcf584708d7",
+ "affectsGlobalScope": false
+ },
+ "./src/hooks/transfer.ts": {
+ "version": "3bf2a213bde75a180c3f4f09d1e8bae5db7e4c6c4e25a8f53fe529ed400a44ac",
+ "signature": "c599ccb25328c84661aa3eab931b36a1fbcaaf660b7607b7cab8aec7f538fb63",
+ "affectsGlobalScope": false
+ },
+ "./src/i18n/index.tsx": {
+ "version": "7327d1c0f26a31a60c6957e245ee5ac5e6c3e3f92a1ee1f0552dad2343dfd9ce",
+ "signature": "06d2b1bcf20ad5341a4f9a82b6804be059e5f5d0aed17ae8b1c3d4bba74b867f",
+ "affectsGlobalScope": false
+ },
+ "./src/pages/DepletedTip.tsx": {
+ "version": "33cbfc54d746eb9e53ee0c797eb80f144b69fb06c04e99f2ec71009882c29cdc",
+ "signature": "97f36a2ceb55edc9b749d00f5cdb54eaed31e83d69772fe64e1f54f6d35f07c0",
+ "affectsGlobalScope": false
+ },
+ "./src/pages/OfferRefund.tsx": {
+ "version": "7c2849f13472f95105312514aee7aeca2d24a772cdf1c883fbc0d81f5d458980",
+ "signature": "365555b8b6815afadbaed23c1e87d4dfb71ca4e94c1fdab26291eecb784420a7",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/CSSProperties.d.ts": {
+ "version": "278b91531540f4d1d4b4f9e065e733d057d70dc8fa7d995aba6077567e541e8f",
+ "signature": "278b91531540f4d1d4b4f9e065e733d057d70dc8fa7d995aba6077567e541e8f",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/StyledMeta.d.ts": {
+ "version": "cfd5cd3560f111d6025dd6ed498fc9f6d6f4463018b4b0f1418bf2dc5a4655ea",
+ "signature": "cfd5cd3560f111d6025dd6ed498fc9f6d6f4463018b4b0f1418bf2dc5a4655ea",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/css.d.ts": {
+ "version": "d6dbc3dc9f8dabbe2a51472c60be357ee7a0d908543fe56610ad3eda1b216ff9",
+ "signature": "d6dbc3dc9f8dabbe2a51472c60be357ee7a0d908543fe56610ad3eda1b216ff9",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/cx.d.ts": {
+ "version": "db99d48b25ff0ffa61a6825514a6b5debf0760aee74785f2230e8b35dbb8c358",
+ "signature": "db99d48b25ff0ffa61a6825514a6b5debf0760aee74785f2230e8b35dbb8c358",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/index.d.ts": {
+ "version": "29cbfb141e67f9b2d56bc918e3e193b4ecb2735e8e4d563e5401f12e8dbd5723",
+ "signature": "29cbfb141e67f9b2d56bc918e3e193b4ecb2735e8e4d563e5401f12e8dbd5723",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/styled.d.ts": {
+ "version": "d181b3ad1cb0259b249d63c3cd51035fed2698be8ad509dd737b70f39aad8916",
+ "signature": "d181b3ad1cb0259b249d63c3cd51035fed2698be8ad509dd737b70f39aad8916",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/index.d.ts": {
+ "version": "7b09387e5fa8f5b95206daa783134b237c0fce0e5c330403df317361286de23f",
+ "signature": "7b09387e5fa8f5b95206daa783134b237c0fce0e5c330403df317361286de23f",
+ "affectsGlobalScope": false
+ },
+ "./src/pages/OfferTip.tsx": {
+ "version": "4b3c27749fee337c302e7d80a41fbcc9d0acb77b19151e91f7bc97ef435108d1",
+ "signature": "bbf15d4b62bce6a370e8cd72d84103331eb524e5d59eb323baeb53df0a999227",
+ "affectsGlobalScope": false
+ },
+ "./src/pages/RequestPayment.tsx": {
+ "version": "084a4bf65592b83618772118de5a1a7d97ef48207c44b010777826841d892e2c",
+ "signature": "bf0817a3d2d34b81564e8c8e74541ec410d5377ba8672c7fe60c49a099e6cce1",
+ "affectsGlobalScope": false
+ },
+ "./src/pages/ShowOrderDetails.tsx": {
+ "version": "12ce47dd0a5087aa7f29a4e53b9e4687424a87f5537f779ad38ea21b375c39ce",
+ "signature": "d948db2f7c1a3d5ae10b080688287439a49723e513431142e9b2ecd117855c0f",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/taler-error-codes.d.ts": {
+ "version": "009a10f64712ba2639bc4072fe7886e9c22c802ec27720d60a0f2ef77763b0b9",
+ "signature": "009a10f64712ba2639bc4072fe7886e9c22c802ec27720d60a0f2ef77763b0b9",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts": {
+ "version": "44025fa8aaf8e2fdb65fb8eeec70227398a80f1c1a388f4690028ce9d17e374a",
+ "signature": "44025fa8aaf8e2fdb65fb8eeec70227398a80f1c1a388f4690028ce9d17e374a",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts": {
+ "version": "da7b209579d85b9438ffd90f654fceb0799e28d87116f05a4fc688fb30c0ce2d",
+ "signature": "da7b209579d85b9438ffd90f654fceb0799e28d87116f05a4fc688fb30c0ce2d",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts": {
+ "version": "f41a1dca362892daf45164a67d9c127617bfb09fa993df5c0966f53e5ccd3c56",
+ "signature": "f41a1dca362892daf45164a67d9c127617bfb09fa993df5c0966f53e5ccd3c56",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts": {
+ "version": "cd3723cb54f9f94943b53d81371b1aa02db3e0aa1e03784d94a7f5e5473eb244",
+ "signature": "cd3723cb54f9f94943b53d81371b1aa02db3e0aa1e03784d94a7f5e5473eb244",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/backupTypes.d.ts": {
+ "version": "28c3383d158e6c4c9b4daded129e37353ca5bb9ec07f8c6c81b713b5c93c814f",
+ "signature": "28c3383d158e6c4c9b4daded129e37353ca5bb9ec07f8c6c81b713b5c93c814f",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/helpers.d.ts": {
+ "version": "379cdf766e9f8d4b7e7841361c16acd82f6c76a29f00750b20b121ee32e6b770",
+ "signature": "379cdf766e9f8d4b7e7841361c16acd82f6c76a29f00750b20b121ee32e6b770",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/libtool-version.d.ts": {
+ "version": "2c676bd1a351c303871a4fd861a0142a21cb2a6ed6e9d3238410721dea5b3a69",
+ "signature": "2c676bd1a351c303871a4fd861a0142a21cb2a6ed6e9d3238410721dea5b3a69",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/transactionsTypes.d.ts": {
+ "version": "6fd1a054f1c9449e1fbc77676c81a1b6059dab821de9c94feb45d1938961209a",
+ "signature": "6fd1a054f1c9449e1fbc77676c81a1b6059dab821de9c94feb45d1938961209a",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts": {
+ "version": "9db38041d762025587496aae9fc4392a4728f988be77bca5ecc84b2c25ec27c7",
+ "signature": "9db38041d762025587496aae9fc4392a4728f988be77bca5ecc84b2c25ec27c7",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/notifications.d.ts": {
+ "version": "116ebb1f7fb8b3d223accd0dee0aa62e6f9cc4236d8400052d95e5b40908de2e",
+ "signature": "116ebb1f7fb8b3d223accd0dee0aa62e6f9cc4236d8400052d95e5b40908de2e",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/payto.d.ts": {
+ "version": "0f33fd5b5cff9ab40543b85ba6ea596042197a0470ee184414e2d415aae675fe",
+ "signature": "0f33fd5b5cff9ab40543b85ba6ea596042197a0470ee184414e2d415aae675fe",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveTransaction.d.ts": {
+ "version": "d12aa80a7e59c6a9d63460d432a913609716648159c4fa944718faec1e1b90b1",
+ "signature": "d12aa80a7e59c6a9d63460d432a913609716648159c4fa944718faec1e1b90b1",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveStatus.d.ts": {
+ "version": "931ab7a592ba3a7552a4448c4c050146d9ef43bb3d927bea32f9b367b1a3c98e",
+ "signature": "931ab7a592ba3a7552a4448c4c050146d9ef43bb3d927bea32f9b367b1a3c98e",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerconfig.d.ts": {
+ "version": "1c47a1ac8c41daf679dfaf8b907c194df2189edcbe3731a530b0c4687047ce12",
+ "signature": "1c47a1ac8c41daf679dfaf8b907c194df2189edcbe3731a530b0c4687047ce12",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/taleruri.d.ts": {
+ "version": "cc9041b68cd6a78284d03b39784e776bbc53cbde50c68d0e48feb406eef0f9e3",
+ "signature": "cc9041b68cd6a78284d03b39784e776bbc53cbde50c68d0e48feb406eef0f9e3",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/index.d.ts": {
+ "version": "c6f035fa8650966b9ba22e26649017134da40f67b59de5d7d3a8ecaa853e1aa9",
+ "signature": "c6f035fa8650966b9ba22e26649017134da40f67b59de5d7d3a8ecaa853e1aa9",
+ "affectsGlobalScope": false
+ },
+ "./src/utils/amount.ts": {
+ "version": "8c9970197739230e71cf2d4eb51d8d04dc6b2ffc9292c61ed946583eb85867d2",
+ "signature": "2aebde42f8ba9480ec22ab05c122c7e5a3ddeb973e0d994b898e9d4da35e3cd6",
+ "affectsGlobalScope": false
+ },
+ "./src/utils/table.ts": {
+ "version": "15bdc778277e379ef966214ea8d21791a178b5f38b4e862b940de61ca28768fd",
+ "signature": "3e5f5d10406b5b10d670eea723e36ccad043afd9edda3508108d989137dea3bf",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert/strict.d.ts": {
+ "version": "c7bdc99177a2a94d25fb13722adaaf5b3291bf70b4d1b27584ba189dd3889ba3",
+ "signature": "c7bdc99177a2a94d25fb13722adaaf5b3291bf70b4d1b27584ba189dd3889ba3",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/globals.d.ts": {
+ "version": "5402314c88d0127f63f94a0272f79e04ea0fc010ff6da6613807504c4163a1ad",
+ "signature": "5402314c88d0127f63f94a0272f79e04ea0fc010ff6da6613807504c4163a1ad",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts": {
+ "version": "d20f08527645f62facb2d66c2b7bd31ea964b59c897d00bddb1efe8c13890b72",
+ "signature": "d20f08527645f62facb2d66c2b7bd31ea964b59c897d00bddb1efe8c13890b72",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/buffer.d.ts": {
+ "version": "5726b5ce952dc5beaeb08d5f64236632501568a54a390363d2339ba1dc5393b1",
+ "signature": "5726b5ce952dc5beaeb08d5f64236632501568a54a390363d2339ba1dc5393b1",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts": {
+ "version": "674bedbfd2004e233e2a266a3d2286e524f0d58787a98522d834d6ccda1d215a",
+ "signature": "674bedbfd2004e233e2a266a3d2286e524f0d58787a98522d834d6ccda1d215a",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/cluster.d.ts": {
+ "version": "714637d594e1a38a075091fe464ca91c6abc0b154784b4287f6883200e28ccef",
+ "signature": "714637d594e1a38a075091fe464ca91c6abc0b154784b4287f6883200e28ccef",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/console.d.ts": {
+ "version": "23edba5f47d3409810c563fe8034ae2c59e718e1ef8570f4152ccdde1915a096",
+ "signature": "23edba5f47d3409810c563fe8034ae2c59e718e1ef8570f4152ccdde1915a096",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/constants.d.ts": {
+ "version": "0e9c55f894ca2d9cf63b5b0d43a8cec1772dd560233fd16275bc7a485eb82f83",
+ "signature": "0e9c55f894ca2d9cf63b5b0d43a8cec1772dd560233fd16275bc7a485eb82f83",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts": {
+ "version": "4105385afd60b90ebac359d02a186250885839122850d776c0ad0e327c1afb65",
+ "signature": "4105385afd60b90ebac359d02a186250885839122850d776c0ad0e327c1afb65",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dgram.d.ts": {
+ "version": "5f0a09de75bd965c21dc6d73671ba88830272f9ed62897bb0aa9754b369b1eed",
+ "signature": "5f0a09de75bd965c21dc6d73671ba88830272f9ed62897bb0aa9754b369b1eed",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts": {
+ "version": "12b2ab05a3ededc0e8938f2e16e4e2e30fc82b6d97b414067c26253f26fce69a",
+ "signature": "12b2ab05a3ededc0e8938f2e16e4e2e30fc82b6d97b414067c26253f26fce69a",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts": {
+ "version": "e4ab7077b5adff3156d258a284986dc85e0bcf0fff1670df5c7f83efc25d4cc6",
+ "signature": "e4ab7077b5adff3156d258a284986dc85e0bcf0fff1670df5c7f83efc25d4cc6",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/domain.d.ts": {
+ "version": "06d2be99c3dd2ff52114d02ee443ba486ab482423df1941d3c97d6a92e924d70",
+ "signature": "06d2be99c3dd2ff52114d02ee443ba486ab482423df1941d3c97d6a92e924d70",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts": {
+ "version": "eb15e56611c2a853526a2e202234dd1676bd37cc2fcdbd9843470f7dafb37f15",
+ "signature": "eb15e56611c2a853526a2e202234dd1676bd37cc2fcdbd9843470f7dafb37f15",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts": {
+ "version": "2e0b4284620082f63b144da8096b207e9e9590c0e599834332b90624db0cc4a8",
+ "signature": "2e0b4284620082f63b144da8096b207e9e9590c0e599834332b90624db0cc4a8",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts": {
+ "version": "c98ce957db9eebd75f53edda3f6893e05ab2d2283b5667b18e31bcdb6427ed10",
+ "signature": "c98ce957db9eebd75f53edda3f6893e05ab2d2283b5667b18e31bcdb6427ed10",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts": {
+ "version": "37eed30fc8318b8ac76eac6f41d0758a9d0bffd8f3ff353e3ad0f8717dd08d92",
+ "signature": "37eed30fc8318b8ac76eac6f41d0758a9d0bffd8f3ff353e3ad0f8717dd08d92",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http2.d.ts": {
+ "version": "2f69728fd1ca1f381879bbf20a42ae47a8f7286e000afd138c6cf870d90d882f",
+ "signature": "2f69728fd1ca1f381879bbf20a42ae47a8f7286e000afd138c6cf870d90d882f",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/https.d.ts": {
+ "version": "1978992206803f5761e99e893d93b25abc818c5fe619674fdf2ae02b29f641ba",
+ "signature": "1978992206803f5761e99e893d93b25abc818c5fe619674fdf2ae02b29f641ba",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/inspector.d.ts": {
+ "version": "05fbe81f09fc455a2c343d2458d2b3c600c90b92b22926be765ee79326be9466",
+ "signature": "05fbe81f09fc455a2c343d2458d2b3c600c90b92b22926be765ee79326be9466",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/module.d.ts": {
+ "version": "8e7d6dae9e19bbe47600dcfd4418db85b30ae7351474ea0aad5e628f9845d340",
+ "signature": "8e7d6dae9e19bbe47600dcfd4418db85b30ae7351474ea0aad5e628f9845d340",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts": {
+ "version": "2c381d36201776828c67a307ad5fd8cbcf9ecaffb1fc7f77f7ce433d1a632b7f",
+ "signature": "2c381d36201776828c67a307ad5fd8cbcf9ecaffb1fc7f77f7ce433d1a632b7f",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts": {
+ "version": "32542c4660ecda892a333a533feedba31738ee538ef6a78eb73af647137bc3fc",
+ "signature": "32542c4660ecda892a333a533feedba31738ee538ef6a78eb73af647137bc3fc",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/path.d.ts": {
+ "version": "0ecacea5047d1a7d350e7049dbd22f26435be5e8736a81a56afec5b3264db1ca",
+ "signature": "0ecacea5047d1a7d350e7049dbd22f26435be5e8736a81a56afec5b3264db1ca",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/perf_hooks.d.ts": {
+ "version": "ffcb4ebde21f83370ed402583888b28651d2eb7f05bfec9482eb46d82adedd7f",
+ "signature": "ffcb4ebde21f83370ed402583888b28651d2eb7f05bfec9482eb46d82adedd7f",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/process.d.ts": {
+ "version": "fcb95c45150c717706119f12f2a3639d51baa041cd5bb441eb8501e04b52c501",
+ "signature": "fcb95c45150c717706119f12f2a3639d51baa041cd5bb441eb8501e04b52c501",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/punycode.d.ts": {
+ "version": "a7b43c69f9602d198825e403ee34e5d64f83c48b391b2897e8c0e6f72bca35f8",
+ "signature": "a7b43c69f9602d198825e403ee34e5d64f83c48b391b2897e8c0e6f72bca35f8",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts": {
+ "version": "f4a3fc4efc6944e7b7bd4ccfa45e0df68b6359808e6cf9d061f04fd964a7b2d3",
+ "signature": "f4a3fc4efc6944e7b7bd4ccfa45e0df68b6359808e6cf9d061f04fd964a7b2d3",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts": {
+ "version": "73cad675aead7a2c05cf934e7e700c61d84b2037ac1d576c3f751199b25331da",
+ "signature": "73cad675aead7a2c05cf934e7e700c61d84b2037ac1d576c3f751199b25331da",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/repl.d.ts": {
+ "version": "8c3137ba3583ec18484429ec1c8eff89efdc42730542f157b38b102fdccc0c71",
+ "signature": "8c3137ba3583ec18484429ec1c8eff89efdc42730542f157b38b102fdccc0c71",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts": {
+ "version": "2b6906b19436e07d874a51a5829d94ab690337c4ee652735ab422a8f102168be",
+ "signature": "2b6906b19436e07d874a51a5829d94ab690337c4ee652735ab422a8f102168be",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts": {
+ "version": "1b98a8704d0c68520ccb02ac44782b7ffdaab40d23d2fa00e13923b528587f8b",
+ "signature": "1b98a8704d0c68520ccb02ac44782b7ffdaab40d23d2fa00e13923b528587f8b",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/string_decoder.d.ts": {
+ "version": "94ca7beec4e274d32362b54e0133152f7b4be9487db7b005070c03880b6363aa",
+ "signature": "94ca7beec4e274d32362b54e0133152f7b4be9487db7b005070c03880b6363aa",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts": {
+ "version": "911175d5a29fce5f6f471bcab94524474a1f99eec9cb86fe96505a40ce75f972",
+ "signature": "911175d5a29fce5f6f471bcab94524474a1f99eec9cb86fe96505a40ce75f972",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers/promises.d.ts": {
+ "version": "8b4f4519834b57645d2483af74d6f5d1675260a5b0e9aa6026f3e021edd2c5e9",
+ "signature": "8b4f4519834b57645d2483af74d6f5d1675260a5b0e9aa6026f3e021edd2c5e9",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts": {
+ "version": "bbf21f210782db4193359010a4710786add43e3b50aa42fc0d371f45b4e4d8d3",
+ "signature": "bbf21f210782db4193359010a4710786add43e3b50aa42fc0d371f45b4e4d8d3",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/trace_events.d.ts": {
+ "version": "0b7733d83619ac4e3963e2a9f7c75dc1e9af6850cb2354c9554977813092c10a",
+ "signature": "0b7733d83619ac4e3963e2a9f7c75dc1e9af6850cb2354c9554977813092c10a",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts": {
+ "version": "3ce933f0c3955f67f67eb7d6b5c83c2c54a18472c1d6f2bb651e51dd40c84837",
+ "signature": "3ce933f0c3955f67f67eb7d6b5c83c2c54a18472c1d6f2bb651e51dd40c84837",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts": {
+ "version": "631e96db896d645f7132c488ad34a16d71fd2be9f44696f8c98289ee1c8cbfa9",
+ "signature": "631e96db896d645f7132c488ad34a16d71fd2be9f44696f8c98289ee1c8cbfa9",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts": {
+ "version": "2c77230d381cba81eb6f87cda2fbfff6c0427c6546c2e2590110effff37c58f7",
+ "signature": "2c77230d381cba81eb6f87cda2fbfff6c0427c6546c2e2590110effff37c58f7",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/v8.d.ts": {
+ "version": "da86ee9a2f09a4583db1d5e37815894967e1f694ad9f3c25e84e0e4d40411e14",
+ "signature": "da86ee9a2f09a4583db1d5e37815894967e1f694ad9f3c25e84e0e4d40411e14",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts": {
+ "version": "141a943e5690105898a67537a470f70b56d0e183441b56051d929e902376b7b2",
+ "signature": "141a943e5690105898a67537a470f70b56d0e183441b56051d929e902376b7b2",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/worker_threads.d.ts": {
+ "version": "0124e458b12ba82b08c87220a1c9d4fb7701dcda8f11e28f7d7266281501bcba",
+ "signature": "0124e458b12ba82b08c87220a1c9d4fb7701dcda8f11e28f7d7266281501bcba",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/zlib.d.ts": {
+ "version": "515ef1d99036ff0dafa5bf738e02222edea94e0d97a0aa0ff277ac5e96b57977",
+ "signature": "515ef1d99036ff0dafa5bf738e02222edea94e0d97a0aa0ff277ac5e96b57977",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/globals.global.d.ts": {
+ "version": "2708349d5a11a5c2e5f3a0765259ebe7ee00cdcc8161cb9990cb4910328442a1",
+ "signature": "2708349d5a11a5c2e5f3a0765259ebe7ee00cdcc8161cb9990cb4910328442a1",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/wasi.d.ts": {
+ "version": "780058f4a804c8bdcdd2f60e7af64b2bc57d149c1586ee3db732a84d659a50bf",
+ "signature": "780058f4a804c8bdcdd2f60e7af64b2bc57d149c1586ee3db732a84d659a50bf",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/ts3.6/base.d.ts": {
+ "version": "210ef68f34baca2a4499c07a51f05d51b4f0ef01d64efea3017cb3bc31c37e33",
+ "signature": "210ef68f34baca2a4499c07a51f05d51b4f0ef01d64efea3017cb3bc31c37e33",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts": {
+ "version": "19d580a3b42ad5caeaee266ae958260e23f2df0549ee201c886c8bd7a4f01d4e",
+ "signature": "19d580a3b42ad5caeaee266ae958260e23f2df0549ee201c886c8bd7a4f01d4e",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/base.d.ts": {
+ "version": "e61a21e9418f279bc480394a94d1581b2dee73747adcbdef999b6737e34d721b",
+ "signature": "e61a21e9418f279bc480394a94d1581b2dee73747adcbdef999b6737e34d721b",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/index.d.ts": {
+ "version": "6c9c7e459e013ddf52c70b90f88bbdd925e483ef984d80f9bffb501029974e82",
+ "signature": "6c9c7e459e013ddf52c70b90f88bbdd925e483ef984d80f9bffb501029974e82",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+cheerio@0.22.28/node_modules/@types/cheerio/index.d.ts": {
+ "version": "496086e48c978c6410a7dd1fee3c2c8f7abf297ed9f32e92672358c5ff9d1035",
+ "signature": "496086e48c978c6410a7dd1fee3c2c8f7abf297ed9f32e92672358c5ff9d1035",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+enzyme@3.10.8/node_modules/@types/enzyme/index.d.ts": {
+ "version": "c9f092fa413eb709080f1494dcbb4a18757e84eb5d2b8bb0cc84f73d84a70dd7",
+ "signature": "c9f092fa413eb709080f1494dcbb4a18757e84eb5d2b8bb0cc84f73d84a70dd7",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/DOMUtils.d.ts": {
+ "version": "271cde49dfd9b398ccc91bb3aaa43854cf76f4d14e10fed91cbac649aa6cbc63",
+ "signature": "271cde49dfd9b398ccc91bb3aaa43854cf76f4d14e10fed91cbac649aa6cbc63",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createBrowserHistory.d.ts": {
+ "version": "c6f2572e21f626260d2e4a65e4e1e42b9b273b6f43b5c3bc115c2926417d3eca",
+ "signature": "c6f2572e21f626260d2e4a65e4e1e42b9b273b6f43b5c3bc115c2926417d3eca",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createHashHistory.d.ts": {
+ "version": "374ab77e05e0bf5a52acad6d65121d4bd31068108f23d70186dba5fcd7d6a1a3",
+ "signature": "374ab77e05e0bf5a52acad6d65121d4bd31068108f23d70186dba5fcd7d6a1a3",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createMemoryHistory.d.ts": {
+ "version": "a4ecd4bb653aa71093375845fba6250ca0f3c633d0e933fc9bf4b301834eab27",
+ "signature": "a4ecd4bb653aa71093375845fba6250ca0f3c633d0e933fc9bf4b301834eab27",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/LocationUtils.d.ts": {
+ "version": "25d91fb9ed77a828cc6c7a863236fb712dafcd52f816eec481bd0c1f589f4404",
+ "signature": "25d91fb9ed77a828cc6c7a863236fb712dafcd52f816eec481bd0c1f589f4404",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/PathUtils.d.ts": {
+ "version": "4cd14cea22eed1bfb0dc76183e56989f897ac5b14c0e2a819e5162eafdcfe243",
+ "signature": "4cd14cea22eed1bfb0dc76183e56989f897ac5b14c0e2a819e5162eafdcfe243",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts": {
+ "version": "cc53cba64efb30576f2a36f1d7107e4453e84cbd0f371d49cd1dfd208e11233b",
+ "signature": "cc53cba64efb30576f2a36f1d7107e4453e84cbd0f371d49cd1dfd208e11233b",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupSemantic.d.ts": {
+ "version": "d8aab31ba8e618cc3eea10b0945de81cb93b7e8150a013a482332263b9305322",
+ "signature": "d8aab31ba8e618cc3eea10b0945de81cb93b7e8150a013a482332263b9305322",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts": {
+ "version": "69da61a7b5093dac77fa3bec8be95dcf9a74c95a0e9161edb98bb24e30e439d2",
+ "signature": "69da61a7b5093dac77fa3bec8be95dcf9a74c95a0e9161edb98bb24e30e439d2",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/diffLines.d.ts": {
+ "version": "561eca7a381b96d6ccac6e4061e6d2ae53f5bc44203f3fd9f5b26864c32ae6e9",
+ "signature": "561eca7a381b96d6ccac6e4061e6d2ae53f5bc44203f3fd9f5b26864c32ae6e9",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/printDiffs.d.ts": {
+ "version": "62ea38627e3ebab429f7616812a9394d327c2bc271003dfba985de9b4137369f",
+ "signature": "62ea38627e3ebab429f7616812a9394d327c2bc271003dfba985de9b4137369f",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/index.d.ts": {
+ "version": "b4439890c168d646357928431100daac5cbdee1d345a34e6bf6eca9f3abe22bc",
+ "signature": "b4439890c168d646357928431100daac5cbdee1d345a34e6bf6eca9f3abe22bc",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/types.d.ts": {
+ "version": "5d72971a459517c44c1379dab9ed248e87a61ba0a1e0f25c9d67e1e640cd9a09",
+ "signature": "5d72971a459517c44c1379dab9ed248e87a61ba0a1e0f25c9d67e1e640cd9a09",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/index.d.ts": {
+ "version": "02d734976af36f4273d930bea88b3e62adf6b078cf120c1c63d49aa8d8427c5c",
+ "signature": "02d734976af36f4273d930bea88b3e62adf6b078cf120c1c63d49aa8d8427c5c",
+ "affectsGlobalScope": false
+ },
+ "../../node_modules/.pnpm/@types+jest@26.0.23/node_modules/@types/jest/index.d.ts": {
+ "version": "bbc19287f48d4b3c753bd2c82dd9326af19cccbfa1506f859029dfcedc7c5522",
+ "signature": "bbc19287f48d4b3c753bd2c82dd9326af19cccbfa1506f859029dfcedc7c5522",
+ "affectsGlobalScope": true
+ },
+ "../../node_modules/.pnpm/@types+mocha@8.2.2/node_modules/@types/mocha/index.d.ts": {
+ "version": "0359800d3b440f8515001431cde1500944e156040577425eb3f7b80af0846612",
+ "signature": "0359800d3b440f8515001431cde1500944e156040577425eb3f7b80af0846612",
+ "affectsGlobalScope": true
+ }
+ },
+ "options": {
+ "module": 99,
+ "skipLibCheck": true,
+ "composite": true,
+ "lib": [
+ "lib.es2015.d.ts",
+ "lib.dom.d.ts"
+ ],
+ "jsx": 2,
+ "jsxFactory": "h",
+ "jsxFragmentFactory": "Fragment",
+ "moduleResolution": 2,
+ "target": 2,
+ "noImplicitAny": true,
+ "outDir": "./lib",
+ "noEmitOnError": true,
+ "strict": true,
+ "incremental": true,
+ "sourceMap": true,
+ "esModuleInterop": true,
+ "importHelpers": true,
+ "rootDir": "./src",
+ "typeRoots": [
+ "./node_modules/@types"
+ ],
+ "configFilePath": "./tsconfig.json",
+ "noEmitHelpers": true,
+ "noEmit": false,
+ "emitDeclarationOnly": false,
+ "noResolve": false
+ },
+ "referencedMap": {
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveStatus.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveTransaction.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveTransaction.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/backupTypes.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/helpers.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/index.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveStatus.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveTransaction.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/backupTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/helpers.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/libtool-version.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/notifications.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/payto.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/taler-error-codes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerconfig.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/taleruri.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/transactionsTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/notifications.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerconfig.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/transactionsTypes.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/backupTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/transactionsTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/css.d.ts": [
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/CSSProperties.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/StyledMeta.d.ts"
+ ],
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/index.d.ts": [
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/CSSProperties.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/StyledMeta.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/css.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/cx.d.ts"
+ ],
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/index.d.ts": [
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/index.d.ts",
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/styled.d.ts"
+ ],
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/styled.d.ts": [
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/index.d.ts",
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+cheerio@0.22.28/node_modules/@types/cheerio/index.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+enzyme@3.10.8/node_modules/@types/enzyme/index.d.ts": [
+ "../../node_modules/.pnpm/@types+cheerio@0.22.28/node_modules/@types/cheerio/index.d.ts",
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/LocationUtils.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/PathUtils.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createBrowserHistory.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/DOMUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createHashHistory.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/DOMUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createMemoryHistory.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/DOMUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/LocationUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/PathUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createBrowserHistory.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createHashHistory.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createMemoryHistory.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+jest@26.0.23/node_modules/@types/jest/index.d.ts": [
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/index.d.ts",
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert/strict.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/base.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/ts3.6/base.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/buffer.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/buffer.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/cluster.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/cluster.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/console.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/constants.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/constants.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dgram.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dgram.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/domain.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/domain.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http2.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http2.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/https.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/https.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/index.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/base.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/inspector.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/inspector.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/module.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/module.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/path.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/path.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/perf_hooks.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/perf_hooks.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/process.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/punycode.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/punycode.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/repl.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/repl.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/string_decoder.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/string_decoder.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers/promises.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/trace_events.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/trace_events.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/ts3.6/base.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert/strict.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/buffer.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/cluster.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/console.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/constants.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dgram.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/domain.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/globals.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/globals.global.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http2.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/https.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/inspector.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/module.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/path.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/perf_hooks.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/punycode.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/repl.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/string_decoder.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/trace_events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/v8.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/wasi.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/worker_threads.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/zlib.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/v8.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/v8.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/wasi.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/wasi.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/worker_threads.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/worker_threads.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/zlib.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/zlib.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts": [
+ "../../node_modules/.pnpm/@types+prop-types@15.7.3/node_modules/@types/prop-types/index.d.ts",
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/global.d.ts",
+ "../../node_modules/.pnpm/@types+scheduler@0.16.1/node_modules/@types/scheduler/tracing.d.ts",
+ "../../node_modules/.pnpm/csstype@3.0.8/node_modules/csstype/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/diffLines.d.ts": [
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupSemantic.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/index.d.ts": [
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupSemantic.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/diffLines.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/printDiffs.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/printDiffs.d.ts": [
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupSemantic.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/preact-router@3.2.1_preact@10.5.13/node_modules/preact-router/index.d.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/jsx.d.ts"
+ ],
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/index.d.ts": [
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/cache.d.ts": [
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/config.d.ts": [
+ "../../node_modules/.pnpm/dequal@2.0.2/node_modules/dequal/lite/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/cache.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts": [
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/config.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr-infinite.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr-infinite.d.ts": [
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr.d.ts": [
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts"
+ ],
+ "./src/context/backend.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/hooks/index.ts"
+ ],
+ "./src/context/config.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/context/fetch.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/context/instance.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/context/listener.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/context/translation.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/custom.d.ts",
+ "./src/hooks/index.ts",
+ "./src/i18n/strings.ts"
+ ],
+ "./src/hooks/async.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/hooks/backend.ts": [
+ "../../node_modules/.pnpm/axios@0.21.1/node_modules/axios/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/context/backend.ts",
+ "./src/declaration.d.ts",
+ "./src/utils/constants.ts"
+ ],
+ "./src/hooks/index.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/utils/types.ts"
+ ],
+ "./src/hooks/instance.ts": [
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/context/backend.ts",
+ "./src/context/instance.ts",
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/hooks/listener.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/hooks/notification.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/utils/types.ts"
+ ],
+ "./src/hooks/notifications.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/utils/types.ts"
+ ],
+ "./src/hooks/order.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/context/backend.ts",
+ "./src/context/instance.ts",
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts",
+ "./src/utils/constants.ts"
+ ],
+ "./src/hooks/product.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/context/backend.ts",
+ "./src/context/instance.ts",
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/hooks/tips.ts": [
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/context/backend.ts",
+ "./src/context/instance.ts",
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/hooks/transfer.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/context/backend.ts",
+ "./src/context/instance.ts",
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts",
+ "./src/utils/constants.ts"
+ ],
+ "./src/i18n/index.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/context/translation.ts"
+ ],
+ "./src/i18n/strings.ts": [
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/index.tsx": [
+ "../../node_modules/.pnpm/preact-router@3.2.1_preact@10.5.13/node_modules/preact-router/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/context/backend.ts",
+ "./src/context/translation.ts"
+ ],
+ "./src/pages/DepletedTip.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/pages/OfferRefund.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/pages/OfferTip.tsx": [
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/pages/RequestPayment.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/pages/ShowOrderDetails.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/utils/amount.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/declaration.d.ts"
+ ],
+ "./src/utils/constants.ts": [
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ],
+ "./src/utils/table.ts": [
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "./src/declaration.d.ts"
+ ],
+ "./src/utils/types.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts"
+ ]
+ },
+ "exportedModulesMap": {
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveStatus.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveTransaction.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveTransaction.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/backupTypes.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/helpers.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/index.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveStatus.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveTransaction.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/backupTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/helpers.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/libtool-version.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/notifications.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/payto.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/taler-error-codes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerconfig.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/taleruri.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/transactionsTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/notifications.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerconfig.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/transactionsTypes.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/backupTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/transactionsTypes.d.ts"
+ ],
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/css.d.ts": [
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/CSSProperties.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/StyledMeta.d.ts"
+ ],
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/index.d.ts": [
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/CSSProperties.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/StyledMeta.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/css.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/cx.d.ts"
+ ],
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/index.d.ts": [
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/index.d.ts",
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/styled.d.ts"
+ ],
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/styled.d.ts": [
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/index.d.ts",
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+cheerio@0.22.28/node_modules/@types/cheerio/index.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+enzyme@3.10.8/node_modules/@types/enzyme/index.d.ts": [
+ "../../node_modules/.pnpm/@types+cheerio@0.22.28/node_modules/@types/cheerio/index.d.ts",
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/LocationUtils.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/PathUtils.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createBrowserHistory.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/DOMUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createHashHistory.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/DOMUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createMemoryHistory.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/DOMUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts": [
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/LocationUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/PathUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createBrowserHistory.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createHashHistory.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createMemoryHistory.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+jest@26.0.23/node_modules/@types/jest/index.d.ts": [
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/index.d.ts",
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert/strict.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/base.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/ts3.6/base.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/buffer.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/buffer.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/cluster.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/cluster.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/console.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/constants.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/constants.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dgram.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dgram.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/domain.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/domain.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http2.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http2.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/https.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/https.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/index.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/base.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/inspector.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/inspector.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/module.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/module.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/path.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/path.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/perf_hooks.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/perf_hooks.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/process.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/punycode.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/punycode.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/repl.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/repl.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/string_decoder.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/string_decoder.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers/promises.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers/promises.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/trace_events.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/trace_events.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/ts3.6/base.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert/strict.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/buffer.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/cluster.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/console.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/constants.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dgram.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/domain.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/globals.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/globals.global.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http2.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/https.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/inspector.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/module.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/path.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/perf_hooks.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/punycode.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/repl.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/string_decoder.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/trace_events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/v8.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/wasi.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/worker_threads.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/zlib.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/v8.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/v8.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/wasi.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/wasi.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/worker_threads.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/worker_threads.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/zlib.d.ts": [
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/zlib.d.ts"
+ ],
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts": [
+ "../../node_modules/.pnpm/@types+prop-types@15.7.3/node_modules/@types/prop-types/index.d.ts",
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/global.d.ts",
+ "../../node_modules/.pnpm/@types+scheduler@0.16.1/node_modules/@types/scheduler/tracing.d.ts",
+ "../../node_modules/.pnpm/csstype@3.0.8/node_modules/csstype/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/diffLines.d.ts": [
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupSemantic.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/index.d.ts": [
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupSemantic.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/diffLines.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/printDiffs.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/printDiffs.d.ts": [
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupSemantic.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/preact-router@3.2.1_preact@10.5.13/node_modules/preact-router/index.d.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/jsx.d.ts"
+ ],
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/index.d.ts": [
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/cache.d.ts": [
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/config.d.ts": [
+ "../../node_modules/.pnpm/dequal@2.0.2/node_modules/dequal/lite/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/cache.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts": [
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/config.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr-infinite.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr-infinite.d.ts": [
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts"
+ ],
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr.d.ts": [
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts"
+ ],
+ "./src/context/backend.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/context/config.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/context/fetch.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts"
+ ],
+ "./src/context/instance.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/context/listener.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/context/translation.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/hooks/backend.ts": [
+ "./src/declaration.d.ts"
+ ],
+ "./src/hooks/index.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts"
+ ],
+ "./src/hooks/instance.ts": [
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/hooks/notification.ts": [
+ "./src/utils/types.ts"
+ ],
+ "./src/hooks/notifications.ts": [
+ "./src/utils/types.ts"
+ ],
+ "./src/hooks/order.ts": [
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/hooks/product.ts": [
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/hooks/tips.ts": [
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/hooks/transfer.ts": [
+ "./src/declaration.d.ts",
+ "./src/hooks/backend.ts"
+ ],
+ "./src/i18n/index.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/index.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/pages/DepletedTip.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/pages/OfferRefund.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/pages/RequestPayment.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/pages/ShowOrderDetails.tsx": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ],
+ "./src/utils/amount.ts": [
+ "./src/declaration.d.ts"
+ ],
+ "./src/utils/table.ts": [
+ "./src/declaration.d.ts"
+ ],
+ "./src/utils/types.ts": [
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts"
+ ]
+ },
+ "semanticDiagnosticsPerFile": [
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveStatus.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/ReserveTransaction.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/amounts.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/backupTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/codec.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/helpers.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/index.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/libtool-version.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/notifications.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/payto.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/taler-error-codes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/talerconfig.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/taleruri.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/time.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/transactionsTypes.d.ts",
+ "../../node_modules/.pnpm/@gnu-taler+taler-util@0.8.3/node_modules/@gnu-taler/taler-util/lib/walletTypes.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/CSSProperties.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/StyledMeta.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/css.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/cx.d.ts",
+ "../../node_modules/.pnpm/@linaria+core@3.0.0-beta.4/node_modules/@linaria/core/types/index.d.ts",
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/index.d.ts",
+ "../../node_modules/.pnpm/@linaria+react@3.0.0-beta.7/node_modules/@linaria/react/types/styled.d.ts",
+ "../../node_modules/.pnpm/@types+cheerio@0.22.28/node_modules/@types/cheerio/index.d.ts",
+ "../../node_modules/.pnpm/@types+enzyme@3.10.8/node_modules/@types/enzyme/index.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/DOMUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/LocationUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/PathUtils.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createBrowserHistory.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createHashHistory.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/createMemoryHistory.d.ts",
+ "../../node_modules/.pnpm/@types+history@4.7.8/node_modules/@types/history/index.d.ts",
+ "../../node_modules/.pnpm/@types+jest@26.0.23/node_modules/@types/jest/index.d.ts",
+ "../../node_modules/.pnpm/@types+mocha@8.2.2/node_modules/@types/mocha/index.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/assert/strict.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/async_hooks.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/base.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/buffer.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/child_process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/cluster.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/console.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/constants.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/crypto.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dgram.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/dns/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/domain.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/fs/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/globals.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/globals.global.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/http2.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/https.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/index.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/inspector.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/module.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/net.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/os.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/path.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/perf_hooks.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/process.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/punycode.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/querystring.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/readline.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/repl.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/stream/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/string_decoder.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/timers/promises.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tls.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/trace_events.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/ts3.6/base.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/tty.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/url.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/util.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/v8.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/vm.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/wasi.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/worker_threads.d.ts",
+ "../../node_modules/.pnpm/@types+node@15.0.1/node_modules/@types/node/zlib.d.ts",
+ "../../node_modules/.pnpm/@types+prop-types@15.7.3/node_modules/@types/prop-types/index.d.ts",
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/global.d.ts",
+ "../../node_modules/.pnpm/@types+react@17.0.4/node_modules/@types/react/index.d.ts",
+ "../../node_modules/.pnpm/@types+scheduler@0.16.1/node_modules/@types/scheduler/tracing.d.ts",
+ "../../node_modules/.pnpm/axios@0.21.1/node_modules/axios/index.d.ts",
+ "../../node_modules/.pnpm/csstype@3.0.8/node_modules/csstype/index.d.ts",
+ "../../node_modules/.pnpm/dequal@2.0.2/node_modules/dequal/lite/index.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupSemantic.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/diffLines.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/index.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/printDiffs.d.ts",
+ "../../node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts",
+ "../../node_modules/.pnpm/preact-router@3.2.1_preact@10.5.13/node_modules/preact-router/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/hooks/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/index.d.ts",
+ "../../node_modules/.pnpm/preact@10.5.13/node_modules/preact/src/jsx.d.ts",
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/index.d.ts",
+ "../../node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/types.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/cache.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/config.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/index.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/types.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr-infinite.d.ts",
+ "../../node_modules/.pnpm/swr@0.5.5/node_modules/swr/dist/use-swr.d.ts",
+ "../../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.dom.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.collection.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.core.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.generator.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.promise.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2016.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.intl.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.object.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.string.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.intl.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.promise.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.es5.d.ts",
+ "../../node_modules/.pnpm/typescript@4.2.4/node_modules/typescript/lib/lib.esnext.intl.d.ts",
+ "./src/context/backend.ts",
+ "./src/context/config.ts",
+ "./src/context/fetch.ts",
+ "./src/context/instance.ts",
+ "./src/context/listener.ts",
+ "./src/context/translation.ts",
+ "./src/custom.d.ts",
+ "./src/declaration.d.ts",
+ "./src/hooks/async.ts",
+ "./src/hooks/backend.ts",
+ "./src/hooks/index.ts",
+ "./src/hooks/instance.ts",
+ "./src/hooks/listener.ts",
+ "./src/hooks/notification.ts",
+ "./src/hooks/notifications.ts",
+ "./src/hooks/order.ts",
+ "./src/hooks/product.ts",
+ "./src/hooks/tips.ts",
+ "./src/hooks/transfer.ts",
+ "./src/i18n/index.tsx",
+ "./src/i18n/strings.ts",
+ "./src/index.tsx",
+ "./src/pages/DepletedTip.tsx",
+ "./src/pages/OfferRefund.tsx",
+ "./src/pages/OfferTip.tsx",
+ "./src/pages/RequestPayment.tsx",
+ "./src/pages/ShowOrderDetails.tsx",
+ "./src/utils/amount.ts",
+ "./src/utils/constants.ts",
+ "./src/utils/table.ts",
+ "./src/utils/types.ts"
+ ]
+ },
+ "version": "4.2.4"
+} \ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 17ca1ec..db80473 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,6 +5,167 @@ importers:
.:
specifiers: {}
+ packages/backend:
+ specifiers:
+ '@babel/core': ^7.13.16
+ '@babel/plugin-transform-react-jsx-source': ^7.12.13
+ '@creativebulma/bulma-tooltip': ^1.2.0
+ '@gnu-taler/pogen': ^0.0.5
+ '@gnu-taler/taler-util': 0.8.3
+ '@linaria/babel-preset': ^3.0.0-beta.4
+ '@linaria/core': ^3.0.0-beta.4
+ '@linaria/react': ^3.0.0-beta.7
+ '@linaria/rollup': ^3.0.0-beta.7
+ '@linaria/shaker': ^3.0.0-beta.7
+ '@linaria/webpack-loader': ^3.0.0-beta.7
+ '@rollup/plugin-alias': ^3.1.5
+ '@rollup/plugin-babel': ^5.3.0
+ '@rollup/plugin-commonjs': ^20.0.0
+ '@rollup/plugin-html': ^0.2.3
+ '@rollup/plugin-image': ^2.1.1
+ '@rollup/plugin-json': ^4.1.0
+ '@rollup/plugin-replace': ^3.0.0
+ '@rollup/plugin-typescript': ^8.2.5
+ '@storybook/addon-a11y': ^6.2.9
+ '@storybook/addon-actions': ^6.2.9
+ '@storybook/addon-essentials': ^6.2.9
+ '@storybook/addon-links': ^6.2.9
+ '@storybook/preact': ^6.2.9
+ '@storybook/preset-scss': ^1.0.3
+ '@testing-library/preact': ^2.0.1
+ '@testing-library/preact-hooks': ^1.1.0
+ '@types/enzyme': ^3.10.8
+ '@types/history': ^4.7.8
+ '@types/jest': ^26.0.23
+ '@types/mocha': ^8.2.2
+ '@typescript-eslint/eslint-plugin': ^4.22.0
+ '@typescript-eslint/parser': ^4.22.0
+ axios: ^0.21.1
+ babel-loader: ^8.2.2
+ base64-inline-loader: ^1.1.1
+ bulma: ^0.9.2
+ bulma-checkbox: ^1.1.1
+ bulma-radio: ^1.1.1
+ bulma-responsive-tables: ^1.2.3
+ bulma-switch-control: ^1.1.1
+ bulma-timeline: ^3.0.4
+ bulma-upload-control: ^1.2.0
+ date-fns: ^2.21.1
+ dotenv: ^8.2.0
+ enzyme: ^3.11.0
+ enzyme-adapter-preact-pure: ^3.1.0
+ eslint: ^7.25.0
+ eslint-config-preact: ^1.1.4
+ eslint-plugin-header: ^3.1.1
+ history: 4.10.1
+ html-webpack-inline-chunk-plugin: ^1.1.1
+ html-webpack-inline-source-plugin: 0.0.10
+ html-webpack-skip-assets-plugin: ^1.0.1
+ inline-chunk-html-plugin: ^1.1.1
+ jed: ^1.1.1
+ jest: ^26.6.3
+ jest-preset-preact: ^4.0.2
+ po2json: ^0.4.5
+ preact: ^10.5.13
+ preact-cli: ^3.0.5
+ preact-render-to-json: ^3.6.6
+ preact-render-to-string: ^5.1.19
+ preact-router: ^3.2.1
+ qrcode-generator: ^1.4.4
+ rimraf: ^3.0.2
+ rollup: ^2.56.3
+ rollup-plugin-bundle-html: ^0.2.2
+ rollup-plugin-css-only: ^3.1.0
+ sass: ^1.32.13
+ sass-loader: 10.1.1
+ script-ext-html-webpack-plugin: ^2.1.5
+ sirv-cli: ^1.0.11
+ swr: ^0.5.5
+ tslib: ^2.3.1
+ typedoc: ^0.20.36
+ typescript: ^4.2.4
+ yup: ^0.32.9
+ dependencies:
+ '@gnu-taler/taler-util': 0.8.3
+ axios: 0.21.1
+ date-fns: 2.21.1
+ history: 4.10.1
+ jed: 1.1.1
+ preact: 10.5.13
+ preact-router: 3.2.1_preact@10.5.13
+ qrcode-generator: 1.4.4
+ swr: 0.5.5
+ yup: 0.32.9
+ devDependencies:
+ '@babel/core': 7.13.16
+ '@babel/plugin-transform-react-jsx-source': 7.12.13_@babel+core@7.13.16
+ '@creativebulma/bulma-tooltip': 1.2.0
+ '@gnu-taler/pogen': 0.0.5
+ '@linaria/babel-preset': 3.0.0-beta.4_@babel+core@7.13.16
+ '@linaria/core': 3.0.0-beta.4
+ '@linaria/react': 3.0.0-beta.7
+ '@linaria/rollup': 3.0.0-beta.7_@babel+core@7.13.16
+ '@linaria/shaker': 3.0.0-beta.7_@babel+core@7.13.16
+ '@linaria/webpack-loader': 3.0.0-beta.7_@babel+core@7.13.16
+ '@rollup/plugin-alias': 3.1.5_rollup@2.56.3
+ '@rollup/plugin-babel': 5.3.0_8de00bbc60363a799c112a94aa42ce04
+ '@rollup/plugin-commonjs': 20.0.0_rollup@2.56.3
+ '@rollup/plugin-html': 0.2.3_rollup@2.56.3
+ '@rollup/plugin-image': 2.1.1_rollup@2.56.3
+ '@rollup/plugin-json': 4.1.0_rollup@2.56.3
+ '@rollup/plugin-replace': 3.0.0_rollup@2.56.3
+ '@rollup/plugin-typescript': 8.2.5_52bfe26783e4623e07fb410e57a77991
+ '@storybook/addon-a11y': 6.2.9
+ '@storybook/addon-actions': 6.2.9
+ '@storybook/addon-essentials': 6.2.9_472ba1443a3a7dfb9d5f96aaff5418de
+ '@storybook/addon-links': 6.2.9
+ '@storybook/preact': 6.2.9_882cc89bf78b48705bbb2db542e898fd
+ '@storybook/preset-scss': 1.0.3_sass-loader@10.1.1
+ '@testing-library/preact': 2.0.1_preact@10.5.13
+ '@testing-library/preact-hooks': 1.1.0_8a3b8354086a0a31d950b2aa8b26d524
+ '@types/enzyme': 3.10.8
+ '@types/history': 4.7.8
+ '@types/jest': 26.0.23
+ '@types/mocha': 8.2.2
+ '@typescript-eslint/eslint-plugin': 4.22.0_e3b52a83531895e7febd6ecd5ba813eb
+ '@typescript-eslint/parser': 4.22.0_eslint@7.25.0+typescript@4.2.4
+ babel-loader: 8.2.2_@babel+core@7.13.16
+ base64-inline-loader: 1.1.1
+ bulma: 0.9.2
+ bulma-checkbox: 1.1.1
+ bulma-radio: 1.1.1
+ bulma-responsive-tables: 1.2.3
+ bulma-switch-control: 1.1.1
+ bulma-timeline: 3.0.4
+ bulma-upload-control: 1.2.0
+ dotenv: 8.2.0
+ enzyme: 3.11.0
+ enzyme-adapter-preact-pure: 3.1.0_enzyme@3.11.0+preact@10.5.13
+ eslint: 7.25.0
+ eslint-config-preact: 1.1.4_eslint@7.25.0+typescript@4.2.4
+ eslint-plugin-header: 3.1.1_eslint@7.25.0
+ html-webpack-inline-chunk-plugin: 1.1.1
+ html-webpack-inline-source-plugin: 0.0.10
+ html-webpack-skip-assets-plugin: 1.0.1
+ inline-chunk-html-plugin: 1.1.1
+ jest: 26.6.3
+ jest-preset-preact: 4.0.2_669f037bdb6c36f0a67e918c516dafdd
+ po2json: 0.4.5
+ preact-cli: 3.0.5_c069246dc1d99535ac277c76f8ef56e0
+ preact-render-to-json: 3.6.6_preact@10.5.13
+ preact-render-to-string: 5.1.19_preact@10.5.13
+ rimraf: 3.0.2
+ rollup: 2.56.3
+ rollup-plugin-bundle-html: 0.2.2
+ rollup-plugin-css-only: 3.1.0_rollup@2.56.3
+ sass: 1.32.13
+ sass-loader: 10.1.1_sass@1.32.13
+ script-ext-html-webpack-plugin: 2.1.5
+ sirv-cli: 1.0.11
+ tslib: 2.3.1
+ typedoc: 0.20.36_typescript@4.2.4
+ typescript: 4.2.4
+
packages/frontend:
specifiers:
'@babel/core': ^7.13.16
@@ -219,7 +380,7 @@ packages:
resolution: {integrity: sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==}
dependencies:
'@babel/helper-explode-assignable-expression': 7.13.0
- '@babel/types': 7.13.17
+ '@babel/types': 7.15.0
dev: true
/@babel/helper-compilation-targets/7.13.16_@babel+core@7.13.16:
@@ -277,15 +438,15 @@ packages:
- supports-color
dev: true
- /@babel/helper-define-polyfill-provider/0.2.0_@babel+core@7.13.16:
- resolution: {integrity: sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==}
+ /@babel/helper-define-polyfill-provider/0.2.3_@babel+core@7.13.16:
+ resolution: {integrity: sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==}
peerDependencies:
'@babel/core': ^7.4.0-0
dependencies:
'@babel/core': 7.13.16
'@babel/helper-compilation-targets': 7.13.16_@babel+core@7.13.16
- '@babel/helper-module-imports': 7.13.12
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-module-imports': 7.14.5
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/traverse': 7.13.17
debug: 4.3.1
lodash.debounce: 4.0.8
@@ -298,7 +459,7 @@ packages:
/@babel/helper-explode-assignable-expression/7.13.0:
resolution: {integrity: sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==}
dependencies:
- '@babel/types': 7.13.17
+ '@babel/types': 7.15.0
dev: true
/@babel/helper-function-name/7.12.13:
@@ -319,7 +480,7 @@ packages:
resolution: {integrity: sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==}
dependencies:
'@babel/traverse': 7.13.17
- '@babel/types': 7.13.17
+ '@babel/types': 7.15.0
transitivePeerDependencies:
- supports-color
dev: true
@@ -336,6 +497,13 @@ packages:
'@babel/types': 7.13.17
dev: true
+ /@babel/helper-module-imports/7.14.5:
+ resolution: {integrity: sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.15.0
+ dev: true
+
/@babel/helper-module-transforms/7.13.14:
resolution: {integrity: sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==}
dependencies:
@@ -365,12 +533,17 @@ packages:
resolution: {integrity: sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==}
dev: true
+ /@babel/helper-plugin-utils/7.14.5:
+ resolution: {integrity: sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
/@babel/helper-remap-async-to-generator/7.13.0:
resolution: {integrity: sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==}
dependencies:
'@babel/helper-annotate-as-pure': 7.12.13
'@babel/helper-wrap-function': 7.13.0
- '@babel/types': 7.13.17
+ '@babel/types': 7.15.0
transitivePeerDependencies:
- supports-color
dev: true
@@ -408,6 +581,11 @@ packages:
resolution: {integrity: sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==}
dev: true
+ /@babel/helper-validator-identifier/7.14.9:
+ resolution: {integrity: sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
/@babel/helper-validator-option/7.12.17:
resolution: {integrity: sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==}
dev: true
@@ -418,7 +596,7 @@ packages:
'@babel/helper-function-name': 7.12.13
'@babel/template': 7.12.13
'@babel/traverse': 7.13.17
- '@babel/types': 7.13.17
+ '@babel/types': 7.15.0
transitivePeerDependencies:
- supports-color
dev: true
@@ -453,7 +631,7 @@ packages:
'@babel/core': ^7.13.0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/helper-skip-transparent-expression-wrappers': 7.12.1
'@babel/plugin-proposal-optional-chaining': 7.13.12_@babel+core@7.13.16
dev: true
@@ -464,7 +642,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/helper-remap-async-to-generator': 7.13.0
'@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.13.16
transitivePeerDependencies:
@@ -502,7 +680,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.13.16
dev: true
@@ -522,7 +700,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.13.16
dev: true
@@ -532,7 +710,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.13.16
dev: true
@@ -542,7 +720,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.13.16
dev: true
@@ -562,7 +740,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.13.16
dev: true
@@ -596,7 +774,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.13.16
dev: true
@@ -631,7 +809,7 @@ packages:
dependencies:
'@babel/core': 7.13.16
'@babel/helper-create-regexp-features-plugin': 7.12.17_@babel+core@7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.13.16:
@@ -676,7 +854,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-syntax-export-default-from/7.12.13_@babel+core@7.13.16:
@@ -694,7 +872,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.13.16:
@@ -829,8 +1007,8 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-module-imports': 7.13.12
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-module-imports': 7.14.5
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/helper-remap-async-to-generator': 7.13.0
transitivePeerDependencies:
- supports-color
@@ -842,7 +1020,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-block-scoping/7.13.16_@babel+core@7.13.16:
@@ -877,7 +1055,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-destructuring/7.13.17_@babel+core@7.13.16:
@@ -896,7 +1074,7 @@ packages:
dependencies:
'@babel/core': 7.13.16
'@babel/helper-create-regexp-features-plugin': 7.12.17_@babel+core@7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-duplicate-keys/7.12.13_@babel+core@7.13.16:
@@ -905,7 +1083,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-exponentiation-operator/7.12.13_@babel+core@7.13.16:
@@ -915,7 +1093,7 @@ packages:
dependencies:
'@babel/core': 7.13.16
'@babel/helper-builder-binary-assignment-operator-visitor': 7.12.13
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-for-of/7.13.0_@babel+core@7.13.16:
@@ -934,7 +1112,7 @@ packages:
dependencies:
'@babel/core': 7.13.16
'@babel/helper-function-name': 7.12.13
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-literals/7.12.13_@babel+core@7.13.16:
@@ -943,7 +1121,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-member-expression-literals/7.12.13_@babel+core@7.13.16:
@@ -952,7 +1130,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-modules-amd/7.13.0_@babel+core@7.13.16:
@@ -962,7 +1140,7 @@ packages:
dependencies:
'@babel/core': 7.13.16
'@babel/helper-module-transforms': 7.13.14
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
babel-plugin-dynamic-import-node: 2.3.3
transitivePeerDependencies:
- supports-color
@@ -975,7 +1153,7 @@ packages:
dependencies:
'@babel/core': 7.13.16
'@babel/helper-module-transforms': 7.13.14
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/helper-simple-access': 7.13.12
babel-plugin-dynamic-import-node: 2.3.3
transitivePeerDependencies:
@@ -990,7 +1168,7 @@ packages:
'@babel/core': 7.13.16
'@babel/helper-hoist-variables': 7.13.16
'@babel/helper-module-transforms': 7.13.14
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/helper-validator-identifier': 7.12.11
babel-plugin-dynamic-import-node: 2.3.3
transitivePeerDependencies:
@@ -1004,7 +1182,7 @@ packages:
dependencies:
'@babel/core': 7.13.16
'@babel/helper-module-transforms': 7.13.14
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
transitivePeerDependencies:
- supports-color
dev: true
@@ -1024,7 +1202,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-object-assign/7.12.13_@babel+core@7.13.16:
@@ -1042,7 +1220,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/helper-replace-supers': 7.13.12
transitivePeerDependencies:
- supports-color
@@ -1072,7 +1250,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-react-display-name/7.12.13_@babel+core@7.13.16:
@@ -1140,7 +1318,24 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
+ dev: true
+
+ /@babel/plugin-transform-runtime/7.15.0_@babel+core@7.13.16:
+ resolution: {integrity: sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.13.16
+ '@babel/helper-module-imports': 7.14.5
+ '@babel/helper-plugin-utils': 7.14.5
+ babel-plugin-polyfill-corejs2: 0.2.2_@babel+core@7.13.16
+ babel-plugin-polyfill-corejs3: 0.2.4_@babel+core@7.13.16
+ babel-plugin-polyfill-regenerator: 0.2.2_@babel+core@7.13.16
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
dev: true
/@babel/plugin-transform-shorthand-properties/7.12.13_@babel+core@7.13.16:
@@ -1168,7 +1363,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-template-literals/7.13.0_@babel+core@7.13.16:
@@ -1186,7 +1381,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-typescript/7.13.0_@babel+core@7.13.16:
@@ -1208,7 +1403,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/plugin-transform-unicode-regex/7.12.13_@babel+core@7.13.16:
@@ -1218,7 +1413,7 @@ packages:
dependencies:
'@babel/core': 7.13.16
'@babel/helper-create-regexp-features-plugin': 7.12.17_@babel+core@7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
dev: true
/@babel/preset-env/7.13.15_@babel+core@7.13.16:
@@ -1306,10 +1501,10 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-plugin-utils': 7.13.0
+ '@babel/helper-plugin-utils': 7.14.5
'@babel/plugin-proposal-unicode-property-regex': 7.12.13_@babel+core@7.13.16
'@babel/plugin-transform-dotall-regex': 7.12.13_@babel+core@7.13.16
- '@babel/types': 7.13.17
+ '@babel/types': 7.15.0
esutils: 2.0.3
dev: true
@@ -1395,6 +1590,14 @@ packages:
to-fast-properties: 2.0.0
dev: true
+ /@babel/types/7.15.0:
+ resolution: {integrity: sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.14.9
+ to-fast-properties: 2.0.0
+ dev: true
+
/@base2/pretty-print-object/1.0.0:
resolution: {integrity: sha512-4Th98KlMHr5+JkxfcoDT//6vY8vM+iSPrLNpHhRyLx2CFYi8e2RfqPLdpbnpo0Q5lQC5hNB79yes07zb02fvCw==}
dev: true
@@ -1818,6 +2021,152 @@ packages:
chalk: 4.1.1
dev: true
+ /@linaria/babel-preset/3.0.0-beta.4_@babel+core@7.13.16:
+ resolution: {integrity: sha512-Bjsk4VZUQXK3u04MuLlyP/+/tDd7bWeLXYCOnq4US9H2QFRdka97fm6hH34SRinoHm9fSPCHrj9d+KtY8ge2wg==}
+ peerDependencies:
+ '@babel/core': '>=7'
+ dependencies:
+ '@babel/core': 7.13.16
+ '@babel/generator': 7.13.16
+ '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.13.16
+ '@babel/template': 7.12.13
+ '@linaria/core': 3.0.0-beta.4
+ '@linaria/logger': 3.0.0-beta.3
+ cosmiconfig: 5.2.1
+ source-map: 0.6.1
+ stylis: 3.5.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@linaria/babel-preset/3.0.0-beta.7_@babel+core@7.13.16:
+ resolution: {integrity: sha512-NE5f//T9ywXZA+W+Pw1YjWKdzskUpaV7GVkxXhkxLM2la1+S4xOoZR1rzW77bR1C9GFFwzZTeb8XP85whb2ZqQ==}
+ peerDependencies:
+ '@babel/core': '>=7'
+ dependencies:
+ '@babel/core': 7.13.16
+ '@babel/generator': 7.13.16
+ '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.13.16
+ '@babel/template': 7.12.13
+ '@linaria/core': 3.0.0-beta.4
+ '@linaria/logger': 3.0.0-beta.3
+ cosmiconfig: 5.2.1
+ source-map: 0.7.3
+ stylis: 3.5.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@linaria/core/3.0.0-beta.4:
+ resolution: {integrity: sha512-NzxeMDxRt57nR6tLFZ8xIstp5ld9JQPIyp9+TKtQZhoX3oJuUru+S4vXPr1Gach6VaqKKKT5T6fmJgJl9MMprw==}
+ dev: true
+
+ /@linaria/logger/3.0.0-beta.3:
+ resolution: {integrity: sha512-Z2k0RJuA4PffcZcwBN1By8FmcCvcFUe9GHc846B6hNP09zDVhHSFLKJN9NfXJCzJ/9PifOxSUKyOjLtpv3EhGA==}
+ dependencies:
+ debug: 4.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@linaria/preeval/3.0.0-beta.7_@babel+core@7.13.16:
+ resolution: {integrity: sha512-fTFgxtjBGKh9P2rsqhBnHTqFo1d8VzznmXKpILM0ClAclVn+FB+KJl+nWyEbQ8nT9/ceRoTwbdZHZ/M3DFHG+w==}
+ peerDependencies:
+ '@babel/core': '>=7'
+ dependencies:
+ '@babel/core': 7.13.16
+ '@linaria/babel-preset': 3.0.0-beta.7_@babel+core@7.13.16
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@linaria/react/3.0.0-beta.7:
+ resolution: {integrity: sha512-sAup35gSRuenwbziPhp1hmkfziY72BS9jr5Lp0GQ9NRG5fnxYBQ36TY4rrGE09mSBjw/uq2i7XsvYL8MNm1f1Q==}
+ peerDependencies:
+ react: '>=16'
+ dependencies:
+ '@emotion/is-prop-valid': 0.8.8
+ '@linaria/core': 3.0.0-beta.4
+ dev: true
+
+ /@linaria/rollup/3.0.0-beta.7_@babel+core@7.13.16:
+ resolution: {integrity: sha512-5bghkIaITLjotLd0c76VQSHcsETYjTSav9a6LNu5EarCi6oZ9prW8n6BaCKBDbG6njLGfSNhdLXrANx9AQOjyw==}
+ peerDependencies:
+ '@babel/core': '>=7'
+ dependencies:
+ '@babel/core': 7.13.16
+ '@linaria/babel-preset': 3.0.0-beta.7_@babel+core@7.13.16
+ '@rollup/pluginutils': 4.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@linaria/shaker/3.0.0-beta.7_@babel+core@7.13.16:
+ resolution: {integrity: sha512-fWDbbKcS8EiAnoNhTQa+2Or7QyR3Ofyqjtcrb1aeLN2ecVI2u7B5jAZgVPg9euTnhQ2ieUU3G9hh1INkoGKS/A==}
+ peerDependencies:
+ '@babel/core': '>=7'
+ dependencies:
+ '@babel/core': 7.13.16
+ '@babel/generator': 7.13.16
+ '@babel/plugin-transform-runtime': 7.15.0_@babel+core@7.13.16
+ '@babel/plugin-transform-template-literals': 7.13.0_@babel+core@7.13.16
+ '@babel/preset-env': 7.13.15_@babel+core@7.13.16
+ '@linaria/babel-preset': 3.0.0-beta.7_@babel+core@7.13.16
+ '@linaria/logger': 3.0.0-beta.3
+ '@linaria/preeval': 3.0.0-beta.7_@babel+core@7.13.16
+ babel-plugin-transform-react-remove-prop-types: 0.4.24
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@linaria/webpack-loader/3.0.0-beta.7_@babel+core@7.13.16:
+ resolution: {integrity: sha512-tYR+PVAqUEPsOUGeD1jOvpaX3UeBQIvh6JmX5ziYr0faBwOwabmjszCYrQ2FVonpHBsjs6zB1KtG+yUTgSygGA==}
+ dependencies:
+ '@linaria/webpack4-loader': 3.0.0-beta.7_@babel+core@7.13.16
+ '@linaria/webpack5-loader': 3.0.0-beta.7_@babel+core@7.13.16
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
+ - webpack
+ dev: true
+
+ /@linaria/webpack4-loader/3.0.0-beta.7_@babel+core@7.13.16:
+ resolution: {integrity: sha512-B2c5vr9b8igcILM/ZcxE9Vu0J2w7NS9xERTvGD7Kp4TdLnFRpALMTJgYqlk3Gxq4T7RlAEi1vu8kHx65mXqA6g==}
+ peerDependencies:
+ '@babel/core': '>=7'
+ dependencies:
+ '@babel/core': 7.13.16
+ '@linaria/babel-preset': 3.0.0-beta.7_@babel+core@7.13.16
+ '@linaria/logger': 3.0.0-beta.3
+ cosmiconfig: 5.2.1
+ enhanced-resolve: 4.5.0
+ find-yarn-workspace-root: 1.2.1
+ loader-utils: 1.4.0
+ mkdirp: 0.5.5
+ normalize-path: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@linaria/webpack5-loader/3.0.0-beta.7_@babel+core@7.13.16:
+ resolution: {integrity: sha512-s2C44ml1fjDFjEJS1PFXjgCklOd3KWiG4Z3l+nUuCidncn9abnv18rDkiukUcKGwwAGJ3NhgfhU9SwXPIYFfMw==}
+ peerDependencies:
+ '@babel/core': '>=7'
+ webpack: '>=5'
+ dependencies:
+ '@babel/core': 7.13.16
+ '@linaria/babel-preset': 3.0.0-beta.7_@babel+core@7.13.16
+ '@linaria/logger': 3.0.0-beta.3
+ cosmiconfig: 5.2.1
+ enhanced-resolve: 5.8.2
+ find-yarn-workspace-root: 1.2.1
+ loader-utils: 2.0.0
+ mkdirp: 0.5.5
+ normalize-path: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@mdn/browser-compat-data/2.0.7:
resolution: {integrity: sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw==}
engines: {node: '>=10.0.0'}
@@ -1983,6 +2332,78 @@ packages:
react-lifecycles-compat: 3.0.4
dev: true
+ /@rollup/plugin-alias/3.1.5_rollup@2.56.3:
+ resolution: {integrity: sha512-yzUaSvCC/LJPbl9rnzX3HN7vy0tq7EzHoEiQl1ofh4n5r2Rd5bj/+zcJgaGA76xbw95/JjWQyvHg9rOJp2y0oQ==}
+ engines: {node: '>=8.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0
+ dependencies:
+ rollup: 2.56.3
+ slash: 3.0.0
+ dev: true
+
+ /@rollup/plugin-babel/5.3.0_8de00bbc60363a799c112a94aa42ce04:
+ resolution: {integrity: sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==}
+ engines: {node: '>= 10.0.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ '@types/babel__core': ^7.1.9
+ rollup: ^1.20.0||^2.0.0
+ peerDependenciesMeta:
+ '@types/babel__core':
+ optional: true
+ dependencies:
+ '@babel/core': 7.13.16
+ '@babel/helper-module-imports': 7.14.5
+ '@rollup/pluginutils': 3.1.0_rollup@2.56.3
+ rollup: 2.56.3
+ dev: true
+
+ /@rollup/plugin-commonjs/20.0.0_rollup@2.56.3:
+ resolution: {integrity: sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ rollup: ^2.38.3
+ dependencies:
+ '@rollup/pluginutils': 3.1.0_rollup@2.56.3
+ commondir: 1.0.1
+ estree-walker: 2.0.2
+ glob: 7.1.6
+ is-reference: 1.2.1
+ magic-string: 0.25.7
+ resolve: 1.20.0
+ rollup: 2.56.3
+ dev: true
+
+ /@rollup/plugin-html/0.2.3_rollup@2.56.3:
+ resolution: {integrity: sha512-efx8Ud1FWaHmj3Es5parp6uRt1DPyKq9A8t1GEZoNsYB4UTQQIL8PsjxcJOlH+P3QKRsSv1rIJhiMvuG4+kfwg==}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0
+ dependencies:
+ rollup: 2.56.3
+ dev: true
+
+ /@rollup/plugin-image/2.1.1_rollup@2.56.3:
+ resolution: {integrity: sha512-AgP4U85zuQJdUopLUCM+hTf45RepgXeTb8EJsleExVy99dIoYpt3ZlDYJdKmAc2KLkNntCDg6BPJvgJU3uGF+g==}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0 || ^2.0.0
+ dependencies:
+ '@rollup/pluginutils': 3.1.0_rollup@2.56.3
+ mini-svg-data-uri: 1.3.3
+ rollup: 2.56.3
+ dev: true
+
+ /@rollup/plugin-json/4.1.0_rollup@2.56.3:
+ resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==}
+ peerDependencies:
+ rollup: ^1.20.0 || ^2.0.0
+ dependencies:
+ '@rollup/pluginutils': 3.1.0_rollup@2.56.3
+ rollup: 2.56.3
+ dev: true
+
/@rollup/plugin-node-resolve/7.1.3_rollup@1.32.1:
resolution: {integrity: sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==}
engines: {node: '>= 8.0.0'}
@@ -2007,6 +2428,31 @@ packages:
rollup: 1.32.1
dev: true
+ /@rollup/plugin-replace/3.0.0_rollup@2.56.3:
+ resolution: {integrity: sha512-3c7JCbMuYXM4PbPWT4+m/4Y6U60SgsnDT/cCyAyUKwFHg7pTSfsSQzIpETha3a3ig6OdOKzZz87D9ZXIK3qsDg==}
+ peerDependencies:
+ rollup: ^1.20.0 || ^2.0.0
+ dependencies:
+ '@rollup/pluginutils': 3.1.0_rollup@2.56.3
+ magic-string: 0.25.7
+ rollup: 2.56.3
+ dev: true
+
+ /@rollup/plugin-typescript/8.2.5_52bfe26783e4623e07fb410e57a77991:
+ resolution: {integrity: sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ==}
+ engines: {node: '>=8.0.0'}
+ peerDependencies:
+ rollup: ^2.14.0
+ tslib: '*'
+ typescript: '>=3.7.0'
+ dependencies:
+ '@rollup/pluginutils': 3.1.0_rollup@2.56.3
+ resolve: 1.20.0
+ rollup: 2.56.3
+ tslib: 2.3.1
+ typescript: 4.2.4
+ dev: true
+
/@rollup/pluginutils/3.1.0_rollup@1.32.1:
resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
engines: {node: '>= 8.0.0'}
@@ -2019,6 +2465,26 @@ packages:
rollup: 1.32.1
dev: true
+ /@rollup/pluginutils/3.1.0_rollup@2.56.3:
+ resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0
+ dependencies:
+ '@types/estree': 0.0.39
+ estree-walker: 1.0.1
+ picomatch: 2.2.3
+ rollup: 2.56.3
+ dev: true
+
+ /@rollup/pluginutils/4.1.1:
+ resolution: {integrity: sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==}
+ engines: {node: '>= 8.0.0'}
+ dependencies:
+ estree-walker: 2.0.2
+ picomatch: 2.2.3
+ dev: true
+
/@sindresorhus/is/0.14.0:
resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
engines: {node: '>=6'}
@@ -4756,7 +5222,20 @@ packages:
dependencies:
'@babel/compat-data': 7.13.15
'@babel/core': 7.13.16
- '@babel/helper-define-polyfill-provider': 0.2.0_@babel+core@7.13.16
+ '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.13.16
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-polyfill-corejs2/0.2.2_@babel+core@7.13.16:
+ resolution: {integrity: sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.13.15
+ '@babel/core': 7.13.16
+ '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.13.16
semver: 6.3.0
transitivePeerDependencies:
- supports-color
@@ -4780,8 +5259,20 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-define-polyfill-provider': 0.2.0_@babel+core@7.13.16
- core-js-compat: 3.11.1
+ '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.13.16
+ core-js-compat: 3.16.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-polyfill-corejs3/0.2.4_@babel+core@7.13.16:
+ resolution: {integrity: sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.13.16
+ '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.13.16
+ core-js-compat: 3.16.3
transitivePeerDependencies:
- supports-color
dev: true
@@ -4792,7 +5283,18 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.13.16
- '@babel/helper-define-polyfill-provider': 0.2.0_@babel+core@7.13.16
+ '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.13.16
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-polyfill-regenerator/0.2.2_@babel+core@7.13.16:
+ resolution: {integrity: sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.13.16
+ '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.13.16
transitivePeerDependencies:
- supports-color
dev: true
@@ -5124,6 +5626,18 @@ packages:
node-releases: 1.1.71
dev: true
+ /browserslist/4.16.8:
+ resolution: {integrity: sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001252
+ colorette: 1.3.0
+ electron-to-chromium: 1.3.818
+ escalade: 3.1.1
+ node-releases: 1.1.75
+ dev: true
+
/bser/2.1.1:
resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
dependencies:
@@ -5359,6 +5873,10 @@ packages:
resolution: {integrity: sha512-c0yixVG4v9KBc/tQ2rlbB3A/bgBFRvl8h8M4IeUbqCca4gsiCfvtaheUssbnux/Mb66Vjz7x8yYjDgYcNQOhyQ==}
dev: true
+ /caniuse-lite/1.0.30001252:
+ resolution: {integrity: sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==}
+ dev: true
+
/capture-exit/2.0.0:
resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -5704,6 +6222,10 @@ packages:
resolution: {integrity: sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==}
dev: true
+ /colorette/1.3.0:
+ resolution: {integrity: sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==}
+ dev: true
+
/colors/1.4.0:
resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
engines: {node: '>=0.1.90'}
@@ -5918,6 +6440,13 @@ packages:
semver: 7.0.0
dev: true
+ /core-js-compat/3.16.3:
+ resolution: {integrity: sha512-A/OtSfSJQKLAFRVd4V0m6Sep9lPdjD8bpN8v3tCCGwE0Tmh0hOiVDm9tw6mXmWOKOSZIyr3EkywPo84cJjGvIQ==}
+ dependencies:
+ browserslist: 4.16.8
+ semver: 7.0.0
+ dev: true
+
/core-js-pure/3.11.1:
resolution: {integrity: sha512-2JukQi8HgAOCD5CSimxWWXVrUBoA9Br796uIA5Z06bIjt7PBBI19ircFaAxplgE1mJf3x2BY6MkT/HWA/UryPg==}
requiresBuild: true
@@ -6833,6 +7362,10 @@ packages:
resolution: {integrity: sha512-L+WXyXI7c7+G1V8ANzRsPI5giiimLAUDC6Zs1ojHHPhYXb3k/iTABFmWjivEtsWrRQymjnO66/rO2ZTABGdmWg==}
dev: true
+ /electron-to-chromium/1.3.818:
+ resolution: {integrity: sha512-c/Z9gIr+jDZAR9q+mn40hEc1NharBT+8ejkarjbCDnBNFviI6hvcC5j2ezkAXru//bTnQp5n6iPi0JA83Tla1Q==}
+ dev: true
+
/element-resize-detector/1.2.2:
resolution: {integrity: sha512-+LOXRkCJc4I5WhEJxIDjhmE3raF8jtOMBDqSCgZTMz2TX3oXAX5pE2+MDeopJlGdXzP7KzPbBJaUGfNaP9HG4A==}
dependencies:
@@ -6929,6 +7462,14 @@ packages:
tapable: 1.1.3
dev: true
+ /enhanced-resolve/5.8.2:
+ resolution: {integrity: sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ graceful-fs: 4.2.6
+ tapable: 2.2.0
+ dev: true
+
/enquirer/2.3.6:
resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
engines: {node: '>=8.6'}
@@ -7330,6 +7871,10 @@ packages:
resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
dev: true
+ /estree-walker/2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ dev: true
+
/esutils/2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
@@ -7697,6 +8242,13 @@ packages:
path-exists: 4.0.0
dev: true
+ /find-yarn-workspace-root/1.2.1:
+ resolution: {integrity: sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==}
+ dependencies:
+ fs-extra: 4.0.3
+ micromatch: 3.1.10
+ dev: true
+
/flat-cache/3.0.4:
resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -7840,6 +8392,14 @@ packages:
rimraf: 2.7.1
dev: true
+ /fs-extra/4.0.3:
+ resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==}
+ dependencies:
+ graceful-fs: 4.2.6
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+ dev: true
+
/fs-extra/8.1.0:
resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
engines: {node: '>=6 <7 || >=8'}
@@ -8374,6 +8934,13 @@ packages:
minimalistic-assert: 1.0.1
dev: true
+ /hasha/4.0.1:
+ resolution: {integrity: sha512-+wnvroCn3pq0CAKWfItGPyl0DJOob2qs/2D/Rh0a/O90LBzmo5GaKHwIRb6FInVvmEl1mCIHL5RqlfTLvh6FoQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-stream: 1.1.0
+ dev: true
+
/hast-to-hyperscript/9.0.1:
resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==}
dependencies:
@@ -9298,6 +9865,12 @@ packages:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
dev: true
+ /is-reference/1.2.1:
+ resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
+ dependencies:
+ '@types/estree': 0.0.47
+ dev: true
+
/is-regex/1.1.2:
resolution: {integrity: sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==}
engines: {node: '>= 0.4'}
@@ -10746,6 +11319,11 @@ packages:
webpack-sources: 1.4.3
dev: true
+ /mini-svg-data-uri/1.3.3:
+ resolution: {integrity: sha512-+fA2oRcR1dJI/7ITmeQJDrYWks0wodlOz0pAEhKYJ2IVc1z0AnwJUsKY2fzFmPAM3Jo9J0rBx8JAA9QQSJ5PuA==}
+ hasBin: true
+ dev: true
+
/minimalistic-assert/1.0.1:
resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
dev: true
@@ -11041,6 +11619,10 @@ packages:
resolution: {integrity: sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==}
dev: true
+ /node-releases/1.1.75:
+ resolution: {integrity: sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==}
+ dev: true
+
/nodent-compiler/3.2.13:
resolution: {integrity: sha512-nzzWPXZwSdsWie34om+4dLrT/5l1nT/+ig1v06xuSgMtieJVAnMQFuZihUwREM+M7dFso9YoHfDmweexEXXrrw==}
dependencies:
@@ -13333,6 +13915,23 @@ packages:
rollup-pluginutils: 2.8.2
dev: true
+ /rollup-plugin-bundle-html/0.2.2:
+ resolution: {integrity: sha512-nK4Z/k3MVjfCcnC5T15ksHw3JyRJx110oduy3VBW0ki2qI0tu4pLlgXyltBgtd+gpiFCPqEnfy89XRPG+eCOwA==}
+ dependencies:
+ cheerio: 1.0.0-rc.6
+ hasha: 4.0.1
+ dev: true
+
+ /rollup-plugin-css-only/3.1.0_rollup@2.56.3:
+ resolution: {integrity: sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA==}
+ engines: {node: '>=10.12.0'}
+ peerDependencies:
+ rollup: 1 || 2
+ dependencies:
+ '@rollup/pluginutils': 4.1.1
+ rollup: 2.56.3
+ dev: true
+
/rollup-plugin-terser/5.3.1_rollup@1.32.1:
resolution: {integrity: sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==}
peerDependencies:
@@ -13361,6 +13960,14 @@ packages:
acorn: 7.4.1
dev: true
+ /rollup/2.56.3:
+ resolution: {integrity: sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
/rst-selector-parser/2.2.3:
resolution: {integrity: sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=}
dependencies:
@@ -14303,6 +14910,10 @@ packages:
postcss-selector-parser: 3.1.2
dev: true
+ /stylis/3.5.4:
+ resolution: {integrity: sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==}
+ dev: true
+
/supports-color/5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'}
@@ -14392,6 +15003,11 @@ packages:
engines: {node: '>=6'}
dev: true
+ /tapable/2.2.0:
+ resolution: {integrity: sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==}
+ engines: {node: '>=6'}
+ dev: true
+
/tar/4.4.13:
resolution: {integrity: sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==}
engines: {node: '>=4.5'}
@@ -14711,6 +15327,10 @@ packages:
/tslib/2.2.0:
resolution: {integrity: sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==}
+ /tslib/2.3.1:
+ resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==}
+ dev: true
+
/tsutils/3.21.0_typescript@4.2.4:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}