aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2022-09-06 09:20:25 -0700
committerAdam Soltys <[email protected]>2022-09-06 09:20:25 -0700
commitc2464b2407ee23134732fd67586758dbfe18f9b5 (patch)
tree3e2d9f009bb325a9a7c4304ea02f6e64dda85bd1
parent8a080ef9a198799e7ee31cf81f92afd5495e4074 (diff)
downloadcoinos-server-c2464b2407ee23134732fd67586758dbfe18f9b5.tar.gz
coinos-server-c2464b2407ee23134732fd67586758dbfe18f9b5.zip
prettier
-rw-r--r--db/db.js26
-rw-r--r--db/index.js66
-rw-r--r--lib/account.js18
-rw-r--r--lib/buildliquidtx.js8
-rw-r--r--lib/buildtx.js36
-rw-r--r--lib/liquid.js1
-rw-r--r--lib/ln.js2
-rw-r--r--lib/lnd.js2
-rw-r--r--lib/logo.js1
-rw-r--r--lib/mail.js7
-rw-r--r--lib/notifications.js9
-rw-r--r--lib/passport.js2
-rw-r--r--lib/persist.js4
-rw-r--r--lib/read.js4
-rw-r--r--lib/register.js12
-rw-r--r--lib/sockets.js6
-rw-r--r--lib/utils.js16
-rw-r--r--lib/webhooks.js2
-rw-r--r--lib/whitelist.js2
-rw-r--r--lib/wretch.js2
-rw-r--r--routes/admin.js550
-rw-r--r--routes/assets.js699
-rw-r--r--routes/funding.js168
-rw-r--r--routes/info.js24
-rw-r--r--routes/lnurl.js4
-rw-r--r--routes/payments.js2
-rw-r--r--routes/referrals.js270
-rw-r--r--routes/swaps.js417
-rw-r--r--routes/users.js5
-rw-r--r--sampleconfig/index.js18
-rw-r--r--sampleconfig/knexfile.js16
-rw-r--r--scripts/apiParse.js48
-rw-r--r--scripts/check.js22
33 files changed, 1221 insertions, 1248 deletions
diff --git a/db/db.js b/db/db.js
index 2d73723f..06fdac89 100644
--- a/db/db.js
+++ b/db/db.js
@@ -1,17 +1,13 @@
-import Sequelize from '@sequelize/core';
-import dbOptions from '../config/knexfile';
+import Sequelize from "@sequelize/core";
+import dbOptions from "../config/knexfile";
-let { database, user, password, host } = dbOptions[process.env.NODE_ENV].connection;
-
-export default new Sequelize(
- database,
- user,
- password,
- {
- host,
- dialect: "mariadb",
- logging: false,
- dialectOptions: { multipleStatements: true, timezone: "Etc/GMT+7" },
- }
-);
+let { database, user, password, host } = dbOptions[
+ process.env.NODE_ENV
+].connection;
+export default new Sequelize(database, user, password, {
+ host,
+ dialect: "mariadb",
+ logging: false,
+ dialectOptions: { multipleStatements: true, timezone: "Etc/GMT+7" }
+});
diff --git a/db/index.js b/db/index.js
index a7d7c25c..a98b6576 100644
--- a/db/index.js
+++ b/db/index.js
@@ -1,123 +1,123 @@
-import Sequelize from '@sequelize/core';
+import Sequelize from "@sequelize/core";
import db from "$db/db";
-db.authenticate().catch((err) => {
+db.authenticate().catch(err => {
console.debug("Error connecting to database: " + err.message);
console.log(dbOptions.connection.database + "." + dbOptions.connection.user);
});
-import './models/accounts';
-import './models/codes';
-import './models/deposits';
-import './models/invoices';
-import './models/keys';
-import './models/payments';
-import './models/orders';
-import './models/users';
-import './models/withdrawals';
+import "./models/accounts";
+import "./models/codes";
+import "./models/deposits";
+import "./models/invoices";
+import "./models/keys";
+import "./models/payments";
+import "./models/orders";
+import "./models/users";
+import "./models/withdrawals";
-import './models/referrals';
-import './models/waiting_list';
+import "./models/referrals";
+import "./models/waiting_list";
const { User, Account, Payment, Invoice, Key, Order, Referral } = db;
User.hasMany(Account, {
as: "accounts",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
User.hasMany(Invoice, {
as: "invoices",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
User.hasMany(Key, {
as: "keys",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
User.hasMany(Order, {
as: "orders",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
User.hasMany(Payment, {
as: "payments",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
User.belongsTo(Account, {
as: "account",
- foreignKey: "account_id",
+ foreignKey: "account_id"
});
Invoice.belongsTo(Account, {
as: "account",
- foreignKey: "account_id",
+ foreignKey: "account_id"
});
Account.belongsTo(User, {
as: "user",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
Invoice.belongsTo(User, {
as: "user",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
Key.belongsTo(User, {
as: "user",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
Payment.belongsTo(Account, {
as: "account",
- foreignKey: "account_id",
+ foreignKey: "account_id"
});
Payment.belongsTo(User, {
as: "user",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
Payment.belongsTo(Invoice, {
as: "invoice",
- foreignKey: "invoice_id",
+ foreignKey: "invoice_id"
});
Order.belongsTo(User, {
as: "user",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
Order.belongsTo(Account, {
as: "acc1",
- foreignKey: "a1_id",
+ foreignKey: "a1_id"
});
Order.belongsTo(Account, {
as: "acc2",
- foreignKey: "a2_id",
+ foreignKey: "a2_id"
});
User.hasMany(Referral, {
as: "referral_codes",
- foreignKey: "sponsor_id",
+ foreignKey: "sponsor_id"
});
User.hasMany(Referral, {
as: "sponsors",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
Referral.belongsTo(User, {
as: "sponsor",
- foreignKey: "sponsor_id",
+ foreignKey: "sponsor_id"
});
Referral.belongsTo(User, {
as: "user",
- foreignKey: "user_id",
+ foreignKey: "user_id"
});
Payment.belongsTo(Payment, {
diff --git a/lib/account.js b/lib/account.js
index a1f20dc7..6edb3fc1 100644
--- a/lib/account.js
+++ b/lib/account.js
@@ -1,4 +1,4 @@
-import axios from 'axios';
+import axios from "axios";
export default async (asset, user, transaction) => {
const account = await db.Account.findOne({
@@ -27,17 +27,15 @@ export default async (asset, user, transaction) => {
if (assets[asset]) {
({ domain, ticker, precision, name } = assets[asset]);
} else {
- const existing = await db.Account.findOne(
- {
- where: {
- asset
- },
- order: [["id", "ASC"]],
- limit: 1,
+ const existing = await db.Account.findOne({
+ where: {
+ asset
+ },
+ order: [["id", "ASC"]],
+ limit: 1,
lock: transaction.LOCK.UPDATE,
transaction
- },
- );
+ });
if (existing) {
({ domain, ticker, precision, name } = existing);
diff --git a/lib/buildliquidtx.js b/lib/buildliquidtx.js
index 00489e1d..ab2c597e 100644
--- a/lib/buildliquidtx.js
+++ b/lib/buildliquidtx.js
@@ -1,15 +1,15 @@
import store from "./store";
import { prod } from "./utils";
-import axios from 'axios';
+import axios from "axios";
// import liquid from 'liquidjs-lib';
-import coinselect from 'coinselect';
-import split from 'coinselect/split';
+import coinselect from "coinselect";
+import split from "coinselect/split";
const api = prod
? "https://blockstream.info/liquid/api"
: "http://localhost:3002";
const SATS = 100000000;
const network = prod ? liquid.networks["liquid"] : liquid.networks["regtest"];
-import { Op } from '@sequelize/core';
+import { Op } from "@sequelize/core";
export default async ({
address,
diff --git a/lib/buildtx.js b/lib/buildtx.js
index 24b8c91a..daed2e73 100644
--- a/lib/buildtx.js
+++ b/lib/buildtx.js
@@ -1,9 +1,9 @@
import store from "./store";
import { prod } from "./utils";
-import axios from 'axios';
-import bitcoin from 'bitcoinjs-lib';
-import coinselect from 'coinselect';
-import split from 'coinselect/split';
+import axios from "axios";
+import bitcoin from "bitcoinjs-lib";
+import coinselect from "coinselect";
+import split from "coinselect/split";
const api = prod ? "https://blockstream.info/api" : "http://electrsb:3095";
const SATS = 100000000;
const network = prod
@@ -18,20 +18,21 @@ export default async ({ address, amount, feeRate, replaceable, user }) => {
where: {
received: true,
account_id: user.account_id,
- network: 'bitcoin',
- }
+ network: "bitcoin"
+ }
});
-
const addresses = [...new Set(payments.map(p => p.address))];
const utxos = [];
for (let i = 0; i < addresses.length; i++) {
try {
- utxos.push(...(await axios.get(`${api}/address/${addresses[i]}/utxo`)).data);
+ utxos.push(
+ ...(await axios.get(`${api}/address/${addresses[i]}/utxo`)).data
+ );
} catch (e) {
err("problem fetching utxos", e.message);
}
- }
+ }
let targets = [
{
@@ -43,9 +44,16 @@ export default async ({ address, amount, feeRate, replaceable, user }) => {
let { inputs, outputs, fee } = coinselect(utxos, targets, feeRate);
if (!inputs || !outputs) {
- l("utxos", amount, feeRate, utxos.map(u => u.value));
- throw new Error("Couldn't find inputs for transaction, check your balance/fee");
- }
+ l(
+ "utxos",
+ amount,
+ feeRate,
+ utxos.map(u => u.value)
+ );
+ throw new Error(
+ "Couldn't find inputs for transaction, check your balance/fee"
+ );
+ }
let psbt = new bitcoin.Psbt({ network });
let total = 0;
@@ -53,9 +61,9 @@ export default async ({ address, amount, feeRate, replaceable, user }) => {
outputs.map(({ address, value }) => {
total += value;
if (!address) {
- address = payments[payments.length - 1].address;
+ address = payments[payments.length - 1].address;
store.change.push(address);
- }
+ }
psbt = psbt.addOutput({
address,
diff --git a/lib/liquid.js b/lib/liquid.js
index 0eba0a28..ccf6aafb 100644
--- a/lib/liquid.js
+++ b/lib/liquid.js
@@ -1,4 +1,3 @@
import config from "$config";
import rpc from "./rpc";
export default rpc(config.liquid);
-
diff --git a/lib/ln.js b/lib/ln.js
index ff848820..8e96efea 100644
--- a/lib/ln.js
+++ b/lib/ln.js
@@ -4,7 +4,7 @@ let ln;
if (config.lna.clightning) {
ln = (await import("clightning-client"))(config.lna.dir);
} else {
- ln = (await import("./lnd"));
+ ln = await import("./lnd");
}
export default ln;
diff --git a/lib/lnd.js b/lib/lnd.js
index f6d4ba6c..3be54d4e 100644
--- a/lib/lnd.js
+++ b/lib/lnd.js
@@ -1,5 +1,5 @@
import config from "$config";
-import { authenticatedLndGrpc } from 'lightning';
+import { authenticatedLndGrpc } from "lightning";
const { cert, macaroon, socket } = config.lna;
diff --git a/lib/logo.js b/lib/logo.js
index ab03ae55..922716ac 100644
--- a/lib/logo.js
+++ b/lib/logo.js
@@ -1,2 +1 @@
-
export default "iVBORw0KGgoAAAANSUhEUgAABbYAAAW2CAYAAABXn/ThAAAgAElEQVR4Xuza2W7d5bnA4c/OyLQRUxg2IEoACaG2opV6F0jcTg/KCRfAQS+qJ5VQq1Y9aCuKxFyGTUMgk5Ot729WmrJ35WQ18Vo/+4nkOkm9sl4/7xs7/pmdMcaN4QcBAgQIECBAgAABAgQIECBAgAABAgQIEIgI7AjbkU0ZkwABAgQIECBAgAABAgQIECBAgAABAgQWAWHbIRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIEDNS+v0AACAASURBVCBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABzP6fVgAAIABJREFUAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIbJHAm2++Od56663x+uuvH+pUv/rVr8Y777wzLl68eKjP68kIECBAgAABAgQIECCwjoCwvY6axxAgQIAAAQIE7pGAsH2PYP2xBAgQIECAAAECBAgcKQFh+0it0ztDgAABAgQI1AWE7foGzU+AAAECBAgQIECAwGEICNuHoew5CBAgQIAAAQK3KSBs3yaUNyNAgAABAgQIECBA4FgLCNvHev3eeQIECBAgQGDbBITtbduIeQgQIECAAAECBAgQ2EYBYXsbt2ImAgQIECBA4NgKCNvHdvXecQIECBAgQIAAAQIE7kBA2L4DLG9KgAABAgQIELjXAsL2vRb25xMgQIAAAQIECBAgcBQEhO2jsEXvAwECBAgQIHBkBITtI7NK7wgBAgQIECBAgAABAvdQQNi+h7j+aAIECBAgQIDAnQoI23cq5u0JECBAgAABAgQIEDiOAsL2cdy695kAAQIECBDYWgFhe2tXYzACBAgQIECAAAECBLZIQNjeomUYhQABAgQIECAgbLsBAgQIECBAgAABAgQIHCwgbB9s5C0IECBAgAABAocmIGwfGrUnIkCAAAECBAgQIEAgLCBsh5dndAIECBAgQODoCQjbR2+n3iMCBAgQIECAAAECBO6+gLB99039iQQIECBAgACBtQWE7bXpPJAAAQIECBAgQIAAgWMkIGwfo2V7VwkQIECAAIHtFxC2t39HJiRAgAABAgQIECBAYPMCwvbmd2ACAgQIECBAgMBNAWHbMRAgQIAAAQIECBAgQOBgAWH7YCNvQYAAAQIECBA4NAFh+9CoPREBAgQIECBAgAABAmEBYTu8PKMTIECAAAECR09A2D56O/UeESBAgAABAgQIECBw9wWE7btv6k8kQIAAAQIECKwtIGyvTeeBBAgQIECAAAECBAgcIwFh+xgt27tKgAABAgQIbL+AsL39OzIhAQIECBAgQIAAAQKbFxC2N78DExAgQIAAAQIEbgoI246BAAECBAgQIECAAAECBwsI2wcbeQsCBAgQIECAwKEJCNuHRu2JCBAgQIAAAQIECBAICwjb4eUZnQABAgQIEDh6AsL20dup94gAAQIECBAgQIAAgbsvIGzffVN/IgECBAgQIEBgbQFhe206DyRAgAABAgQIECBA4BgJCNvHaNneVQIECBAgQGD7BYTt7d+RCQkQIECAAAECBAgQ2LyAsL35HZiAAAECBAgQIHBTQNh2DAQIECBAgAABAgQIEDhYQNg+2MhbECBAgAABAgQOTUDYPjRqT0SAAAECBAgQIECAQFhA2A4vz+gECBAgQIDA0RMQto/eTr1HBAgQIECAAAECBAjcfQFh++6b+hMJECBAgAABAmsLCNtr03kgAQIECBAgQIAAAQLHSEDYPkbL9q4SIECAAAEC2y8gbG//jkxIgAABAgQIECBAgMDmBYTtze/ABAQIECBAgACBmwLCtmMgQIAAAQIECBAgQIDAwQLC9sFG3oIAAQIECBAgcGgCwvahUXsiAgQIECBAgAABAgTCAsJ2eHlGJ0CAAAECBI6egLB99HbqPSJAgAABAgQIECBA4O4LCNt339SfSIAAAQIECBBYW0DYXpvOAwkQIECAAAECBAgQOEYCwvYxWrZ3lQABAgQIENh+AWF7+3dkQgIECBAgQIAAAQIENi8gbG9+ByYgQIAAAQIECNwUELYdAwECBAgQIECAAAECBA4WELYPNvIWBAgQIECAAIFDE3jjjTfGL3/5y/HTn/700J5zPtHbb789fv3rX4+LFy8e6vN6MgIECBAgQIAAAQIECKwjIGyvo+YxBAgQIECAAIF7JHD+/Pnxi1/8Ypw7d+4ePcP//8f+5je/Ge++++64evXqoT6vJyNAgAABAgQIECBAgMA6AsL2OmoeQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIbExC2N0bviQkQIECAAAECBAgQIECAAAECBAgQIEBgHQFhex01jyFAgAABAgQIECBAgAABAgQIECBAgACBjQkI2xuj98QECBAgQIAAAQIECBAgQIAAAQIECBAgsI6AsL2OmscQIECAAAECBAgQIECAAAECBAgQIECAwMYEhO2N0XtiAgQIECBAgAABAgQIECBAgAABAgQIEFhHQNheR81jCBAgQIAAAQIECBAgQIAAAQIECBAgQGBjAsL2xug9MQECBAgQIECAAAECBAgQIECAAAECBAisIyBsr6PmMQQIECBAgAABAgQIECBAgAABAgQIECCwMQFhe2P0npgAAQIECBAgQIAAAQIECBAgQIAAAQIE1hEQttdR8xgCBAgQIECAAAECBAgQIECAAAECBAgQ2JiAsL0xek9MgAABAgQIECBAgAABAgQIECBAgAABAusICNvrqHkMAQIECBAgQIAAAQIECBAgQIAAAQIECGxMQNjeGL0nJkCAAAECBAgQIECAAAECBAgQIECAAIF1BITtddQ8hgABAgQIECBAgAABAgQIECBAgAABAgQ2JiBsb4zeExMgQIAAAQIECBAgQIAAAQIECBAgQIDAOgLC9jpqHkOAAAECBAgQIECAAAECBAgQIECAAAECGxMQtjdG74kJECBAgAABAgQIECBAgAABAgQIECBAYB0BYXsdNY8hQIAAAQIECBAgQIAAAQIECBAgQIAAgY0JCNsbo/fEBAgQIECAAAECBAgQIECAAAECBAgQILCOgLC9jprHECBAgAABAgQIECBAgAABAgQIECBAgMDGBITtjdF7YgIECBAgQIAAAQIECBAgQIAAAQIECBBYR0DYXkfNYwgQIECAAAECBAgQIECAAAECBAgQIEBgYwLC9sboPTEBAgQIECBAgAABAgQIECBAgAABAgQIrCMgbK+j5jEECBAgQIAAAQIECBAgQIAAAQIECBAgsDEBYXtj9J6YAAECBAgQIECAAAECBAgQIECAAAECBNYRELbXUfMYAgS2QmBnZ2fMl9WPW39948aNMV/mj9XrH/58K94JQxw7gdu929W93nq/xw7LO0yAQEbg331s++Hn4ls/P2feOYMSOEBg/nN0/5+k+/8uXX79/WPmv0a//yfp/Nny83/+Gi2BpsDqS7DV3d/89XLl+/+z/5XY/i9uvXn339y5qQlsq4Cwva2bMReBYyqwu7s75suJEyeWaL369Xy9+qJ5vj5z5sx46KGHxv3337+8zfy9++67b5w+fXqR++6778bly5fH3t7euHTp0rh27dryevV78wvr69evL9H71tfz7eev54sfBO5E4NbbXd3kD+933vUDDzyw3O6pU6f+z91euXJludN5f/Nmv/nmm+Vl/vyHt7q6Uzd7J1vytgQIrCNw6+fj+XFsvtz6cW7+en4Onh/b5ufnkydPjrNnzy4f5+bHqvlxbX58my8XLlwY33777fL5efVx7NbX8/fni2/qrbMpj7nbAru7Y5zYnf8enS/j+5edsTvD9e78DyzGOHVqZzz0wInxwP3z78bOOLE7xtmzu8vvzx+XLl8fly/vh70rV66PCxf3xrff7Y29a2NcXyL3/LfoGNev31h+vbzeG2Pv+r/GwLv9vvnzCNwqMG95/9bnne+Mnfl6+YbN/u/dfD3GOH16d5w9s7Pc+33Lre+O06d3xtkz8+u4Ma5duzEuXbo+ru3tP8Pl+Xfgyvy6a//vw3yZN7//TZ5/frNn9evl78P8/eX1/t8JMdy9EiDw7wSEbbdBgMBGBFbxen7xu/oieUbpp556avzoRz8azz333HjyySeXX8/X586dG48++uh4+OGHl5f5hfOt/7X2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AZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAIH/b8cOCQAAABiE9W/9EtytAGISAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBBSidlBAAAgAElEQVQgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaARW1geMAAAewSURBVGO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUYUqkaGlqg5VYAAAAASUVORK5CYII=";
diff --git a/lib/mail.js b/lib/mail.js
index fdece056..537614d2 100644
--- a/lib/mail.js
+++ b/lib/mail.js
@@ -111,12 +111,7 @@ imap.once("ready", function() {
emit(user.username, "account", account);
emit(user.username, "payment", payment);
- l(
- "interac deposit detected for",
- user.username,
- cad,
- amount
- );
+ l("interac deposit detected for", user.username, cad, amount);
});
} catch (e) {
console.log(e);
diff --git a/lib/notifications.js b/lib/notifications.js
index 49ac32f7..9c9c95dc 100644
--- a/lib/notifications.js
+++ b/lib/notifications.js
@@ -1,5 +1,5 @@
import config from "$config";
-import webpush from 'web-push';
+import webpush from "web-push";
if (config.vapid) {
webpush.setVapidDetails(
@@ -17,9 +17,12 @@ export const notify = (user, payload) => {
try {
await webpush.sendNotification(subscription, payload);
} catch (e) {
- if (e.body && (e.body.includes('expired') || e.body.includes('No such'))) {
+ if (
+ e.body &&
+ (e.body.includes("expired") || e.body.includes("No such"))
+ ) {
user.subscriptions.splice(i, 1);
- await user.save();
+ await user.save();
} else {
err("problem sending notification", e);
}
diff --git a/lib/passport.js b/lib/passport.js
index 68adbe08..a1c19d19 100644
--- a/lib/passport.js
+++ b/lib/passport.js
@@ -4,7 +4,7 @@ import Passport from "passport";
import jwt from "passport-jwt";
import { Op } from "@sequelize/core";
import fastifyPassport from "@fastify/passport";
-import fastifySecureSession from '@fastify/secure-session'
+import fastifySecureSession from "@fastify/secure-session";
import config from "$config";
import fs from "fs";
import path from "path";
diff --git a/lib/persist.js b/lib/persist.js
index 861166d4..8061d8a3 100644
--- a/lib/persist.js
+++ b/lib/persist.js
@@ -1,10 +1,10 @@
-import fs from 'fs';
+import fs from "fs";
export default (path, initial = {}) => {
if (!initial || !Object.keys(initial).length) {
try {
initial = require("../" + path);
- } catch(e) {}
+ } catch (e) {}
}
return new Proxy(initial, {
diff --git a/lib/read.js b/lib/read.js
index 9acb1056..c021cb10 100644
--- a/lib/read.js
+++ b/lib/read.js
@@ -1,7 +1,7 @@
export default (stream, func) => {
var remaining = "";
- stream.on("data", function (data) {
+ stream.on("data", function(data) {
remaining += data;
var index = remaining.indexOf("\n");
var last = 0;
@@ -17,7 +17,7 @@ export default (stream, func) => {
stream.on("error", () => {});
- stream.on("end", function () {
+ stream.on("end", function() {
if (remaining.length > 0) {
func(remaining);
}
diff --git a/lib/register.js b/lib/register.js
index f1e8a37c..7f8a059d 100644
--- a/lib/register.js
+++ b/lib/register.js
@@ -1,6 +1,6 @@
-import { authenticator } from 'otplib';
-import axios from 'axios';
-import bcrypt from 'bcrypt';
+import { authenticator } from "otplib";
+import axios from "axios";
+import bcrypt from "bcrypt";
export const register = async (user, ip, requireChallenge) => {
if (!(user && user.username)) throw new Error("Username required");
@@ -19,7 +19,7 @@ export const register = async (user, ip, requireChallenge) => {
JP: "JPY",
CN: "CNY",
AU: "AUD",
- GB: "GBP",
+ GB: "GBP"
};
if (!config.ipstack || ip.startsWith("127") || ip.startsWith("192"))
@@ -44,7 +44,7 @@ export const register = async (user, ip, requireChallenge) => {
pending: 0,
name: "Bitcoin",
ticker: "BTC",
- precision: 8,
+ precision: 8
});
user.accounts = [account];
@@ -60,4 +60,4 @@ export const register = async (user, ip, requireChallenge) => {
await user.save();
l("new user", user.username, ip);
return user;
-}
+};
diff --git a/lib/sockets.js b/lib/sockets.js
index 366820e0..252ee552 100644
--- a/lib/sockets.js
+++ b/lib/sockets.js
@@ -100,10 +100,12 @@ app.register(async function(app) {
const existing = Object.keys(store.sockets[username]);
if (existing.length > 4) {
const p = existing.find(sid => sid !== id);
- store.sockets[username][p].send(JSON.stringify({ type: "logout" }));
+ store.sockets[username][p].send(
+ JSON.stringify({ type: "logout" })
+ );
setTimeout(() => {
if (store.sockets[username][p])
- store.sockets[username][p].close(code, "too many sockets");
+ store.sockets[username][p].close(code, "too many sockets");
}, 5000);
}
store.sockets[username][id] = ws;
diff --git a/lib/utils.js b/lib/utils.js
index a7db0ea3..004ca7ac 100644
--- a/lib/utils.js
+++ b/lib/utils.js
@@ -1,5 +1,5 @@
import db from "$db";
-import sequelize from '@sequelize/core';
+import sequelize from "@sequelize/core";
const { Op } = sequelize;
export const getUser = async (username, transaction) => {
@@ -7,12 +7,12 @@ export const getUser = async (username, transaction) => {
include: [
{
model: db.Account,
- as: "account",
- },
+ as: "account"
+ }
],
where: {
- username: { [Op.or]: [username, username.replace(/ /g, "")] },
- },
+ username: { [Op.or]: [username, username.replace(/ /g, "")] }
+ }
};
if (transaction) {
@@ -31,10 +31,10 @@ export const getUserById = async (id, transaction) => {
include: [
{
model: db.Account,
- as: "account",
- },
+ as: "account"
+ }
],
- where: { id },
+ where: { id }
};
if (transaction) {
diff --git a/lib/webhooks.js b/lib/webhooks.js
index dcfcb8b0..db27f26b 100644
--- a/lib/webhooks.js
+++ b/lib/webhooks.js
@@ -1,4 +1,4 @@
-import wretch from './wretch';
+import wretch from "./wretch";
export const callWebhook = (invoice, payment) => {
if (!invoice || !payment) return;
diff --git a/lib/whitelist.js b/lib/whitelist.js
index 229f2682..a5c7a15f 100644
--- a/lib/whitelist.js
+++ b/lib/whitelist.js
@@ -16,5 +16,5 @@ export default [
"keys",
"index",
"verified",
- "email",
+ "email"
];
diff --git a/lib/wretch.js b/lib/wretch.js
index 67e28b88..0be00d10 100644
--- a/lib/wretch.js
+++ b/lib/wretch.js
@@ -1,4 +1,4 @@
import wretch from "wretch";
-import fetch from 'node-fetch';
+import fetch from "node-fetch";
wretch().polyfills({ fetch });
export default wretch;
diff --git a/routes/admin.js b/routes/admin.js
index 918f9423..3053d813 100644
--- a/routes/admin.js
+++ b/routes/admin.js
@@ -1,8 +1,8 @@
-import express from 'express';
+import express from "express";
var router = express.Router();
-import * as parseInput from '../scripts/apiParse';
-import Sequelize from '@sequelize/core';
+import * as parseInput from "../scripts/apiParse";
+import Sequelize from "@sequelize/core";
const Op = Sequelize.Op;
/**
@@ -11,8 +11,8 @@ const Op = Sequelize.Op;
* @apiGroup Admin
*
* @apiPermission admin
- *
- * @apiSuccess {Object} users List of users
+ *
+ * @apiSuccess {Object} users List of users
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
@@ -26,25 +26,32 @@ router.get(
"/users",
// auth,
async (req, res) => {
- var {search, starts_with, contains} = req.query
+ var { search, starts_with, contains } = req.query;
var users = knex
- .select('username', 'email', 'phone', 'verified', knex.raw('LEFT(createdAt,10) as created_at'))
- .from('users')
-
- var timeCondition = parseInput.addTimeSearch(req.query, 'users.createdAt')
- var userCondition = parseInput.addUserSearch(req.query)
+ .select(
+ "username",
+ "email",
+ "phone",
+ "verified",
+ knex.raw("LEFT(createdAt,10) as created_at")
+ )
+ .from("users");
+
+ var timeCondition = parseInput.addTimeSearch(req.query, "users.createdAt");
+ var userCondition = parseInput.addUserSearch(req.query);
+
+ if (timeCondition) users = users.whereRaw(timeCondition);
+ if (userCondition) users = users.whereRaw(userCondition);
- if (timeCondition) users = users.whereRaw(timeCondition)
- if (userCondition) users = users.whereRaw(userCondition)
-
// Alternative Sequelize query syntax
// await db.User.findAll({
// attributes: ['username', 'email', 'phone', 'verified', 'createdAt']
// })
- const found = await users
- return res.send({users: found})
- })
+ const found = await users;
+ return res.send({ users: found });
+ }
+);
/**
* @api {get} /referrals Retrieve list of referral tokens
@@ -52,7 +59,7 @@ router.get(
* @apiGroup Admin
*
* @apiPermission admin
- *
+ *
* @apiSuccess returns list of referral tokens
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
@@ -63,43 +70,43 @@ router.get(
* ]
* }
*/
-router.get(
- "/referrals",
- auth,
- async (req, res) => {
- var referrals = knex
- .select(
- 'token',
- 'users.username as user',
- 'sponsor.username as sponsor',
- knex.raw('LEFT(created_at, 10) as created_at'),
- 'referrals.status'
- )
- .from('referrals')
- .leftJoin('users', 'users.id', 'referrals.user_id')
- .leftJoin('users as sponsor', 'sponsor.id', 'referrals.sponsor_id')
+router.get("/referrals", auth, async (req, res) => {
+ var referrals = knex
+ .select(
+ "token",
+ "users.username as user",
+ "sponsor.username as sponsor",
+ knex.raw("LEFT(created_at, 10) as created_at"),
+ "referrals.status"
+ )
+ .from("referrals")
+ .leftJoin("users", "users.id", "referrals.user_id")
+ .leftJoin("users as sponsor", "sponsor.id", "referrals.sponsor_id");
- // Alternative Sequelize query syntax (returns sub-tables as hash)
- // var referrals = await db.Referral.findAll({
- // include: [
- // {model: db.User, as: 'user', attributes: [['username', 'user']]},
- // {model: db.User, as: 'sponsor', attributes: [['username', 'sponsor']]}
- // ]
- // })
+ // Alternative Sequelize query syntax (returns sub-tables as hash)
+ // var referrals = await db.Referral.findAll({
+ // include: [
+ // {model: db.User, as: 'user', attributes: [['username', 'user']]},
+ // {model: db.User, as: 'sponsor', attributes: [['username', 'sponsor']]}
+ // ]
+ // })
- var timeCondition = parseInput.addTimeSearch(req.query, 'referrals.updated_at')
- var userCondition = parseInput.addUserSearch(req.query, 'sponsor')
+ var timeCondition = parseInput.addTimeSearch(
+ req.query,
+ "referrals.updated_at"
+ );
+ var userCondition = parseInput.addUserSearch(req.query, "sponsor");
- if (userCondition) {
- referrals = referrals.whereRaw(userCondition)
- }
- if (timeCondition) {
- referrals = referrals.whereRaw(timeCondition)
- }
+ if (userCondition) {
+ referrals = referrals.whereRaw(userCondition);
+ }
+ if (timeCondition) {
+ referrals = referrals.whereRaw(timeCondition);
+ }
- var found = await referrals
- return res.send({referrals: found})
- })
+ var found = await referrals;
+ return res.send({ referrals: found });
+});
/**
* @api {get} /waiting_list Retrieve waiting_list
@@ -107,7 +114,7 @@ router.get(
* @apiGroup Admin
*
* @apiPermission admin
- *
+ *
* @apiSuccess returns list of referral tokens
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
@@ -119,32 +126,36 @@ router.get(
* }
*/
router.get(
- "/waiting_list",
- // auth,
- async (req, res) => {
- var {search, starts_with, contains} = req.query
+ "/waiting_list",
+ // auth,
+ async (req, res) => {
+ var { search, starts_with, contains } = req.query;
- var queue = knex
- .select(
- 'waiting_list.email',
- 'waiting_list.phone',
- 'waiting_list.created_at as requested',
- 'users.id as current_user_id'
- )
- .from('waiting_list')
- .leftJoin('users', 'users.email', 'waiting_list.email')
- .where('waiting_list.id', '>', 0)
+ var queue = knex
+ .select(
+ "waiting_list.email",
+ "waiting_list.phone",
+ "waiting_list.created_at as requested",
+ "users.id as current_user_id"
+ )
+ .from("waiting_list")
+ .leftJoin("users", "users.email", "waiting_list.email")
+ .where("waiting_list.id", ">", 0);
- var timeCondition = parseInput.addTimeSearch(req.query, 'waiting_list.updated_at')
- var userCondition = parseInput.addUserSearch(req.query)
+ var timeCondition = parseInput.addTimeSearch(
+ req.query,
+ "waiting_list.updated_at"
+ );
+ var userCondition = parseInput.addUserSearch(req.query);
- if (timeCondition) queue = queue.whereRaw(timeCondition)
- if (userCondition) queue = queue.whereRaw(userCondition)
+ if (timeCondition) queue = queue.whereRaw(timeCondition);
+ if (userCondition) queue = queue.whereRaw(userCondition);
- const found = await queue
+ const found = await queue;
- return res.send({queue: found})
- })
+ return res.send({ queue: found });
+ }
+);
/**
* @api {get} /accounts Retrieve list of accounts
@@ -152,7 +163,7 @@ router.get(
* @apiGroup Admin
*
* @apiPermission admin
- *
+ *
* @apiSuccess returns list of accounts
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
@@ -163,32 +174,35 @@ router.get(
* ]
* }
*/
-router.get(
- "/accounts",
- auth,
- async (req, res) => {
- var {nonZero, search, starts_with, contains} = req.query
+router.get("/accounts", auth, async (req, res) => {
+ var { nonZero, search, starts_with, contains } = req.query;
- var accounts = knex
- .select('username', 'accounts.id as account_id', 'ticker', 'balance', knex.raw('LEFT(accounts.createdAt, 10) as created'), knex.raw('LEFT(accounts.updatedAt, 10) as updated'))
- .from('accounts')
- .leftJoin('users', 'users.id', 'accounts.user_id')
+ var accounts = knex
+ .select(
+ "username",
+ "accounts.id as account_id",
+ "ticker",
+ "balance",
+ knex.raw("LEFT(accounts.createdAt, 10) as created"),
+ knex.raw("LEFT(accounts.updatedAt, 10) as updated")
+ )
+ .from("accounts")
+ .leftJoin("users", "users.id", "accounts.user_id");
- if (nonZero) {
- accounts = accounts
- .where('balance', '>', 0)
- }
+ if (nonZero) {
+ accounts = accounts.where("balance", ">", 0);
+ }
- var timeCondition = parseInput.addTimeSearch(req.query, 'accounts.updatedAt')
- var userCondition = parseInput.addUserSearch(req.query)
+ var timeCondition = parseInput.addTimeSearch(req.query, "accounts.updatedAt");
+ var userCondition = parseInput.addUserSearch(req.query);
- if (timeCondition) accounts = accounts.whereRaw(timeCondition)
- if (userCondition) accounts = accounts.whereRaw(userCondition)
+ if (timeCondition) accounts = accounts.whereRaw(timeCondition);
+ if (userCondition) accounts = accounts.whereRaw(userCondition);
- const found = await accounts
+ const found = await accounts;
- return res.send({accounts: found})
- })
+ return res.send({ accounts: found });
+});
/**
* @api {get} /transactions Retrieve summary of user transactions
@@ -212,50 +226,56 @@ router.get(
"/transactions",
// auth,
async (req, res) => {
- var {type, since, search, starts_with, contains} = req.query
+ var { type, since, search, starts_with, contains } = req.query;
var transactions = knex
.select(
- 'users.username',
- 'users.email',
+ "users.username",
+ "users.email"
// knex.raw('LEFT(created_at, 10) as created')
// knex.raw('LEFT(updatedAt, 10) as updated')
// knex.raw('COUNT(invoices.id) as invoices'),
// knex.raw('COUNT(payments.id) as payments'),
// knex.raw('COUNT(orders.id) as orders')
)
- .from('users')
+ .from("users");
- const types = ['deposits', 'withdrawals', 'orders', 'payments', 'invoices']
- for (var i=0; i<types.length; i++) {
- var stamp = types[i].replace(/s$/,'') + '_date'
+ const types = ["deposits", "withdrawals", "orders", "payments", "invoices"];
+ for (var i = 0; i < types.length; i++) {
+ var stamp = types[i].replace(/s$/, "") + "_date";
- transactions = transactions
+ transactions = transactions
.select(
- knex.raw('COUNT(DISTINCT ' + types[i] + '.id) as ' + types[i]),
- knex.raw('LEFT(MAX(' + types[i] + '.updatedAt), 10) as ' + stamp)
+ knex.raw("COUNT(DISTINCT " + types[i] + ".id) as " + types[i]),
+ knex.raw("LEFT(MAX(" + types[i] + ".updatedAt), 10) as " + stamp)
)
- .leftJoin(types[i], 'users.id', types[i] + '.user_id')
- // .havingRaw(types[i] + ' > ?', [0])
-
- if (since) {
- transactions = transactions
- .havingRaw('(' + stamp + ' >= ? OR ' + stamp + ' IS NULL)', [since])
- }
+ .leftJoin(types[i], "users.id", types[i] + ".user_id");
+ // .havingRaw(types[i] + ' > ?', [0])
+
+ if (since) {
+ transactions = transactions.havingRaw(
+ "(" + stamp + " >= ? OR " + stamp + " IS NULL)",
+ [since]
+ );
}
+ }
- if (since) transactions = transactions.havingRaw('invoices + payments + deposits + orders > ?', [0])
+ if (since)
+ transactions = transactions.havingRaw(
+ "invoices + payments + deposits + orders > ?",
+ [0]
+ );
- var userCondition = parseInput.addUserSearch(req.query)
- if (userCondition) transactions = transactions.whereRaw(userCondition)
+ var userCondition = parseInput.addUserSearch(req.query);
+ if (userCondition) transactions = transactions.whereRaw(userCondition);
- transactions = transactions
- .groupBy('users.id')
+ transactions = transactions.groupBy("users.id");
- const found = await transactions
+ const found = await transactions;
- return res.send({transactions: found})
- })
+ return res.send({ transactions: found });
+ }
+);
/**
* @api {get} /orders Retrieve summary of orders
@@ -275,43 +295,41 @@ router.get(
* ]
* }
*/
-router.get(
- "/orders",
- auth,
- async (req, res) => {
- var {type, since, search, starts_with, contains} = req.query
+router.get("/orders", auth, async (req, res) => {
+ var { type, since, search, starts_with, contains } = req.query;
- var orders = knex
- .select(
- 'u1.username as seller',
- 'u2.username as buyer',
- 'v1 as sell_amount',
- 'v2 as buy_amount',
- 'rate',
- 'a1.name as from',
- 'a2.name as to',
- knex.raw('Left(completedAt,16) as completed')
- )
- .from('orders')
- .leftJoin('accounts as a1', 'a1.id', 'orders.a1_id')
- .leftJoin('accounts as a2', 'a2.id', 'orders.a2_id')
- .leftJoin('users as u1', 'a1.user_id', 'u1.id')
- .leftJoin('users as u2', 'a2.user_id', 'u2.id')
+ var orders = knex
+ .select(
+ "u1.username as seller",
+ "u2.username as buyer",
+ "v1 as sell_amount",
+ "v2 as buy_amount",
+ "rate",
+ "a1.name as from",
+ "a2.name as to",
+ knex.raw("Left(completedAt,16) as completed")
+ )
+ .from("orders")
+ .leftJoin("accounts as a1", "a1.id", "orders.a1_id")
+ .leftJoin("accounts as a2", "a2.id", "orders.a2_id")
+ .leftJoin("users as u1", "a1.user_id", "u1.id")
+ .leftJoin("users as u2", "a2.user_id", "u2.id");
- var timeCondition = parseInput.addTimeSearch(req.query, 'orders.updatedAt')
- if (timeCondition) orders = orders.whereRaw(timeCondition)
+ var timeCondition = parseInput.addTimeSearch(req.query, "orders.updatedAt");
+ if (timeCondition) orders = orders.whereRaw(timeCondition);
- var userCondition1 = parseInput.addUserSearch(req.query, 'u1')
- var userCondition2 = parseInput.addUserSearch(req.query, 'u2')
+ var userCondition1 = parseInput.addUserSearch(req.query, "u1");
+ var userCondition2 = parseInput.addUserSearch(req.query, "u2");
- if (userCondition1) orders = orders.where( function () {
- this.whereRaw(userCondition1)
- this.orWhere(knex.raw(userCondition2))
- })
+ if (userCondition1)
+ orders = orders.where(function() {
+ this.whereRaw(userCondition1);
+ this.orWhere(knex.raw(userCondition2));
+ });
- var found = await orders
- return res.send({orders: found})
- })
+ var found = await orders;
+ return res.send({ orders: found });
+});
/**
* @api {get} /invoices Retrieve summary of invoices
@@ -331,35 +349,31 @@ router.get(
* ]
* }
*/
-router.get(
- "/invoices",
- auth,
- async (req, res) => {
- var {type, since, search, starts_with, contains} = req.query
+router.get("/invoices", auth, async (req, res) => {
+ var { type, since, search, starts_with, contains } = req.query;
- var invoices = knex
- .select(
- 'username',
- 'users.email',
- 'invoices.currency',
- 'invoices.amount',
- 'accounts.network',
- knex.raw('Left(invoices.updatedAt,16) as updated')
- )
- .from('invoices')
- .leftJoin('accounts', 'invoices.account_id', 'accounts.id')
- .leftJoin('users', 'accounts.user_id', 'users.id')
+ var invoices = knex
+ .select(
+ "username",
+ "users.email",
+ "invoices.currency",
+ "invoices.amount",
+ "accounts.network",
+ knex.raw("Left(invoices.updatedAt,16) as updated")
+ )
+ .from("invoices")
+ .leftJoin("accounts", "invoices.account_id", "accounts.id")
+ .leftJoin("users", "accounts.user_id", "users.id");
- var timeCondition = parseInput.addTimeSearch(req.query, 'invoices.updatedAt')
- var userCondition = parseInput.addUserSearch(req.query)
-
- if (timeCondition) invoices = invoices.whereRaw(timeCondition)
- if (userCondition) invoices = invoices.whereRaw(userCondition)
+ var timeCondition = parseInput.addTimeSearch(req.query, "invoices.updatedAt");
+ var userCondition = parseInput.addUserSearch(req.query);
- var found = await invoices
- return res.send({invoices: found})
- })
+ if (timeCondition) invoices = invoices.whereRaw(timeCondition);
+ if (userCondition) invoices = invoices.whereRaw(userCondition);
+ var found = await invoices;
+ return res.send({ invoices: found });
+});
/**
* @api {get} /deposits Retrieve summary of deposits
@@ -379,32 +393,29 @@ router.get(
* ]
* }
*/
-router.get(
- "/deposits",
- auth,
- async (req, res) => {
- var {type, since, search, starts_with, contains} = req.query
+router.get("/deposits", auth, async (req, res) => {
+ var { type, since, search, starts_with, contains } = req.query;
- var deposits = knex
- .select(
- 'username',
- 'users.email',
- 'amount',
- 'credited',
- knex.raw('Left(deposits.updatedAt,16) as deposited')
- )
- .from('deposits')
- .leftJoin('users', 'deposits.user_id', 'users.id')
+ var deposits = knex
+ .select(
+ "username",
+ "users.email",
+ "amount",
+ "credited",
+ knex.raw("Left(deposits.updatedAt,16) as deposited")
+ )
+ .from("deposits")
+ .leftJoin("users", "deposits.user_id", "users.id");
- var timeCondition = parseInput.addTimeSearch(req.query, 'deposits.updatedAt')
- var userCondition = parseInput.addUserSearch(req.query)
+ var timeCondition = parseInput.addTimeSearch(req.query, "deposits.updatedAt");
+ var userCondition = parseInput.addUserSearch(req.query);
- if (timeCondition) deposits = deposits.whereRaw(timeCondition)
- if (userCondition) deposits = deposits.whereRaw(userCondition)
+ if (timeCondition) deposits = deposits.whereRaw(timeCondition);
+ if (userCondition) deposits = deposits.whereRaw(userCondition);
- var found = await deposits
- return res.send({deposits: found})
- })
+ var found = await deposits;
+ return res.send({ deposits: found });
+});
/**
* @api {get} /withdrawals Retrieve summary of withdrawals
@@ -424,32 +435,32 @@ router.get(
* ]
* }
*/
-router.get(
- "/withdrawals",
- auth,
- async (req, res) => {
- var {type, since, search, starts_with, contains} = req.query
+router.get("/withdrawals", auth, async (req, res) => {
+ var { type, since, search, starts_with, contains } = req.query;
- var withdrawals = knex
- .select(
- 'username',
- 'users.email',
- 'amount',
- 'notes',
- knex.raw('Left(withdrawals.updatedAt,16) as withdrawn')
- )
- .from('withdrawals')
- .leftJoin('users', 'withdrawals.user_id', 'users.id')
+ var withdrawals = knex
+ .select(
+ "username",
+ "users.email",
+ "amount",
+ "notes",
+ knex.raw("Left(withdrawals.updatedAt,16) as withdrawn")
+ )
+ .from("withdrawals")
+ .leftJoin("users", "withdrawals.user_id", "users.id");
+
+ var timeCondition = parseInput.addTimeSearch(
+ req.query,
+ "withdrawals.updatedAt"
+ );
+ var userCondition = parseInput.addUserSearch(req.query);
- var timeCondition = parseInput.addTimeSearch(req.query, 'withdrawals.updatedAt')
- var userCondition = parseInput.addUserSearch(req.query)
-
- if (timeCondition) withdrawals = withdrawals.whereRaw(timeCondition)
- if (userCondition) withdrawals = withdrawals.whereRaw(userCondition)
+ if (timeCondition) withdrawals = withdrawals.whereRaw(timeCondition);
+ if (userCondition) withdrawals = withdrawals.whereRaw(userCondition);
- var found = await withdrawals
- return res.send({withdrawals: found})
- })
+ var found = await withdrawals;
+ return res.send({ withdrawals: found });
+});
/**
* @api {get} /payments Retrieve summary of payments
@@ -469,34 +480,31 @@ router.get(
* ]
* }
**/
-router.get(
- "/payments",
- auth,
- async (req, res) => {
- var {type, since, search, starts_with, contains} = req.query
+router.get("/payments", auth, async (req, res) => {
+ var { type, since, search, starts_with, contains } = req.query;
- var payments = knex
- .select(
- 'username',
- 'users.email',
- 'amount',
- 'payments.network',
- knex.raw('LEFT(hash,20) as hash'),
- knex.raw('Left(payments.updatedAt,16) as deposited')
- )
- .from('payments')
- .leftJoin('accounts', 'payments.account_id', 'accounts.id')
- .leftJoin('users', 'accounts.user_id', 'users.id')
+ var payments = knex
+ .select(
+ "username",
+ "users.email",
+ "amount",
+ "payments.network",
+ knex.raw("LEFT(hash,20) as hash"),
+ knex.raw("Left(payments.updatedAt,16) as deposited")
+ )
+ .from("payments")
+ .leftJoin("accounts", "payments.account_id", "accounts.id")
+ .leftJoin("users", "accounts.user_id", "users.id");
- var timeCondition = parseInput.addTimeSearch(req.query, 'payments.updatedAt')
- var userCondition = parseInput.addUserSearch(req.query)
+ var timeCondition = parseInput.addTimeSearch(req.query, "payments.updatedAt");
+ var userCondition = parseInput.addUserSearch(req.query);
- if (timeCondition) payments = payments.whereRaw(timeCondition)
- if (userCondition) payments = payments.whereRaw(userCondition)
+ if (timeCondition) payments = payments.whereRaw(timeCondition);
+ if (userCondition) payments = payments.whereRaw(userCondition);
- var found = await payments
- return res.send({payments: found})
- })
+ var found = await payments;
+ return res.send({ payments: found });
+});
/**
* @api {get} /user_kyc Retrieve user kyc details
@@ -516,43 +524,43 @@ router.get(
* ]
* }
*/
-router.get(
- "/kyc_required",
- auth,
- async (req, res) => {
- var {since, search, starts_with, contains} = req.query
-
- var threshold = '0.2'
-
- var kyc = knex
+router.get("/kyc_required", auth, async (req, res) => {
+ var { since, search, starts_with, contains } = req.query;
+
+ var threshold = "0.2";
+
+ var kyc = knex
.select(
knex.raw("CONCAT( FORMAT(Max(amount)/1000000, 1), ' M') as max"),
- 'username',
- 'users.email',
- 'users.verified as kyc_verified',
+ "username",
+ "users.email",
+ "users.verified as kyc_verified",
// 'payments.currency',
// 'payments.network',
// knex.raw('LEFT(hash,20) as hash'),
// knex.raw('Left(payments.updatedAt,16) as transferred')
// knex.raw( parseInput.readableDate('Max(payments.updatedAt)', 'last_changed') )
- knex.raw( 'DATE_FORMAT(Max(payments.updatedAt), ?) AS last_changed', "%M %d, %Y" )
+ knex.raw(
+ "DATE_FORMAT(Max(payments.updatedAt), ?) AS last_changed",
+ "%M %d, %Y"
)
- .from('payments')
- .leftJoin('accounts', 'payments.account_id', 'accounts.id')
- .leftJoin('users', 'payments.user_id', 'users.id') // should really point to accounts
- .groupBy('users.id')
- // .groupBy('payments.currency')
- // .groupBy('payments.network')
+ )
+ .from("payments")
+ .leftJoin("accounts", "payments.account_id", "accounts.id")
+ .leftJoin("users", "payments.user_id", "users.id") // should really point to accounts
+ .groupBy("users.id");
+ // .groupBy('payments.currency')
+ // .groupBy('payments.network')
- var timeCondition = parseInput.addTimeSearch(req.query, 'payments.updatedAt')
- var userCondition = parseInput.addUserSearch(req.query)
+ var timeCondition = parseInput.addTimeSearch(req.query, "payments.updatedAt");
+ var userCondition = parseInput.addUserSearch(req.query);
- if (timeCondition) kyc = kyc.whereRaw(timeCondition)
- if (userCondition) kyc = kyc.whereRaw(userCondition)
+ if (timeCondition) kyc = kyc.whereRaw(timeCondition);
+ if (userCondition) kyc = kyc.whereRaw(userCondition);
- var found = await kyc.having('max', '>=', threshold)
+ var found = await kyc.having("max", ">=", threshold);
- return res.send({found: found})
- })
+ return res.send({ found: found });
+});
export default router;
diff --git a/routes/assets.js b/routes/assets.js
index 541c9625..826ff2d9 100644
--- a/routes/assets.js
+++ b/routes/assets.js
@@ -4,16 +4,14 @@ import db from "$db";
import config from "$config";
import app from "$app";
import { auth } from "$lib/passport";
-import axios from 'axios';
-import crypto from 'crypto';
-import fs from 'fs';
+import axios from "axios";
+import crypto from "crypto";
+import fs from "fs";
let fetchAssets;
(fetchAssets = async () => {
try {
- const { data } = await axios.get(
- "https://assets.blockstream.info/"
- );
+ const { data } = await axios.get("https://assets.blockstream.info/");
store.assets = data;
} catch (e) {
@@ -30,432 +28,415 @@ let fetchAssets;
setTimeout(fetchAssets, 7200000);
})();
-app.get(
- "/assets",
- async (req, res) => {
- if (store.assets) {
- const accounts = await db.Account.findAll({
- // group: ["asset"]
- });
- Object.keys(store.assets).map(a => {
- store.assets[a].registered = true;
- if (!store.assets[a].asset) store.assets[a].asset = store.assets[a].asset_id;
- if (
- (store.assets[a].ticker === "BTC" &&
- store.assets[a].asset !== config.liquid.btcasset) ||
- (store.assets[a].ticker === "EUR" &&
- store.assets[a].asset !== config.liquid.eurasset) ||
- (store.assets[a].ticker === "CAD" &&
- store.assets[a].asset !== config.liquid.cadasset) ||
- (store.assets[a].ticker === "USDt" &&
- store.assets[a].asset !== config.liquid.usdtasset)
- )
- delete store.assets[a];
- });
- accounts.map(({ asset, name, domain, ticker, precision }) => {
- if (!store.assets[asset])
- store.assets[asset] = {
- asset,
- name,
- domain,
- ticker,
- precision
- };
- });
+app.get("/assets", async (req, res) => {
+ if (store.assets) {
+ const accounts = await db.Account.findAll({
+ // group: ["asset"]
+ });
+ Object.keys(store.assets).map(a => {
+ store.assets[a].registered = true;
+ if (!store.assets[a].asset)
+ store.assets[a].asset = store.assets[a].asset_id;
+ if (
+ (store.assets[a].ticker === "BTC" &&
+ store.assets[a].asset !== config.liquid.btcasset) ||
+ (store.assets[a].ticker === "EUR" &&
+ store.assets[a].asset !== config.liquid.eurasset) ||
+ (store.assets[a].ticker === "CAD" &&
+ store.assets[a].asset !== config.liquid.cadasset) ||
+ (store.assets[a].ticker === "USDt" &&
+ store.assets[a].asset !== config.liquid.usdtasset)
+ )
+ delete store.assets[a];
+ });
+ accounts.map(({ asset, name, domain, ticker, precision }) => {
+ if (!store.assets[asset])
+ store.assets[asset] = {
+ asset,
+ name,
+ domain,
+ ticker,
+ precision
+ };
+ });
- res.send(store.assets);
- } else {
- console.log("error getting blockstream assets");
- res.code(500).send("Problem fetching blockstream asset registry data");
- }
- })
+ res.send(store.assets);
+ } else {
+ console.log("error getting blockstream assets");
+ res.code(500).send("Problem fetching blockstream asset registry data");
+ }
+});
-app.post(
- "/assets",
- auth,
- async (req, res) => {
- try {
- const sha256 = crypto.createHash("sha256");
- const { id: user_id } = req.user;
- const blind = false;
+app.post("/assets", auth, async (req, res) => {
+ try {
+ const sha256 = crypto.createHash("sha256");
+ const { id: user_id } = req.user;
+ const blind = false;
- if (!user_id) throw new Error("unauthorized");
+ if (!user_id) throw new Error("unauthorized");
- const {
- address,
- domain,
- name,
- asset_amount,
- filename,
- token_amount,
- precision,
- pubkey,
- ticker
- } = req.body;
+ const {
+ address,
+ domain,
+ name,
+ asset_amount,
+ filename,
+ token_amount,
+ precision,
+ pubkey,
+ ticker
+ } = req.body;
- const asset_address = address
- ? address
- : await lq.getNewAddress("", "legacy");
+ const asset_address = address
+ ? address
+ : await lq.getNewAddress("", "legacy");
- const token_address =
- token_amount && (await lq.getNewAddress("", "legacy"));
+ const token_address =
+ token_amount && (await lq.getNewAddress("", "legacy"));
- const issuer_pubkey = pubkey
- ? pubkey
- : (await lq.getAddressInfo(asset_address)).pubkey;
- const version = 0;
+ const issuer_pubkey = pubkey
+ ? pubkey
+ : (await lq.getAddressInfo(asset_address)).pubkey;
+ const version = 0;
- let contract = {
- entity: { domain },
- issuer_pubkey,
- name,
- precision,
- version
- };
+ let contract = {
+ entity: { domain },
+ issuer_pubkey,
+ name,
+ precision,
+ version
+ };
- if (filename) contract.file = filename;
- if (ticker) contract.ticker = ticker;
+ if (filename) contract.file = filename;
+ if (ticker) contract.ticker = ticker;
- contract = Object.keys(contract)
- .sort()
- .reduce((r, k) => ((r[k] = contract[k]), r), {});
+ contract = Object.keys(contract)
+ .sort()
+ .reduce((r, k) => ((r[k] = contract[k]), r), {});
- l(
- "attempting issuance",
- req.user.username,
- contract,
- "address",
- address,
- "pubkey",
- pubkey
- );
+ l(
+ "attempting issuance",
+ req.user.username,
+ contract,
+ "address",
+ address,
+ "pubkey",
+ pubkey
+ );
- sha256.update(JSON.stringify(contract));
- const hash = sha256.digest("hex");
- const contract_hash = hash
- .match(/[a-f0-9]{2}/g)
- .reverse()
- .join("");
- const rawtx = await lq.createRawTransaction([], [{ data: "00" }]);
- const funded = await lq.fundRawTransaction(rawtx, { feeRate: 0.000002 });
- const params = {
- asset_amount,
- asset_address,
- blind,
- contract_hash
- };
+ sha256.update(JSON.stringify(contract));
+ const hash = sha256.digest("hex");
+ const contract_hash = hash
+ .match(/[a-f0-9]{2}/g)
+ .reverse()
+ .join("");
+ const rawtx = await lq.createRawTransaction([], [{ data: "00" }]);
+ const funded = await lq.fundRawTransaction(rawtx, { feeRate: 0.000002 });
+ const params = {
+ asset_amount,
+ asset_address,
+ blind,
+ contract_hash
+ };
- params.asset_amount = asset_amount / (SATS / 10 ** precision);
+ params.asset_amount = asset_amount / (SATS / 10 ** precision);
- if (token_amount) {
- params.token_amount = token_amount;
- params.token_address = token_address;
- params.token_amount = parseInt(params.token_amount);
- }
+ if (token_amount) {
+ params.token_amount = token_amount;
+ params.token_address = token_address;
+ params.token_amount = parseInt(params.token_amount);
+ }
- let ria;
- try {
- ria = await lq.rawIssueAsset(funded.hex, [params]);
- } catch (e) {
- l(asset_amount, token_amount, params);
- throw new Error(e.message);
- }
+ let ria;
+ try {
+ ria = await lq.rawIssueAsset(funded.hex, [params]);
+ } catch (e) {
+ l(asset_amount, token_amount, params);
+ throw new Error(e.message);
+ }
- const { asset, hex, token } = ria[0];
- const brt = await lq.blindRawTransaction(hex, true, [], false);
- const srt = await lq.signRawTransactionWithWallet(brt);
- const allowed = (await lq.testMempoolAccept([srt.hex]))[0].allowed;
- if (!allowed) throw new Error("issuance rejected by mempool", srt.hex);
- const txid = await lq.sendRawTransaction(srt.hex);
+ const { asset, hex, token } = ria[0];
+ const brt = await lq.blindRawTransaction(hex, true, [], false);
+ const srt = await lq.signRawTransactionWithWallet(brt);
+ const allowed = (await lq.testMempoolAccept([srt.hex]))[0].allowed;
+ if (!allowed) throw new Error("issuance rejected by mempool", srt.hex);
+ const txid = await lq.sendRawTransaction(srt.hex);
- await db.transaction(async transaction => {
- let account = await db.Account.findOne({
- where: {
- user_id,
- asset: config.liquid.btcasset,
- pubkey: null
- },
- include: {
- model: db.User,
- as: "user"
- },
- order: [["balance", "DESC"]],
- transaction
- });
+ await db.transaction(async transaction => {
+ let account = await db.Account.findOne({
+ where: {
+ user_id,
+ asset: config.liquid.btcasset,
+ pubkey: null
+ },
+ include: {
+ model: db.User,
+ as: "user"
+ },
+ order: [["balance", "DESC"]],
+ transaction
+ });
- let { user } = account;
+ let { user } = account;
- if (Math.round(funded.fee * SATS) > account.balance) {
- err(
- "amount exceeds balance",
- asset_amount,
- funded.fee,
- account.balance
- );
- throw new Error(`Insufficient funds to pay fee of ${funded.fee} BTC`);
- }
+ if (Math.round(funded.fee * SATS) > account.balance) {
+ err(
+ "amount exceeds balance",
+ asset_amount,
+ funded.fee,
+ account.balance
+ );
+ throw new Error(`Insufficient funds to pay fee of ${funded.fee} BTC`);
+ }
+
+ await account.decrement(
+ { balance: Math.round(funded.fee * SATS) },
+ { transaction }
+ );
+ await account.reload({ transaction });
+ emit(user.username, "account", account);
+
+ account = await db.Account.create(
+ {
+ asset,
+ contract,
+ domain,
+ user_id,
+ ticker,
+ precision,
+ name,
+ balance: 0,
+ network: "liquid",
+ pending: address ? 0 : Math.round(params.asset_amount * SATS)
+ },
+ { transaction }
+ );
- await account.decrement(
- { balance: Math.round(funded.fee * SATS) },
+ emit(user.username, "account", account);
+ l(
+ "issued asset",
+ user.username,
+ params.asset_amount,
+ ticker,
+ name,
+ account.id
+ );
+
+ if (!address) {
+ const asset_payment = await db.Payment.create(
+ {
+ account_id: account.id,
+ user_id,
+ hash: txid,
+ amount: Math.round(params.asset_amount * SATS),
+ received: true,
+ confirmed: false,
+ address: asset_address,
+ network: "liquid"
+ },
{ transaction }
);
- await account.reload({ transaction });
- emit(user.username, "account", account);
+ emit(user.username, "payment", asset_payment);
+
+ issuances[txid] = {
+ user_id,
+ asset,
+ asset_amount: params.asset_amount,
+ asset_payment_id: asset_payment.id
+ };
+ }
+ if (token_amount) {
account = await db.Account.create(
{
- asset,
- contract,
- domain,
+ asset: token,
user_id,
- ticker,
- precision,
- name,
+ domain,
+ ticker: `${ticker}REISSUANCETOKEN`,
+ precision: 8,
+ name: `${name} Reissuance Token`,
balance: 0,
- network: "liquid",
- pending: address ? 0 : Math.round(params.asset_amount * SATS)
+ pending: address ? 0 : Math.round(token_amount * SATS)
},
{ transaction }
);
-
emit(user.username, "account", account);
- l(
- "issued asset",
- user.username,
- params.asset_amount,
- ticker,
- name,
- account.id
- );
if (!address) {
- const asset_payment = await db.Payment.create(
+ const token_payment = await db.Payment.create(
{
account_id: account.id,
user_id,
hash: txid,
- amount: Math.round(params.asset_amount * SATS),
+ amount: Math.round(token_amount * SATS),
received: true,
confirmed: false,
- address: asset_address,
+ address: token_address,
network: "liquid"
},
{ transaction }
);
- emit(user.username, "payment", asset_payment);
+ emit(user.username, "payment", token_payment);
- issuances[txid] = {
- user_id,
- asset,
- asset_amount: params.asset_amount,
- asset_payment_id: asset_payment.id
- };
+ issuances[txid].token = token;
+ issuances[txid].token_amount = token_amount;
+ issuances[txid].token_payment_id = token_payment.id;
}
+ }
+ });
- if (token_amount) {
- account = await db.Account.create(
- {
- asset: token,
- user_id,
- domain,
- ticker: `${ticker}REISSUANCETOKEN`,
- precision: 8,
- name: `${name} Reissuance Token`,
- balance: 0,
- pending: address ? 0 : Math.round(token_amount * SATS)
- },
- { transaction }
- );
- emit(user.username, "account", account);
-
- if (!address) {
- const token_payment = await db.Payment.create(
- {
- account_id: account.id,
- user_id,
- hash: txid,
- amount: Math.round(token_amount * SATS),
- received: true,
- confirmed: false,
- address: token_address,
- network: "liquid"
- },
- { transaction }
- );
- emit(user.username, "payment", token_payment);
-
- issuances[txid].token = token;
- issuances[txid].token_amount = token_amount;
- issuances[txid].token_payment_id = token_payment.id;
- }
- }
- });
+ res.send(issuances[txid] ? issuances[txid] : { asset });
+ } catch (e) {
+ err("asset issuance failed", e.message, e.stack);
+ res.code(500).send(e.message);
+ }
+});
- res.send(issuances[txid] ? issuances[txid] : { asset });
- } catch (e) {
- err("asset issuance failed", e.message, e.stack);
- res.code(500).send(e.message);
+app.post("/assets/register", auth, async (req, res) => {
+ const { asset } = req.body;
+ const account = await db.Account.findOne({
+ where: {
+ user_id: req.user.id,
+ asset
}
- })
+ });
-app.post(
- "/assets/register",
- auth,
- async (req, res) => {
- const { asset } = req.body;
- const account = await db.Account.findOne({
- where: {
- user_id: req.user.id,
- asset
+ l("registering", asset, account.contract);
+
+ try {
+ const { data: result } = await axios.post(
+ "https://assets.blockstream.info/",
+ {
+ asset_id: asset,
+ contract: account.contract
}
- });
+ );
+ l("register asset result", req.user.username, result);
+ res.send(result);
+ } catch (e) {
+ err("asset registration failed", e.message);
+ res.code(500).send(e.message);
+ }
+});
- l("registering", asset, account.contract);
+app.post("/loadFaucet", auth, async (req, res) => {
+ return res.code(500).send("Faucet feature temporarily disabled");
- try {
- const { data: result } = await axios.post(
- "https://assets.blockstream.info/",
- {
- asset_id: asset,
- contract: account.contract
- }
- );
- l("register asset result", req.user.username, result);
- res.send(result);
- } catch (e) {
- err("asset registration failed", e.message);
- res.code(500).send(e.message);
- }
- })
-
-app.post(
- "/loadFaucet",
- auth,
- async (req, res) => {
- return res.code(500).send("Faucet feature temporarily disabled");
+ const { user } = req;
+ let { asset, amount } = req.body;
+ amount = parseInt(amount);
- const { user } = req;
- let { asset, amount } = req.body;
- amount = parseInt(amount);
+ try {
+ if (amount <= 0) throw new Error("Amount to load cannot be negative");
- try {
- if (amount <= 0) throw new Error("Amount to load cannot be negative");
+ await db.transaction(async transaction => {
+ let account = await getAccount(config.liquid.btcasset, user, transaction);
- await db.transaction(async transaction => {
- let account = await getAccount(
- config.liquid.btcasset,
- user,
- transaction
+ if (account.asset !== config.liquid.btcasset)
+ throw new Error(
+ "Faucet has to be funded with bitcoin. Try sending from another wallet."
);
+ if (account.balance < amount) throw new Error("Insufficient funds");
- if (account.asset !== config.liquid.btcasset)
- throw new Error(
- "Faucet has to be funded with bitcoin. Try sending from another wallet."
- );
- if (account.balance < amount) throw new Error("Insufficient funds");
-
- let fee = 0;
+ let fee = 0;
- await account.decrement({ balance: amount }, { transaction });
- await account.reload({ transaction });
+ await account.decrement({ balance: amount }, { transaction });
+ await account.reload({ transaction });
- let a2;
- let acc = {
- user_id: null,
- asset
- };
+ let a2;
+ let acc = {
+ user_id: null,
+ asset
+ };
- a2 = await db.Account.findOne({
- where: acc,
- lock: transaction.LOCK.UPDATE,
- transaction
- });
+ a2 = await db.Account.findOne({
+ where: acc,
+ lock: transaction.LOCK.UPDATE,
+ transaction
+ });
- if (a2) {
- await a2.increment({ balance: amount }, { transaction });
- await a2.reload({ transaction });
- } else {
- let name = asset.substr(0, 6);
- let domain;
- let ticker = asset.substr(0, 3).toUpperCase();
- let precision = 8;
+ if (a2) {
+ await a2.increment({ balance: amount }, { transaction });
+ await a2.reload({ transaction });
+ } else {
+ let name = asset.substr(0, 6);
+ let domain;
+ let ticker = asset.substr(0, 3).toUpperCase();
+ let precision = 8;
- const assets = assets;
+ const assets = assets;
- if (assets[asset]) {
- ({ domain, ticker, precision, name } = assets[asset]);
- } else {
- const existing = await db.Account.findOne({
- where: {
- asset
- },
- order: [["id", "ASC"]],
- limit: 1,
- lock: transaction.LOCK.UPDATE,
- transaction
- });
+ if (assets[asset]) {
+ ({ domain, ticker, precision, name } = assets[asset]);
+ } else {
+ const existing = await db.Account.findOne({
+ where: {
+ asset
+ },
+ order: [["id", "ASC"]],
+ limit: 1,
+ lock: transaction.LOCK.UPDATE,
+ transaction
+ });
- if (existing) {
- ({ domain, ticker, precision, name } = existing);
- }
+ if (existing) {
+ ({ domain, ticker, precision, name } = existing);
}
-
- acc = { ...acc, ...{ domain, ticker, precision, name } };
- acc.balance = amount;
- acc.pending = 0;
- acc.network = "liquid";
- a2 = await db.Account.create(acc, { transaction });
}
- let params = {
- amount: -amount,
- account_id: account.id,
- user_id: user.id,
- rate: store.rates[user.currency],
- currency: user.currency,
- confirmed: true,
- hash: `Loaded Faucet - ${a2.ticker}`,
- network: "COINOS"
- };
+ acc = { ...acc, ...{ domain, ticker, precision, name } };
+ acc.balance = amount;
+ acc.pending = 0;
+ acc.network = "liquid";
+ a2 = await db.Account.create(acc, { transaction });
+ }
- let payment = await db.Payment.create(params, { transaction });
+ let params = {
+ amount: -amount,
+ account_id: account.id,
+ user_id: user.id,
+ rate: store.rates[user.currency],
+ currency: user.currency,
+ confirmed: true,
+ hash: `Loaded Faucet - ${a2.ticker}`,
+ network: "COINOS"
+ };
- payment = payment.get({ plain: true });
- payment.account = account.get({ plain: true });
+ let payment = await db.Payment.create(params, { transaction });
- l("sent internal", user.username, -payment.amount);
+ payment = payment.get({ plain: true });
+ payment.account = account.get({ plain: true });
- emit(user.username, "payment", payment);
- emit(user.username, "account", account);
- emit(user.username, "user", user);
+ l("sent internal", user.username, -payment.amount);
- l("loaded faucet", asset, amount);
- res.send({});
- });
- } catch (e) {
- err("problem loading faucet", user.username, e.message);
- return res.code(500).send(e.message);
- }
- })
+ emit(user.username, "payment", payment);
+ emit(user.username, "account", account);
+ emit(user.username, "user", user);
-app.get(
- "/faucet",
- auth,
- async (req, res) => {
- let { asset } = req.query;
- let faucet = await db.Account.findOne({
- where: {
- asset,
- user_id: null
- }
+ l("loaded faucet", asset, amount);
+ res.send({});
});
+ } catch (e) {
+ err("problem loading faucet", user.username, e.message);
+ return res.code(500).send(e.message);
+ }
+});
- if (!faucet)
- faucet = {
- asset,
- balance: 0,
- ticker: "Unknown"
- };
+app.get("/faucet", auth, async (req, res) => {
+ let { asset } = req.query;
+ let faucet = await db.Account.findOne({
+ where: {
+ asset,
+ user_id: null
+ }
+ });
+
+ if (!faucet)
+ faucet = {
+ asset,
+ balance: 0,
+ ticker: "Unknown"
+ };
- res.send(faucet);
- })
+ res.send(faucet);
+});
diff --git a/routes/funding.js b/routes/funding.js
index 9647b301..e65a704e 100644
--- a/routes/funding.js
+++ b/routes/funding.js
@@ -1,110 +1,96 @@
import { emit } from "$lib/sockets";
import app from "$app";
import config from "$config";
-import mailgunFactory from 'mailgun-js';
+import mailgunFactory from "mailgun-js";
const mailgun = mailgunFactory(config.mailgun);
-app.post(
- "/id",
- auth,
- upload.single("id"),
- async (req, res) => {
- const { user } = req;
- if (user.verified === "proof") user.verified = "pending";
- else user.verified = "id";
- await user.save();
- emit(user.username, "user", user);
+app.post("/id", auth, upload.single("id"), async (req, res) => {
+ const { user } = req;
+ if (user.verified === "proof") user.verified = "pending";
+ else user.verified = "id";
+ await user.save();
+ emit(user.username, "user", user);
- let data = {
- subject: "KYC Documents",
- text: `ID uploaded for ${user.username}`,
- };
+ let data = {
+ subject: "KYC Documents",
+ text: `ID uploaded for ${user.username}`,
+ };
- mailgun.messages().send(data);
- l("id uploaded", user.username);
+ mailgun.messages().send(data);
+ l("id uploaded", user.username);
- res.send({});
- })
+ res.send({});
+});
-app.post(
- "/proof",
- auth,
- upload.single("proof"),
- async (req, res) => {
- const { user } = req;
- if (user.verified === "id") user.verified = "pending";
- else user.verified = "proof";
- await user.save();
- emit(user.username, "user", user);
- l("id proof uploaded", user.username);
+app.post("/proof", auth, upload.single("proof"), async (req, res) => {
+ const { user } = req;
+ if (user.verified === "id") user.verified = "pending";
+ else user.verified = "proof";
+ await user.save();
+ emit(user.username, "user", user);
+ l("id proof uploaded", user.username);
- res.send({});
- })
+ res.send({});
+});
-app.post(
- "/funding",
- auth,
- async (req, res) => {
- try {
- let { id, amount, code } = req.body;
+app.post("/funding", auth, async (req, res) => {
+ try {
+ let { id, amount, code } = req.body;
- if (!code) {
- code = "";
- let d = "ABCDEFGHIJKLMNPQRSTUVWXYZ23456789";
- let l = d.length;
- for (let i = 0; i < 8; i++) {
- code += d.charAt(Math.floor(Math.random() * l));
- }
+ if (!code) {
+ code = "";
+ let d = "ABCDEFGHIJKLMNPQRSTUVWXYZ23456789";
+ let l = d.length;
+ for (let i = 0; i < 8; i++) {
+ code += d.charAt(Math.floor(Math.random() * l));
}
-
- let params = {
- user_id: req.user.id,
- amount,
- code
- };
-
- let deposit;
- if (id) {
- if (!parseFloat(amount) || parseFloat(amount) < 0)
- throw new Error("Invalid amount");
- deposit = await db.Deposit.findOne({ where: { id } });
- deposit.update(params);
- await deposit.save();
- } else {
- deposit = await db.Deposit.create(params);
- }
-
- res.send(deposit);
- } catch (e) {
- err("funding error", e.message);
- res.code(500).send("Funding request failed");
}
- })
-app.post(
- "/withdrawal",
- auth,
- async (req, res) => {
- try {
- const { account, amount, email, institution, transit, notes } = req.body;
+ let params = {
+ user_id: req.user.id,
+ amount,
+ code
+ };
+
+ let deposit;
+ if (id) {
if (!parseFloat(amount) || parseFloat(amount) < 0)
throw new Error("Invalid amount");
+ deposit = await db.Deposit.findOne({ where: { id } });
+ deposit.update(params);
+ await deposit.save();
+ } else {
+ deposit = await db.Deposit.create(params);
+ }
- await db.Withdrawal.create({
- user_id: req.user.id,
- account,
- amount,
- email,
- institution,
- transit,
- notes
- });
+ res.send(deposit);
+ } catch (e) {
+ err("funding error", e.message);
+ res.code(500).send("Funding request failed");
+ }
+});
- res.send({});
- } catch (e) {
- err("withdrawaerr", e.message);
- res.code(500).send("Withdrawal request failed");
- }
- })
+app.post("/withdrawal", auth, async (req, res) => {
+ try {
+ const { account, amount, email, institution, transit, notes } = req.body;
+ if (!parseFloat(amount) || parseFloat(amount) < 0)
+ throw new Error("Invalid amount");
+
+ await db.Withdrawal.create({
+ user_id: req.user.id,
+ account,
+ amount,
+ email,
+ institution,
+ transit,
+ notes
+ });
+
+ res.send({});
+ } catch (e) {
+ err("withdrawaerr", e.message);
+ res.code(500).send("Withdrawal request failed");
+ }
+});
diff --git a/routes/info.js b/routes/info.js
index d8785333..1b92624b 100644
--- a/routes/info.js
+++ b/routes/info.js
@@ -1,5 +1,5 @@
import app from "$app";
-import sequelize from '@sequelize/core';
+import sequelize from "@sequelize/core";
import config from "$config";
import store from "$lib/store";
import ln from "$lib/ln";
@@ -21,7 +21,7 @@ app.get("/info", async (req, res, next) => {
const info = {
nodes: store.networks,
- clientVersion,
+ clientVersion
};
res.send(info);
@@ -34,35 +34,37 @@ app.get("/balances", async (req, res, next) => {
"pubkey",
[sequelize.fn("sum", sequelize.col("balance")), "total"]
],
- group: ["asset", "pubkey"],
+ group: ["asset", "pubkey"]
});
- let lnchannel;
+ let lnchannel;
let lnwallet;
if (config.lna) {
if (config.lna.clightning) {
const funds = await lna.listfunds();
- lnchannel = parseInt(funds.channels.reduce((a, b) => a + b.channel_sat, 0));
+ lnchannel = parseInt(
+ funds.channels.reduce((a, b) => a + b.channel_sat, 0)
+ );
lnwallet = parseInt(funds.outputs.reduce((a, b) => a + b.value, 0));
} else {
- lnchannel = parseInt((await getChannelBalance({ lnd }).channel_balance));
- lnwallet = parseInt((await getChainBalance({ lnd }).chain_balance));
- }
+ lnchannel = parseInt(await getChannelBalance({ lnd }).channel_balance);
+ lnwallet = parseInt(await getChainBalance({ lnd }).chain_balance);
+ }
}
let bitcoin, bitcoind;
if (config.bitcoin) {
bitcoin = parseInt((await bc.getBalance()) * SATS);
bitcoind = await bc.getNetworkInfo();
- }
+ }
let assets, liquid, elementsd;
if (config.liquid) {
assets = await lq.getBalance();
liquid = parseInt(assets.bitcoin * SATS);
elementsd = await lq.getNetworkInfo();
- }
+ }
const info = {
bitcoind,
@@ -72,7 +74,7 @@ app.get("/balances", async (req, res, next) => {
bitcoin,
liquid,
lnchannel,
- lnwallet,
+ lnwallet
};
info.total =
diff --git a/routes/lnurl.js b/routes/lnurl.js
index d7bdcfc2..1cf5e319 100644
--- a/routes/lnurl.js
+++ b/routes/lnurl.js
@@ -9,7 +9,7 @@ import qs from "query-string";
import persist from "$lib/persist";
import bolt11 from "bolt11";
import { optionalAuth, auth } from "$lib/passport";
-import { createInvoice, getPayments, from "lightning";
+import { createInvoice, getPayments } from "lightning";
import lnd from "$lib/lnd";
export const logins = persist("data/logins.json");
@@ -455,7 +455,7 @@ lnurlServer.bindToHook(
try {
let { payments } = await ln.getPayments({
lnd,
- limit: 5,
+ limit: 5
});
let p = payments.find(p => p.request === pr);
diff --git a/routes/payments.js b/routes/payments.js
index 4939394f..6d4076cf 100644
--- a/routes/payments.js
+++ b/routes/payments.js
@@ -65,7 +65,7 @@ if (config.lna) {
// if (config.lnurl) {
// let channelRequest = await import("$routes/lightning/channelRequest");
// app.post("/lightning/channelRequest", channelRequest)
- // }
+ // }
}
if (config.bitcoin) {
diff --git a/routes/referrals.js b/routes/referrals.js
index 08059c74..b3d53306 100644
--- a/routes/referrals.js
+++ b/routes/referrals.js
@@ -1,19 +1,19 @@
-import express from 'express';
+import express from "express";
var router = express.Router();
-import { v4 } from 'uuid';
+import { v4 } from "uuid";
-router.get('/', function(req, res, next) {
- res.send('list of referrals...');
+router.get("/", function(req, res, next) {
+ res.send("list of referrals...");
});
// Grant & Retrieve Referral tokens for existing user
// usage: GET '/grant?sponsor_id=N&expiry=2021-09-01'
//
-// Required:
+// Required:
// sponsor_id (= user.id)
-// Changes to DB:
+// Changes to DB:
// adds record to referrals table:
// { token: <uuid>, sponsor_id: <user.id>, status: "available" }
@@ -22,9 +22,9 @@ router.get('/', function(req, res, next) {
* @apiName Grant
* @apiGroup Referrals
*
- *
+ *
* @apiPermission member
- *
+ *
* @apiParam {sponsor_id} user_id of member generating referral code.
* @apiParam {expiry} optional expiry date for token.
*
@@ -34,28 +34,23 @@ router.get('/', function(req, res, next) {
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
- * "token": "*********",
- * "status": "available",
+ * "token": "*********",
+ * "status": "available",
* "expiry": null
* }
*/
-router.post(
- "/grant",
- auth,
- async (req, res) => {
- const {sponsor_id, expiry} = req.body
- var token = v4()
+router.post("/grant", auth, async (req, res) => {
+ const { sponsor_id, expiry } = req.body;
+ var token = v4();
- var ref = await knex.table('referrals')
- .insert({
- sponsor_id: sponsor_id,
- token: token,
- status: 'available'
- }
- )
+ var ref = await knex.table("referrals").insert({
+ sponsor_id: sponsor_id,
+ token: token,
+ status: "available"
+ });
- return res.send({token: token, status: 'available', expiry: expiry})
- })
+ return res.send({ token: token, status: "available", expiry: expiry });
+});
/**
* @api {get} /grant Grant Referral code (variation using get)
@@ -63,7 +58,7 @@ router.post(
* @apiGroup Referrals
*
* @apiPermission member
- *
+ *
* @apiPermission member
* @apiParam {sponsor_id} user_id of member generating referral code.
* @apiParam {expiry} optional expiry date for token.
@@ -74,43 +69,37 @@ router.post(
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
- * "token": "*********",
- * "status": "available",
+ * "token": "*********",
+ * "status": "available",
* "expiry": null
* }
*/
-router.get(
- "/grant",
- auth,
- async (req, res) => {
- const {sponsor_id, expiry} = req.query
- var token = v4()
-
- var ref = await knex.table('referrals')
- .insert({
- sponsor_id: sponsor_id,
- token: token,
- status: 'available'
- }
- )
+router.get("/grant", auth, async (req, res) => {
+ const { sponsor_id, expiry } = req.query;
+ var token = v4();
- return res.send({token: token, status: 'available', expiry: expiry})
- })
+ var ref = await knex.table("referrals").insert({
+ sponsor_id: sponsor_id,
+ token: token,
+ status: "available"
+ });
+ return res.send({ token: token, status: "available", expiry: expiry });
+});
/**
* @api {get} /checkTokens/:sponsor_id Retrieve list of referral tokens generated by this user
- *
+ *
* @apiName checkTokens
* @apiGroup Referrals
*
- *
+ *
* @apiPermission member
- *
+ *
* @apiParam {sponsor_id} user_id of member generating referral code.
* @apiParam {status} optional token status.
*
- * @apiSuccess tokens array of token objects
+ * @apiSuccess tokens array of token objects
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
@@ -122,40 +111,37 @@ router.get(
// TO FIX - change sponsor_id so that it is retrieved from current payload (NOT FROM URL)
-router.get(
- "/checkTokens/:sponsor_id",
- auth,
- async (req, res) => {
- const {sponsor_id} = req.params
- const {status} = req.query
+router.get("/checkTokens/:sponsor_id", auth, async (req, res) => {
+ const { sponsor_id } = req.params;
+ const { status } = req.query;
- var tokens = knex
- .select(
- 'token',
- 'created_at',
- knex.raw('LEFT(created_at,10) as created'),
- 'username',
- 'status'
- )
- .from('referrals')
- .leftJoin('users', 'users.id', 'referrals.user_id')
- .where('sponsor_id', 'like', sponsor_id)
+ var tokens = knex
+ .select(
+ "token",
+ "created_at",
+ knex.raw("LEFT(created_at,10) as created"),
+ "username",
+ "status"
+ )
+ .from("referrals")
+ .leftJoin("users", "users.id", "referrals.user_id")
+ .where("sponsor_id", "like", sponsor_id);
- if (status && status !== 'all') tokens = tokens.where('status', 'like', status)
- const found = await tokens
-
- return res.send({tokens: found})
- })
+ if (status && status !== "all")
+ tokens = tokens.where("status", "like", status);
+ const found = await tokens;
+ return res.send({ tokens: found });
+});
/**
* @api {get} /verify/:user_id Verify token and apply to existing user
- *
+ *
* @apiName verify
* @apiGroup Referrals
- *
+ *
* @apiPermission member
- *
+ *
* @apiParam {user_id} Current user
* @apiParam {token} Token to validate
*
@@ -165,42 +151,46 @@ router.get(
* {
* "verified": true
* }
- *
+ *
* @apiDescription referral token is updated from 'available' to 'used'
* @apiDescription referral token is updated with existing user_id
*/
-router.get(
- "/verify/:user_id/:token",
- auth,
- async (req, res) => {
- const { user_id, token } = req.params;
+router.get("/verify/:user_id/:token", auth, async (req, res) => {
+ const { user_id, token } = req.params;
- const found = await knex
- .select('status')
- .from('referrals')
- .where('token', 'like', token)
- .whereNull('user_id')
+ const found = await knex
+ .select("status")
+ .from("referrals")
+ .where("token", "like", token)
+ .whereNull("user_id");
- if (found && found.length) {
- if (found[0].status === 'available') {
-
- await knex('referrals')
- .where('token', 'like', token)
- .update({
- status: 'used',
+ if (found && found.length) {
+ if (found[0].status === "available") {
+ await knex("referrals")
+ .where("token", "like", token)
+ .update({
+ status: "used",
user_id: user_id,
- updated_at: new Date().toISOString().substring(0,10)
- })
+ updated_at: new Date().toISOString().substring(0, 10)
+ });
- return res.send({ verified: true, sponsor_id: found.sponsor_id, updated: found.updated_at});
- } else {
- res.code(500).send({ verified: false, message: 'Referral already ' + found[0].status })
- }
+ return res.send({
+ verified: true,
+ sponsor_id: found.sponsor_id,
+ updated: found.updated_at
+ });
} else {
- res.code(500).send('Invalid referral token')
+ res
+ .code(500)
+ .send({
+ verified: false,
+ message: "Referral already " + found[0].status
+ });
}
- })
-
+ } else {
+ res.code(500).send("Invalid referral token");
+ }
+});
/**
* @api {post} /joinQueue Join waiting list (track email & phone)
@@ -217,39 +207,39 @@ router.get(
* "success": true
* "message": 'Added to waiting list'
* }
- *
+ *
* @apiDescription referral token is updated from 'available' to 'used'
* @apiDescription referral token is updated with existing user_id
*/
-router.post(
- "/joinQueue",
- async (req, res) => {
- const { email, phone, user_id } = req.body;
+router.post("/joinQueue", async (req, res) => {
+ const { email, phone, user_id } = req.body;
- await knex.table('waiting_list')
- .insert({
- email: email,
- phone: phone,
- user_id: user_id
- })
+ await knex.table("waiting_list").insert({
+ email: email,
+ phone: phone,
+ user_id: user_id
+ });
- res.send({success: true, message: 'Added ' + email + ' to waiting list ' + phone})
- })
+ res.send({
+ success: true,
+ message: "Added " + email + " to waiting list " + phone
+ });
+});
-router.get(
- "/joinQueue",
- async (req, res) => {
- const {email, phone, user_id} = req.query;
+router.get("/joinQueue", async (req, res) => {
+ const { email, phone, user_id } = req.query;
- await knex('waiting_list')
- .insert({
- email: email,
- phone: phone,
- user_id: user_id
- })
+ await knex("waiting_list").insert({
+ email: email,
+ phone: phone,
+ user_id: user_id
+ });
- res.send({success: true, message: 'Added ' + email + ' to waiting list ' + phone})
- })
+ res.send({
+ success: true,
+ message: "Added " + email + " to waiting list " + phone
+ });
+});
/**
* @api {get} /isReferred/:user_id Check if user is referred
@@ -263,24 +253,22 @@ router.get(
* {
* true
* }
- *
+ *
* @apiDescription returns boolean indicating if user is referred or not
*/
-router.get(
- "/isReferred/:user_id",
- async (req, res) => {
- const { user_id } = req.params;
+router.get("/isReferred/:user_id", async (req, res) => {
+ const { user_id } = req.params;
+
+ var referred = await knex("referrals")
+ .select("referrals.id")
+ .where("user_id", "like", user_id)
+ .where("status", "like", "used");
- var referred = await knex('referrals')
- .select('referrals.id')
- .where('user_id', 'like', user_id)
- .where('status', 'like', 'used')
-
- if (referred && referred.length) {
- res.send({referred: true})
- } else {
- res.send({referred: false})
- }
- })
+ if (referred && referred.length) {
+ res.send({ referred: true });
+ } else {
+ res.send({ referred: false });
+ }
+});
export default router;
diff --git a/routes/swaps.js b/routes/swaps.js
index 31387bec..169c2b8f 100644
--- a/routes/swaps.js
+++ b/routes/swaps.js
@@ -3,11 +3,11 @@ import app from "$app";
import config from "$config";
import { auth, optionalAuth } from "$lib/passport";
import store from "$lib/store";
-import axios from 'axios';
-import crypto from 'crypto';
-import fs from 'fs';
-import getAccount from '../lib/account';
-import { Op, col } from '@sequelize/core';
+import axios from "axios";
+import crypto from "crypto";
+import fs from "fs";
+import getAccount from "../lib/account";
+import { Op, col } from "@sequelize/core";
const shallow = a => {
let b = {};
@@ -335,131 +335,85 @@ const cancel = async (user, id) => {
});
};
-app.delete(
- "/order/:id",
- auth,
- async (req, res) => {
- const { id } = req.params;
- const { user } = req;
+app.delete("/order/:id", auth, async (req, res) => {
+ const { id } = req.params;
+ const { user } = req;
- await cancel(user, id);
- res.send({});
- })
+ await cancel(user, id);
+ res.send({});
+});
-app.post(
- "/orders",
- auth,
- async (req, res) => {
- return res.code(500).send("Trading temporarily disabled");
- const { user } = req;
- try {
- await swap(user, req.body);
- res.send({});
- } catch (e) {
- err(req.user.username, e.message);
- res.code(500).send(e.message);
- }
- })
+app.post("/orders", auth, async (req, res) => {
+ return res.code(500).send("Trading temporarily disabled");
+ const { user } = req;
+ try {
+ await swap(user, req.body);
+ res.send({});
+ } catch (e) {
+ err(req.user.username, e.message);
+ res.code(500).send(e.message);
+ }
+});
-app.get(
- "/orders",
- optionalAuth,
- async (req, res) => {
- try {
- let orders = await db.Order.findAll({
- attributes: {
- include: [
- [col("acc1.asset"), "a1"],
- [col("acc2.asset"), "a2"]
- ]
- },
+app.get("/orders", optionalAuth, async (req, res) => {
+ try {
+ let orders = await db.Order.findAll({
+ attributes: {
include: [
- {
- model: db.Account,
- as: "acc1",
- attributes: []
- },
- {
- model: db.Account,
- as: "acc2",
- attributes: []
- }
+ [col("acc1.asset"), "a1"],
+ [col("acc2.asset"), "a2"]
]
- });
+ },
+ include: [
+ {
+ model: db.Account,
+ as: "acc1",
+ attributes: []
+ },
+ {
+ model: db.Account,
+ as: "acc2",
+ attributes: []
+ }
+ ]
+ });
- res.send(
- orders.map(order => {
- if (order.user_id !== req.user.id) order.user_id = null;
- return order;
- })
- );
- } catch (e) {
- res.code(500).send(e.message);
- }
- })
+ res.send(
+ orders.map(order => {
+ if (order.user_id !== req.user.id) order.user_id = null;
+ return order;
+ })
+ );
+ } catch (e) {
+ res.code(500).send(e.message);
+ }
+});
if (config.maker) {
- debug('setup maker account...')
- config.maker.map(({ amount, c1, c2, currency, askMultiplier, bidMultiplier }) => {
- setInterval(async () => {
- if (!rates) return;
-
- const user = await db.User.findOne({
- where: {
- username: "maker"
- }
- });
-
- if (!user) {
- debug('maker user not defined in database')
- } else {
- debug('maker: ' + JSON.stringify(user))
- await db.transaction(async transaction => {
- let order = await db.Order.findOne(
- {
- where: {
- user_id: user.id,
- "$acc1.asset$": c1,
- "$acc2.asset$": c2,
- accepted: false
- },
- include: [
- {
- model: db.Account,
- as: "acc1"
- },
- {
- model: db.Account,
- as: "acc2"
- }
- ]
- },
- { transaction }
- );
+ debug("setup maker account...");
+ config.maker.map(
+ ({ amount, c1, c2, currency, askMultiplier, bidMultiplier }) => {
+ setInterval(async () => {
+ if (!rates) return;
- let params = {
- a1: c1,
- a2: c2,
- v1: amount * SATS,
- v2: Math.round(
- amount *
- SATS *
- (((app.get("ask") * store.rates[currency]) /
- store.rates["USD"]) *
- askMultiplier)
- )
- };
+ const user = await db.User.findOne({
+ where: {
+ username: "maker"
+ }
+ });
- if (order) {
- let bestBid = await db.Order.findOne(
+ if (!user) {
+ debug("maker user not defined in database");
+ } else {
+ debug("maker: " + JSON.stringify(user));
+ await db.transaction(async transaction => {
+ let order = await db.Order.findOne(
{
where: {
- "$acc1.asset$": c2,
- "$acc2.asset$": c1,
- accepted: false,
- id: {
- [Op.ne]: order.id
- }
+ user_id: user.id,
+ "$acc1.asset$": c1,
+ "$acc2.asset$": c2,
+ accepted: false
},
include: [
{
@@ -470,80 +424,80 @@ if (config.maker) {
model: db.Account,
as: "acc2"
}
- ],
- order: [["rate", "DESC"]],
- limit: 1
+ ]
},
{ transaction }
);
- if (
- !bestBid ||
- (params.v2 / params.v1 > bestBid.rate &&
- order.acc2.balance >= params.v2)
- ) {
- order.v1 = params.v1;
- order.v2 = params.v2;
- await order.save();
- order = order.get({ plain: true });
- order.a1 = params.a1;
- order.a2 = params.a2;
- order.rate = order.v2 / order.v1;
- broadcast("order", shallow(order));
- }
- } else {
- try {
- await swap(user, params);
- } catch (e) {
- warn("Failed to make ask", e.message);
- }
- }
+ let params = {
+ a1: c1,
+ a2: c2,
+ v1: amount * SATS,
+ v2: Math.round(
+ amount *
+ SATS *
+ (((app.get("ask") * store.rates[currency]) /
+ store.rates["USD"]) *
+ askMultiplier)
+ )
+ };
- order = await db.Order.findOne(
- {
- where: {
- user_id: user.id,
- "$acc1.asset$": c2,
- "$acc2.asset$": c1,
- accepted: false
- },
- include: [
+ if (order) {
+ let bestBid = await db.Order.findOne(
{
- model: db.Account,
- as: "acc1"
+ where: {
+ "$acc1.asset$": c2,
+ "$acc2.asset$": c1,
+ accepted: false,
+ id: {
+ [Op.ne]: order.id
+ }
+ },
+ include: [
+ {
+ model: db.Account,
+ as: "acc1"
+ },
+ {
+ model: db.Account,
+ as: "acc2"
+ }
+ ],
+ order: [["rate", "DESC"]],
+ limit: 1
},
- {
- model: db.Account,
- as: "acc2"
- }
- ]
- },
- { transaction }
- );
+ { transaction }
+ );
+ if (
+ !bestBid ||
+ (params.v2 / params.v1 > bestBid.rate &&
+ order.acc2.balance >= params.v2)
+ ) {
+ order.v1 = params.v1;
+ order.v2 = params.v2;
+ await order.save();
+ order = order.get({ plain: true });
+ order.a1 = params.a1;
+ order.a2 = params.a2;
+ order.rate = order.v2 / order.v1;
- params = {
- a1: c2,
- a2: c1,
- v1: Math.round(
- amount *
- SATS *
- ((app.get("bid") * store.rates[currency]) /
- store.rates["USD"]) *
- bidMultiplier
- ),
- v2: amount * SATS
- };
+ broadcast("order", shallow(order));
+ }
+ } else {
+ try {
+ await swap(user, params);
+ } catch (e) {
+ warn("Failed to make ask", e.message);
+ }
+ }
- if (order) {
- let bestAsk = await db.Order.findOne(
+ order = await db.Order.findOne(
{
where: {
- "$acc1.asset$": c1,
- "$acc2.asset$": c2,
- accepted: false,
- id: {
- [Op.ne]: order.id
- }
+ user_id: user.id,
+ "$acc1.asset$": c2,
+ "$acc2.asset$": c1,
+ accepted: false
},
include: [
{
@@ -554,41 +508,80 @@ if (config.maker) {
model: db.Account,
as: "acc2"
}
- ],
- order: [["rate", "ASC"]],
- limit: 1
+ ]
},
- transaction
+ { transaction }
);
- if (bestAsk)
- if (
- !bestAsk ||
- (params.v1 / params.v2 < bestAsk.rate &&
- order.acc1.balance >= params.v1)
- ) {
- order.v1 = params.v1;
- order.v2 = params.v2;
- await order.save();
- order = order.get({ plain: true });
- order.a1 = params.a1;
- order.a2 = params.a2;
- order.rate = order.v2 / order.v1;
+ params = {
+ a1: c2,
+ a2: c1,
+ v1: Math.round(
+ amount *
+ SATS *
+ ((app.get("bid") * store.rates[currency]) /
+ store.rates["USD"]) *
+ bidMultiplier
+ ),
+ v2: amount * SATS
+ };
- broadcast("order", shallow(order));
- } else {
- broadcast("removeOrder", order.id);
- await order.destroy({ transaction });
+ if (order) {
+ let bestAsk = await db.Order.findOne(
+ {
+ where: {
+ "$acc1.asset$": c1,
+ "$acc2.asset$": c2,
+ accepted: false,
+ id: {
+ [Op.ne]: order.id
+ }
+ },
+ include: [
+ {
+ model: db.Account,
+ as: "acc1"
+ },
+ {
+ model: db.Account,
+ as: "acc2"
+ }
+ ],
+ order: [["rate", "ASC"]],
+ limit: 1
+ },
+ transaction
+ );
+
+ if (bestAsk)
+ if (
+ !bestAsk ||
+ (params.v1 / params.v2 < bestAsk.rate &&
+ order.acc1.balance >= params.v1)
+ ) {
+ order.v1 = params.v1;
+ order.v2 = params.v2;
+ await order.save();
+ order = order.get({ plain: true });
+ order.a1 = params.a1;
+ order.a2 = params.a2;
+ order.rate = order.v2 / order.v1;
+
+ broadcast("order", shallow(order));
+ } else {
+ broadcast("removeOrder", order.id);
+ await order.destroy({ transaction });
+ }
+ } else {
+ try {
+ await swap(user, params);
+ } catch (e) {
+ warn("Failed to make bid", e.message);
}
- } else {
- try {
- await swap(user, params);
- } catch (e) {
- warn("Failed to make bid", e.message);
}
- }
- });
- }
- }, 5000);
- });
+ });
+ }
+ }, 5000);
+ }
+ );
}
diff --git a/routes/users.js b/routes/users.js
index ca1f3a02..dd62fad1 100644
--- a/routes/users.js
+++ b/routes/users.js
@@ -10,7 +10,7 @@ import { authenticator } from "otplib";
import getAccount from "$lib/account";
import Sequelize from "@sequelize/core";
import bitcoin from "bitcoinjs-lib";
-import liquid from 'liquidjs-lib';
+import liquid from "liquidjs-lib";
import { fromBase58, fromPrivateKey } from "bip32";
import { Mutex } from "async-mutex";
import bip32 from "bip32";
@@ -387,8 +387,7 @@ app.get("/address", async (req, res) => {
const release = await mutex.acquire();
try {
if (network === "bitcoin") {
- if (!config.bitcoin)
- return res.code(500).send("Bitcoin not configured");
+ if (!config.bitcoin) return res.code(500).send("Bitcoin not configured");
address = await bc.getNewAddress("", type);
store.bcAddressIndex = i + 1;
diff --git a/sampleconfig/index.js b/sampleconfig/index.js
index c843e1e0..e1f55f43 100644
--- a/sampleconfig/index.js
+++ b/sampleconfig/index.js
@@ -6,7 +6,7 @@ const db = {
database: "coinos",
host: "mariadb",
dialect: "mariadb",
- dialectOptions: { multipleStatements: true, timezone: "Etc/GMT+7" },
+ dialectOptions: { multipleStatements: true, timezone: "Etc/GMT+7" }
};
const btcasset =
@@ -17,7 +17,7 @@ module.exports = {
clientVersion: "3b96359d6a6ce68fe4a32f495fc9a6f78af0aa63",
knex: {
client: "mysql2",
- connection: db,
+ connection: db
},
jwt: "secret",
port: 3119,
@@ -32,7 +32,7 @@ module.exports = {
network: "regtest",
port: 18443,
zmqrawblock: "tcp://bitcoin:18506",
- zmqrawtx: "tcp://bitcoin:18507",
+ zmqrawtx: "tcp://bitcoin:18507"
},
liquid: {
masterkey:
@@ -47,14 +47,16 @@ module.exports = {
port: 7040,
zmqrawblock: "tcp://liquid:18606",
zmqrawtx: "tcp://liquid:18607",
- btcasset,
+ btcasset
},
lna: {
lnd: true,
socket: "lnd:10009",
- cert: // get this with: sudo base64 config/lnd/tls.cert | tr -d '\n'
+ // get this with: sudo base64 config/lnd/tls.cert | tr -d '\n'
+ cert:
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNLRENDQWMrZ0F3SUJBZ0lRTzBDWGhna3k0Z1RQZDFYZmxZaWFrekFLQmdncWhrak9QUVFEQWpBNE1SOHcKSFFZRFZRUUtFeFpzYm1RZ1lYVjBiMmRsYm1WeVlYUmxaQ0JqWlhKME1SVXdFd1lEVlFRREV3dzVOelJqWXpVMgpOelF4TkdRd0hoY05NakV3T0RBeU1qRXpOakkyV2hjTk1qSXdPVEkzTWpFek5qSTJXakE0TVI4d0hRWURWUVFLCkV4WnNibVFnWVhWMGIyZGxibVZ5WVhSbFpDQmpaWEowTVJVd0V3WURWUVFERXd3NU56UmpZelUyTnpReE5HUXcKV1RBVEJnY3Foa2pPUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVE5bFM5ODlxNklzamJKTkQ1TW14eko1dnpzdGp4bgpUMFVyMitpaC9ZS1NQTlJSNFFKSzAvSk9pR1lzL3pPbGJTRDRxSGg2QlRyQmdMd0FxUDY3ZGh0bG80RzZNSUczCk1BNEdBMVVkRHdFQi93UUVBd0lDcERBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQjBHQTFVZERnUVdCQlE3M2s3ZXNpTXlHNW1NTTFMRjkzM3IwNG4valRCZ0JnTlZIUkVFV1RCWApnZ3c1TnpSall6VTJOelF4TkdTQ0NXeHZZMkZzYUc5emRJSURiRzVrZ2dSMWJtbDRnZ3AxYm1sNGNHRmphMlYwCmdnZGlkV1pqYjI1dWh3Ui9BQUFCaHhBQUFBQUFBQUFBQUFBQUFBQUFBQUFCaHdTc0hBQUhNQW9HQ0NxR1NNNDkKQkFNQ0EwY0FNRVFDSUFjUVdJd3YrVEkvT2NYZVpRNU1yQm5kQjFtWUQzWFEyU3E1VE5ISnkrTWZBaUF1RlEvNQpNT2pqWWdlN0hZd0gvQmwzb0ZKWWFTUUJEcVFRWE9YVkhDN3JZUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
- macaroon: // get this with: sudo base64 config/lnd/data/chain/bitcoin/regtest/admin.macaroon | tr -d '\n'
- "AgEDbG5kAvgBAwoQ7uOeHFozqNAvezu2+4G29hIBMBoWCgdhZGRyZXNzEgRyZWFkEgV3cml0ZRoTCgRpbmZvEgRyZWFkEgV3cml0ZRoXCghpbnZvaWNlcxIEcmVhZBIFd3JpdGUaIQoIbWFjYXJvb24SCGdlbmVyYXRlEgRyZWFkEgV3cml0ZRoWCgdtZXNzYWdlEgRyZWFkEgV3cml0ZRoXCghvZmZjaGFpbhIEcmVhZBIFd3JpdGUaFgoHb25jaGFpbhIEcmVhZBIFd3JpdGUaFAoFcGVlcnMSBHJlYWQSBXdyaXRlGhgKBnNpZ25lchIIZ2VuZXJhdGUSBHJlYWQAAAYgOcqQGlllETS4FikFxk9X33ZgAi4kowVw9Ze2IcVnfHo=",
- },
+ // get this with: sudo base64 config/lnd/data/chain/bitcoin/regtest/admin.macaroon | tr -d '\n'
+ macaroon:
+ "AgEDbG5kAvgBAwoQ7uOeHFozqNAvezu2+4G29hIBMBoWCgdhZGRyZXNzEgRyZWFkEgV3cml0ZRoTCgRpbmZvEgRyZWFkEgV3cml0ZRoXCghpbnZvaWNlcxIEcmVhZBIFd3JpdGUaIQoIbWFjYXJvb24SCGdlbmVyYXRlEgRyZWFkEgV3cml0ZRoWCgdtZXNzYWdlEgRyZWFkEgV3cml0ZRoXCghvZmZjaGFpbhIEcmVhZBIFd3JpdGUaFgoHb25jaGFpbhIEcmVhZBIFd3JpdGUaFAoFcGVlcnMSBHJlYWQSBXdyaXRlGhgKBnNpZ25lchIIZ2VuZXJhdGUSBHJlYWQAAAYgOcqQGlllETS4FikFxk9X33ZgAi4kowVw9Ze2IcVnfHo="
+ }
};
diff --git a/sampleconfig/knexfile.js b/sampleconfig/knexfile.js
index 4df78b84..68c933a3 100644
--- a/sampleconfig/knexfile.js
+++ b/sampleconfig/knexfile.js
@@ -2,16 +2,16 @@
module.exports = {
development: {
- client: 'mysql2',
+ client: "mysql2",
connection: {
- host: 'mariadb',
- database: 'coinos',
- user: 'root',
- password: 'password'
+ host: "mariadb",
+ database: "coinos",
+ user: "root",
+ password: "password"
},
migrations: {
- tableName: 'migrations',
- directory: 'migrations'
+ tableName: "migrations",
+ directory: "migrations"
}
- },
+ }
};
diff --git a/scripts/apiParse.js b/scripts/apiParse.js
index f13f1943..ec2a33c1 100644
--- a/scripts/apiParse.js
+++ b/scripts/apiParse.js
@@ -1,34 +1,46 @@
-export const addUserSearch = function (input, table) {
- var {search, starts_with, contains} = input
+export const addUserSearch = function(input, table) {
+ var { search, starts_with, contains } = input;
- if (!table) { table = 'users' }
+ if (!table) {
+ table = "users";
+ }
// if (since) cmd = cmd.havingRaw('invoices + payments + deposits + orders > ?', [0])
if (search) {
if (starts_with) {
- search = search + '%'
+ search = search + "%";
} else if (contains) {
- search = '%' + search + '%'
+ search = "%" + search + "%";
}
- var condition = "(" + table + ".email like '" + search + "' OR " + table + ".username like '" + search + "')"
+ var condition =
+ "(" +
+ table +
+ ".email like '" +
+ search +
+ "' OR " +
+ table +
+ ".username like '" +
+ search +
+ "')";
- return condition
+ return condition;
} else {
- return ''
+ return "";
+ }
+};
+
+export const addTimeSearch = function(input, field) {
+ if (!field) {
+ field = "updatedAt";
}
-}
-export const addTimeSearch = function (input, field) {
- if (!field) { field = 'updatedAt' }
-
- var {since} = input
+ var { since } = input;
if (since) {
- condition = field + " >= '" + since + "'"
+ condition = field + " >= '" + since + "'";
- return condition
+ return condition;
} else {
- return ''
+ return "";
}
-}
-
+};
diff --git a/scripts/check.js b/scripts/check.js
index f14a313a..e86940da 100644
--- a/scripts/check.js
+++ b/scripts/check.js
@@ -1,22 +1,24 @@
-let config = require('./config');
-let fs = require('fs');
+let config = require("./config");
+let fs = require("fs");
+
+let mailgun = require("mailgun-js")({
+ apiKey: config.mailgun,
+ domain: config.domain
+});
-let mailgun = require('mailgun-js')({apiKey: config.mailgun, domain: config.domain });
-
let data = {
...config.mail,
- subject: 'User Documents',
- text: 'Documents uploaded',
+ subject: "User Documents",
+ text: "Documents uploaded"
};
-fs.readdir('./uploads', (err, files) => {
+fs.readdir("./uploads", (err, files) => {
files.forEach(file => {
console.log(file);
data.text = file;
- fs.rename(file, '../verified' + file);
- mailgun.messages().send(data, function (error, body) {
+ fs.rename(file, "../verified" + file);
+ mailgun.messages().send(data, function(error, body) {
console.log(body);
});
});
});
-