mirror of
https://github.com/FJurmanovic/wallet-web.git
synced 2026-02-06 06:08:10 +00:00
added catalyst library
This commit is contained in:
16
.babelrc
16
.babelrc
@@ -16,6 +16,22 @@
|
|||||||
{
|
{
|
||||||
"loose": true
|
"loose": true
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"module-resolver",
|
||||||
|
{
|
||||||
|
"root": [
|
||||||
|
"."
|
||||||
|
],
|
||||||
|
"alias": {
|
||||||
|
"core": "./src/core",
|
||||||
|
"common": "./src/common",
|
||||||
|
"components": "./src/components",
|
||||||
|
"pages": "./src/pages",
|
||||||
|
"configs": "./src/configs",
|
||||||
|
"services": "./src/services"
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,10 @@
|
|||||||
"@babel/plugin-proposal-object-rest-spread": "^7.14.2",
|
"@babel/plugin-proposal-object-rest-spread": "^7.14.2",
|
||||||
"@babel/preset-env": "^7.14.2",
|
"@babel/preset-env": "^7.14.2",
|
||||||
"@babel/preset-typescript": "^7.13.0",
|
"@babel/preset-typescript": "^7.13.0",
|
||||||
|
"@github/catalyst": "^1.1.3",
|
||||||
|
"@github/jtml": "^0.4.0",
|
||||||
"babel-loader": "^8.2.2",
|
"babel-loader": "^8.2.2",
|
||||||
|
"babel-plugin-module-resolver": "^4.1.0",
|
||||||
"babel-polyfill": "^6.26.0",
|
"babel-polyfill": "^6.26.0",
|
||||||
"connect-history-api-fallback": "^1.6.0",
|
"connect-history-api-fallback": "^1.6.0",
|
||||||
"html-webpack-plugin": "^5.3.1",
|
"html-webpack-plugin": "^5.3.1",
|
||||||
|
|||||||
@@ -104,8 +104,11 @@ function resolveUrl(url: string, path: string): string {
|
|||||||
if (path.includes("http") || path.includes("://")) {
|
if (path.includes("http") || path.includes("://")) {
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
const fixedPath = path.split("/").join("/");
|
const fixedPath = path
|
||||||
const urlWithPath = `${url.endsWith("/") ? url : `${url}/`}${path}`;
|
.split("/")
|
||||||
|
.filter((i) => i)
|
||||||
|
.join("/");
|
||||||
|
const urlWithPath = `${url.endsWith("/") ? url : `${url}/`}${fixedPath}`;
|
||||||
return urlWithPath;
|
return urlWithPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
15
src/core/utils/closest-deco.ts
Normal file
15
src/core/utils/closest-deco.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { toKebabCase } from "core/utils";
|
||||||
|
|
||||||
|
export default function closest(proto: Object, key: string): Object {
|
||||||
|
const kebab: string = toKebabCase(key);
|
||||||
|
return Object.defineProperty(proto, key, {
|
||||||
|
configurable: true,
|
||||||
|
get() {
|
||||||
|
return findClosest(this, kebab);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function findClosest(element: HTMLElement, key: string) {
|
||||||
|
return element.closest(key);
|
||||||
|
}
|
||||||
8
src/core/utils/index-deco.ts
Normal file
8
src/core/utils/index-deco.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export default function index(proto: Object, key: string): Object {
|
||||||
|
return Object.defineProperty(proto, key, {
|
||||||
|
configurable: true,
|
||||||
|
get() {
|
||||||
|
return Array.from(this.parentNode.children).indexOf(this);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
5
src/core/utils/index.ts
Normal file
5
src/core/utils/index.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export { default as toKebabCase } from "./toKebabCase";
|
||||||
|
export { default as update } from "./update-deco";
|
||||||
|
export { default as index } from "./index-deco";
|
||||||
|
export { default as closest } from "./closest-deco";
|
||||||
|
export { default as isTrue } from "./isTrue";
|
||||||
3
src/core/utils/isTrue.ts
Normal file
3
src/core/utils/isTrue.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export default function isTrue(bool: string) {
|
||||||
|
return bool === "true";
|
||||||
|
}
|
||||||
6
src/core/utils/toKebabCase.ts
Normal file
6
src/core/utils/toKebabCase.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export default function toKebabCase(text: string) {
|
||||||
|
return text
|
||||||
|
.replace(/([a-z])([A-Z])/g, "$1-$2")
|
||||||
|
.replace(/\s+/g, "-")
|
||||||
|
.toLowerCase();
|
||||||
|
}
|
||||||
8
src/core/utils/update-deco.ts
Normal file
8
src/core/utils/update-deco.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export default function update(proto: any, key?: string, dir?: any) {
|
||||||
|
const method = dir.value!;
|
||||||
|
dir.value = function () {
|
||||||
|
const _return = method.apply(this, arguments);
|
||||||
|
if (proto.update) proto.update.call(this);
|
||||||
|
return _return;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,3 +1 @@
|
|||||||
const main = document.querySelector("app-main");
|
import "pages";
|
||||||
|
|
||||||
if (main) main.innerHTML = "Works";
|
|
||||||
|
|||||||
32
src/pages/home/Home.ts
Normal file
32
src/pages/home/Home.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { attr, targets, controller, target } from "@github/catalyst";
|
||||||
|
import { closest, index, update, isTrue } from "core/utils";
|
||||||
|
import { html, render, until } from "@github/jtml";
|
||||||
|
import { PingService } from "services";
|
||||||
|
|
||||||
|
@controller
|
||||||
|
class AppMainElement extends HTMLElement {
|
||||||
|
private pingService: PingService;
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.pingService = new PingService();
|
||||||
|
}
|
||||||
|
@update
|
||||||
|
connectedCallback() {}
|
||||||
|
|
||||||
|
getPong = async () => {
|
||||||
|
try {
|
||||||
|
const response = await this.pingService.getAll();
|
||||||
|
return response.api;
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
pongEl = () => {
|
||||||
|
return html`<div>${until(this.getPong())}</div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
update() {
|
||||||
|
render(html`${this.pongEl()}`, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from "./home/Home";
|
||||||
|
|||||||
9
src/services/PingService.ts
Normal file
9
src/services/PingService.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { BaseService } from "core/services";
|
||||||
|
|
||||||
|
class PingService extends BaseService {
|
||||||
|
constructor() {
|
||||||
|
super("/api");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PingService;
|
||||||
1
src/services/index.ts
Normal file
1
src/services/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { default as PingService } from "./PingService";
|
||||||
@@ -29,6 +29,9 @@
|
|||||||
"pages*": [
|
"pages*": [
|
||||||
"src/pages*"
|
"src/pages*"
|
||||||
],
|
],
|
||||||
|
"services*": [
|
||||||
|
"src/services*"
|
||||||
|
],
|
||||||
"@src*": [
|
"@src*": [
|
||||||
"src*"
|
"src*"
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ const alias = {
|
|||||||
core: path.resolve(__dirname, '/core'),
|
core: path.resolve(__dirname, '/core'),
|
||||||
configs: path.resolve(__dirname, '/configs'),
|
configs: path.resolve(__dirname, '/configs'),
|
||||||
components: path.resolve(__dirname, '/components'),
|
components: path.resolve(__dirname, '/components'),
|
||||||
pages: path.resolve(__dirname, '/pages')
|
pages: path.resolve(__dirname, '/pages'),
|
||||||
|
services: path.resolve(__dirname, '/services')
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
@@ -47,6 +48,12 @@ module.exports = {
|
|||||||
loader: 'babel-loader'
|
loader: 'babel-loader'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
test: /\.m?js/,
|
||||||
|
resolve: {
|
||||||
|
fullySpecified: false
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
|
|||||||
57
yarn.lock
57
yarn.lock
@@ -914,6 +914,23 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d"
|
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d"
|
||||||
integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==
|
integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==
|
||||||
|
|
||||||
|
"@github/catalyst@^1.1.3":
|
||||||
|
version "1.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@github/catalyst/-/catalyst-1.1.3.tgz#852311b3097927ef594a77041472ad6e3ae46c7d"
|
||||||
|
integrity sha512-GHacM4STeyWTBosHFZlKbcIgFZ8PztEXJ7kAdxEoQG+Fb9kkQ+GVSFZYcFsqQkjyy49mNVfofiiLnJiWO8y5MA==
|
||||||
|
|
||||||
|
"@github/jtml@^0.4.0":
|
||||||
|
version "0.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@github/jtml/-/jtml-0.4.0.tgz#67afe0c3570dea800725970f931373ef71ccee52"
|
||||||
|
integrity sha512-749dmX5totDaFnRkr3gTCz9cIswRf4BgN1G1skyYx7MZHoYS+5qvCXTep0gae4YxX6N28EnS3vZvD8pYvyLI7w==
|
||||||
|
dependencies:
|
||||||
|
"@github/template-parts" "^0.3.0"
|
||||||
|
|
||||||
|
"@github/template-parts@^0.3.0":
|
||||||
|
version "0.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@github/template-parts/-/template-parts-0.3.2.tgz#2b286983e7e8fe677de93d27078ea615d655e7bd"
|
||||||
|
integrity sha512-ErF88+S6rV0DRnXgs7cv2K/FGiYyipWKUZtGewfWz/8Dbddw0B5wXvZa0Ebph8ptcvYcAzDqSxy7AHCREX4xbw==
|
||||||
|
|
||||||
"@types/eslint-scope@^3.7.0":
|
"@types/eslint-scope@^3.7.0":
|
||||||
version "3.7.0"
|
version "3.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86"
|
resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86"
|
||||||
@@ -1265,6 +1282,17 @@ babel-plugin-dynamic-import-node@^2.3.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
object.assign "^4.1.0"
|
object.assign "^4.1.0"
|
||||||
|
|
||||||
|
babel-plugin-module-resolver@^4.1.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2"
|
||||||
|
integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==
|
||||||
|
dependencies:
|
||||||
|
find-babel-config "^1.2.0"
|
||||||
|
glob "^7.1.6"
|
||||||
|
pkg-up "^3.1.0"
|
||||||
|
reselect "^4.0.0"
|
||||||
|
resolve "^1.13.1"
|
||||||
|
|
||||||
babel-plugin-polyfill-corejs2@^0.2.0:
|
babel-plugin-polyfill-corejs2@^0.2.0:
|
||||||
version "0.2.2"
|
version "0.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327"
|
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327"
|
||||||
@@ -2176,6 +2204,14 @@ finalhandler@~1.1.2:
|
|||||||
statuses "~1.5.0"
|
statuses "~1.5.0"
|
||||||
unpipe "~1.0.0"
|
unpipe "~1.0.0"
|
||||||
|
|
||||||
|
find-babel-config@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2"
|
||||||
|
integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==
|
||||||
|
dependencies:
|
||||||
|
json5 "^0.5.1"
|
||||||
|
path-exists "^3.0.0"
|
||||||
|
|
||||||
find-cache-dir@^3.3.1:
|
find-cache-dir@^3.3.1:
|
||||||
version "3.3.1"
|
version "3.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
|
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
|
||||||
@@ -2294,7 +2330,7 @@ glob-to-regexp@^0.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
|
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
|
||||||
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
|
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
|
||||||
|
|
||||||
glob@^7.0.3, glob@^7.1.3:
|
glob@^7.0.3, glob@^7.1.3, glob@^7.1.6:
|
||||||
version "7.1.7"
|
version "7.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
|
||||||
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
|
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
|
||||||
@@ -2816,6 +2852,11 @@ json3@^3.3.3:
|
|||||||
resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
|
resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
|
||||||
integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
|
integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
|
||||||
|
|
||||||
|
json5@^0.5.1:
|
||||||
|
version "0.5.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
|
||||||
|
integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
|
||||||
|
|
||||||
json5@^1.0.1:
|
json5@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
|
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
|
||||||
@@ -3409,6 +3450,13 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
find-up "^4.0.0"
|
find-up "^4.0.0"
|
||||||
|
|
||||||
|
pkg-up@^3.1.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
|
||||||
|
integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
|
||||||
|
dependencies:
|
||||||
|
find-up "^3.0.0"
|
||||||
|
|
||||||
portfinder@^1.0.26:
|
portfinder@^1.0.26:
|
||||||
version "1.0.28"
|
version "1.0.28"
|
||||||
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
|
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
|
||||||
@@ -3662,6 +3710,11 @@ requires-port@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
|
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
|
||||||
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
|
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
|
||||||
|
|
||||||
|
reselect@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
|
||||||
|
integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==
|
||||||
|
|
||||||
resolve-cwd@^2.0.0:
|
resolve-cwd@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
|
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
|
||||||
@@ -3691,7 +3744,7 @@ resolve-url@^0.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
||||||
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
|
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
|
||||||
|
|
||||||
resolve@^1.14.2, resolve@^1.9.0:
|
resolve@^1.13.1, resolve@^1.14.2, resolve@^1.9.0:
|
||||||
version "1.20.0"
|
version "1.20.0"
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
||||||
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
|
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
|
||||||
|
|||||||
Reference in New Issue
Block a user