Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Extensions login page #1748

Open
wants to merge 143 commits into
base: svg-position-preserve
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
143 commits
Select commit Hold shift + click to select a range
2b0318f
lab/text: add with/without word wrap option to # of lines block (#1497)
AshimeeAlt Jun 9, 2024
af35fb4
New extension: Vibration (#1509)
PwLDev Jun 9, 2024
e1b9fd9
Image update batch (#1518)
GarboMuffin Jun 9, 2024
953a0ed
CubesterYT/KeySimulation: Update images (#1519)
GarboMuffin Jun 9, 2024
a09a5e3
Xeltalliv/simple3D: conetxt --> context (#1521)
Jun 9, 2024
9e789d5
build(deps): bump adm-zip from 0.5.13 to 0.5.14 (#1524)
dependabot[bot] Jun 10, 2024
1315db4
build(deps-dev): bump prettier from 3.3.0 to 3.3.1 (#1525)
dependabot[bot] Jun 10, 2024
823b884
lab/text: reflow if needed in getLinesV2 (#1529)
GarboMuffin Jun 10, 2024
b4721f4
Add translations to more extensions (#1526)
qxsck Jun 10, 2024
38115fe
PwLDev/vibration: Vibration pattern block (#1522)
DNin01 Jun 11, 2024
665a8f2
NexusKitten/controlcontrols: Highlight block (#1532)
DNin01 Jun 11, 2024
22928f9
NexusKitten/controlcontrols: remove revert-layer (#1533)
GarboMuffin Jun 11, 2024
24cff03
Lily/SoundExpanded: fix set volume and start looping w/ start (#1534)
GarboMuffin Jun 11, 2024
bf8dc87
Lily/MoreEvents: don't translate an unused menu (#1535)
GarboMuffin Jun 11, 2024
eb7df9e
Lily/AllMenus: hide unused More Events menu and XML escape (#1537)
GarboMuffin Jun 11, 2024
bd8777f
A lot of text style fixes and translations (#1540)
CubesterYT Jun 14, 2024
accfb29
NOname-awa/cn-number: translate (#1543)
GarboMuffin Jun 14, 2024
bb6b39f
Fix mistake (#1544)
CubesterYT Jun 14, 2024
576c3aa
veggiecan/browserfullscreen: no-op if no change will occur (#1545)
veggiecan0419 Jun 14, 2024
2b918d9
build(deps-dev): bump prettier from 3.3.1 to 3.3.2 (#1547)
dependabot[bot] Jun 17, 2024
7f48963
build(deps-dev): bump eslint from 9.4.0 to 9.5.0 (#1548)
dependabot[bot] Jun 17, 2024
60d8a9b
NexusKitten/sgrab: remove icon (#1550)
GarboMuffin Jun 18, 2024
32befa2
XmerOriginals/closecontrol: add credit link (#1552)
xmeroriginals Jun 18, 2024
d7df8c3
Update translations (#1558)
GarboMuffin Jun 21, 2024
38be121
Use prefixed fullscreen methods (#1559)
GarboMuffin Jun 21, 2024
9a0c594
mdwalters/notifications: Fix permission denied handling (#1561)
GarboMuffin Jun 22, 2024
68dcb60
penplus: fix description (#1563)
qxsck Jun 23, 2024
3103e09
Migrate to ESM (#1564)
GarboMuffin Jun 23, 2024
be07919
SharkPool/Font-Manager: I dont go by ashime anymore. (#1565)
yuri-kiss Jun 23, 2024
61fd6a3
Add BSD-3-Clause to licenses (#1567)
DNin01 Jun 25, 2024
ae0ac9d
obviousAlexC/penPlus: Add name to "saveShader" event (#1575)
David-Orangemoon Jun 28, 2024
2a429db
Revert "Migrate to esm" (#1574)
GarboMuffin Jul 1, 2024
48faa26
build(deps-dev): bump eslint from 9.5.0 to 9.6.0 (#1577)
dependabot[bot] Jul 1, 2024
7d4ba64
obviousAlexC/penPlus: Update example project (#1579)
David-Orangemoon Jul 2, 2024
034d737
Xeltalliv/simple3D: add button to extra resources and improve sample …
Xeltalliv Jul 7, 2024
7bf116c
build(deps-dev): bump prettier from 3.3.2 to 3.3.3 (#1610)
dependabot[bot] Jul 15, 2024
d856f70
build(deps-dev): bump eslint from 9.6.0 to 9.7.0 (#1612)
dependabot[bot] Jul 15, 2024
f8b6e63
build(deps-dev): bump esquery from 1.5.0 to 1.6.0 (#1611)
dependabot[bot] Jul 15, 2024
8f734af
Update translations (#1616)
GarboMuffin Jul 16, 2024
3a59915
obviousAlexC/penPlus: Make uniforms searching specify that it has to …
David-Orangemoon Jul 18, 2024
8f48237
Xeltalliv/simple3D: Feature update v1.1.0 (#1618)
Xeltalliv Jul 20, 2024
8541c95
XmerOriginals/closecontrol: new image (#1621)
GarboMuffin Jul 23, 2024
d916741
New extension: steamworks (#1622)
GarboMuffin Jul 26, 2024
a2a57c8
steamworks: docs update (#1626)
GarboMuffin Jul 26, 2024
44e16e8
build(deps-dev): bump eslint from 9.7.0 to 9.8.0 (#1627)
dependabot[bot] Jul 27, 2024
aa22053
build(deps): bump @turbowarp/scratchblocks from 3.6.4 to 3.6.5 (#1628)
dependabot[bot] Jul 27, 2024
8dffc0d
steamworks: docs update 2 (#1630)
GarboMuffin Jul 28, 2024
aee8630
cst1229/zip: expose extension object (#1631)
CST1229 Jul 28, 2024
44ad6f2
Lily/LooksPlus: Optimize restore content block (#1638)
GarboMuffin Aug 5, 2024
eafceab
encoding: Fix unicode base64 encode/decode (#1599)
Procybit Aug 5, 2024
3ce22a6
Skyhigh173/JSON: fix json_is_valid() (#1596)
Procybit Aug 5, 2024
ea67bd8
Update translations (#1641)
GarboMuffin Aug 5, 2024
532daff
Lily/Video: clamp volume, add screenshot at current time (#1595)
SharkPool-SP Aug 6, 2024
dfb5354
Lily/Video: playback rate (#1642)
GarboMuffin Aug 6, 2024
23e5c1a
Lily/Assets: fix addCostume corruption (#1643)
GarboMuffin Aug 6, 2024
5499be0
vercte/dictionaries: Always Cast Keys to Strings (#1644)
SharkPool-SP Aug 10, 2024
d228f60
mbw/xml: fix bugs, add inner HTML blocks (#1647)
mybearworld Aug 13, 2024
ee34483
build(deps-dev): bump eslint from 9.8.0 to 9.9.0 (#1646)
dependabot[bot] Aug 19, 2024
9edfed5
build(deps): bump adm-zip from 0.5.14 to 0.5.15 (#1645)
dependabot[bot] Aug 19, 2024
263033c
Xeltalliv/clippingblending: Fix compatibility with instanced pen rend…
Xeltalliv Aug 21, 2024
f0d4e9e
build(deps-dev): bump eslint from 9.9.0 to 9.9.1 (#1659)
dependabot[bot] Aug 26, 2024
2646607
build(deps): bump adm-zip from 0.5.15 to 0.5.16 (#1668)
dependabot[bot] Sep 2, 2024
8f81856
veggiecan/LongmanDictionary: fix all defs returning array instead of …
GarboMuffin Sep 7, 2024
a834058
Lily/Video: fix videos rendering as pure black (#1692)
GarboMuffin Sep 20, 2024
7e91056
build(deps-dev): bump eslint from 9.9.1 to 9.12.0 (#1713)
dependabot[bot] Oct 7, 2024
d689cbc
build(deps): bump express from 4.19.2 to 4.21.0 (#1687)
dependabot[bot] Oct 7, 2024
363e5fb
Lily/Skins: fix `delete all skins` not deleting the renderer skins (#…
CST1229 Oct 11, 2024
d21f029
build(deps): bump express from 4.21.0 to 4.21.1 (#1722)
dependabot[bot] Oct 14, 2024
b58a62e
Revert "fix: downloadBlob isn't working properly on some old browsers…
FurryR Oct 14, 2024
33afff0
Edit some paragraphs on the homepage (#1660)
DNin01 Oct 14, 2024
93983a2
Lily/ClonesPlus, Lily/LooksPlus, Skyhigh173/json: editingTarget can b…
GarboMuffin Oct 16, 2024
5c91389
Update GitHub Actions workflows (#1728)
GarboMuffin Oct 16, 2024
63377ee
obviousAlexC/newgroundsIO: Cast medalID inputs for medal arguments (#…
JeremyGamer13 Oct 23, 2024
3e970f2
Update translations (#1734)
GarboMuffin Oct 26, 2024
f3ac83b
build(deps-dev): bump eslint from 9.12.0 to 9.13.0 (#1730)
dependabot[bot] Nov 2, 2024
0e127cf
Lily/lmsutils: fix != <= >= (#1739)
GarboMuffin Nov 2, 2024
2e9eb5a
Xeltalliv/simple3D: Feature update v1.2.0 (#1738)
Xeltalliv Nov 2, 2024
399a894
Update chokidar to v4 (#1740)
GarboMuffin Nov 2, 2024
c8c2a10
XeroName/Deltatime: don't report delta time of 0 (#1741)
GarboMuffin Nov 2, 2024
b89f305
Add links for qxsck & Skyhigh173 (#1742)
GarboMuffin Nov 3, 2024
8d1adfc
build(deps-dev): bump eslint from 9.13.0 to 9.14.0 (#1744)
dependabot[bot] Nov 3, 2024
5daee2d
build(deps): bump @turbowarp/types from `da53338` to `1f85881` (#1743)
dependabot[bot] Nov 3, 2024
fedbe62
SharkPool/Font-Manager: updates (#1745)
GarboMuffin Nov 3, 2024
079c8a0
Create tsete.txt
Eaielectronic Nov 5, 2024
8192690
Add files via upload
Eaielectronic Nov 5, 2024
e08a5de
Delete extensions/Eaielectronic/tsete.txt
Eaielectronic Nov 5, 2024
62452cd
Rename Finger mutli-mobile to Finger-mutli-mobile.js
Eaielectronic Nov 5, 2024
c418acf
Rename Fps-returne to Fps-returne.js
Eaielectronic Nov 5, 2024
ef61a2e
Rename Login page to Login-page.js
Eaielectronic Nov 5, 2024
48d84fb
Update Login-page.js
Eaielectronic Nov 5, 2024
42ad742
Update ScrollingTextBubble.js
Eaielectronic Nov 5, 2024
a73cd31
Update Login-page.js
Eaielectronic Nov 5, 2024
c854e96
Update Fps-returne.js
Eaielectronic Nov 5, 2024
a5e821f
Update Finger-mutli-mobile.js
Eaielectronic Nov 5, 2024
1e0a04b
Update Finger-mutli-mobile.js
Eaielectronic Nov 5, 2024
43330b3
Update Fps-returne.js
Eaielectronic Nov 5, 2024
fc3218e
Update Login-page.js
Eaielectronic Nov 5, 2024
17a62a5
Update ScrollingTextBubble.js
Eaielectronic Nov 5, 2024
34ba4b1
Create teste.txt
Eaielectronic Nov 5, 2024
32f7557
Create teste
Eaielectronic Nov 5, 2024
e8782c4
Add files via upload
Eaielectronic Nov 5, 2024
c7d180d
Delete images/Eaielectronic/Finger-mutli-mobile.svg
Eaielectronic Nov 5, 2024
211311d
Delete images/Eaielectronic/Finger-mutli-mobile2.svg
Eaielectronic Nov 5, 2024
09d0c3e
Delete images/Eaielectronic/teste
Eaielectronic Nov 5, 2024
a0e03c0
Delete images/Eaielectronic/teste.txt
Eaielectronic Nov 5, 2024
3907f16
Add files via upload
Eaielectronic Nov 5, 2024
ae418c5
Delete images/Eaielectronic/Finger-mutli-mobile2.svg
Eaielectronic Nov 5, 2024
b786216
Add files via upload
Eaielectronic Nov 5, 2024
aa36118
Update ScrollingTextBubble.js.svg
Eaielectronic Nov 5, 2024
d6f8ba3
Update Login-page.svg
Eaielectronic Nov 5, 2024
84f3ba2
Update Finger-mutli-mobile.svg
Eaielectronic Nov 5, 2024
a60c18c
Delete images/Eaielectronic/ScrollingTextBubble.js.svg
Eaielectronic Nov 5, 2024
acf6920
Delete images/Eaielectronic/Login-page.svg
Eaielectronic Nov 5, 2024
b4151aa
Add files via upload
Eaielectronic Nov 5, 2024
f4531fc
Update Fps-returne.js
Eaielectronic Nov 5, 2024
bdb3d5d
Update Login-page.js
Eaielectronic Nov 5, 2024
b2a48bc
Update ScrollingTextBubble.js
Eaielectronic Nov 5, 2024
77cc15c
Update ScrollingTextBubble.js
Eaielectronic Nov 5, 2024
c9d1d4d
Update ScrollingTextBubble.js
Eaielectronic Nov 5, 2024
5b74dc3
apply prettier
Eaielectronic Nov 6, 2024
ec2287e
apply
Eaielectronic Nov 6, 2024
2fc3281
Create SDFV
Eaielectronic Nov 6, 2024
f1771b9
Delete extensions/Eaieletronic/SDFV
Eaielectronic Nov 6, 2024
2429b90
Delete extensions/Eaieletronic/Login-page.js
Eaielectronic Nov 6, 2024
a2bf417
Add files via upload
Eaielectronic Nov 6, 2024
6574b9e
Delete extensions/Finger-mutli-mobile.js
Eaielectronic Nov 6, 2024
0b55c1f
Add files via upload
Eaielectronic Nov 6, 2024
6c494a0
Rename extensions/Login-page.js to extensions/Eaielectronic/Login-pag…
Eaielectronic Nov 6, 2024
3a31f4a
Delete extensions/Eaielectronic/Login-page.js
Eaielectronic Nov 6, 2024
22b2f62
Add files via upload
Eaielectronic Nov 6, 2024
5b75bf9
Rename extensions/Login-page.js to extensions/Eaielectronic/Login-pag…
Eaielectronic Nov 6, 2024
d7c9317
Create z
Eaielectronic Nov 6, 2024
de92d56
Delete extensions/Eaielectronic/Login-page.js
Eaielectronic Nov 6, 2024
163a8ab
Add files via upload
Eaielectronic Nov 6, 2024
eaba16d
Delete extensions/Eaielectronic/z
Eaielectronic Nov 6, 2024
e1f722d
Delete extensions/Lily/Assets.js
Eaielectronic Nov 6, 2024
29e6b49
Add files via upload
Eaielectronic Nov 6, 2024
2fa6820
Create d
Eaielectronic Nov 6, 2024
512aee0
Delete extensions/Eaielectronic/d
Eaielectronic Nov 6, 2024
e37f010
Delete extensions/Lily/Assets.js
Eaielectronic Nov 6, 2024
1a09b06
Add files via upload
Eaielectronic Nov 6, 2024
a99f256
Update Login-page.js
Eaielectronic Nov 7, 2024
cb61dea
Update Login-page.js
Eaielectronic Nov 7, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
- name: Build for production
run: npm run build
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
uses: actions/upload-pages-artifact@v3
with:
path: ./build/

Expand All @@ -42,4 +42,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
uses: actions/deploy-pages@v4
278 changes: 278 additions & 0 deletions extensions/Eaielectronic/Login-page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,278 @@
// Name: Login
// ID: usermanagement
// Description: Allows you to create login forms.
// By: Eaielectronic
// By: SERPENT1867 <https://scratch.mit.edu/users/serpent1867/>
// License: MPL-2.0
(function (Scratch) {
"use strict";
class UserManagement {
constructor() {
this.users = [];
this.username = "";
this.password = "";
this.email = "";
this.turbowarp = ""; // Variable for the form state
}

getInfo() {
return {
id: "usermanagement",
name: "User Management",
color1: "#ff3f00",
blocks: [
{
opcode: "openForm",
blockType: Scratch.BlockType.COMMAND,
text: "open form for [ACTION]",
arguments: {
ACTION: {
type: Scratch.ArgumentType.STRING,
menu: "actionsMenu",
defaultValue: "login",
},
},
},
{
opcode: "hideForm",
blockType: Scratch.BlockType.COMMAND,
text: "hide form",
},
{
opcode: "getUsername",
blockType: Scratch.BlockType.REPORTER,
text: "username",
},
{
opcode: "getPassword",
blockType: Scratch.BlockType.REPORTER,
text: "password",
},
{
opcode: "getEmail",
blockType: Scratch.BlockType.REPORTER,
text: "email",
},
{
opcode: "getFormState",
blockType: Scratch.BlockType.REPORTER,
text: "form state",
},
{
opcode: "clear",
blockType: Scratch.BlockType.COMMAND,
text: "clear values",
},
],
menus: {
actionsMenu: {
items: ["login", "create account", "recover password"],
},
},
};
}

openForm(args) {
const { ACTION } = args;
this.turbowarp = ACTION;
this.hideForm();

// Créer le formulaire en tant qu'élément HTML
const form = document.createElement("form");
form.style.position = "fixed";
form.style.top = "50%";
form.style.left = "50%";
form.style.transform = "translate(-50%, -50%)";
form.style.padding = "20px";
form.style.backgroundColor = "#f9f9f9";
form.style.boxShadow = "0 0 10px rgba(0, 0, 0, 0.1)";
form.style.borderRadius = "8px";
form.style.width = "300px";
form.style.fontFamily = "Arial, sans-serif";
form.style.zIndex = "1000"; // S'assure que le formulaire reste au-dessus

const closeButton = document.createElement("span");
closeButton.textContent = "✖";
closeButton.style.position = "absolute";
closeButton.style.top = "10px";
closeButton.style.right = "10px";
closeButton.style.cursor = "pointer";
closeButton.style.color = "#000";
closeButton.addEventListener("click", () => {
this.hideForm();
});
form.appendChild(closeButton);

const title = document.createElement("h2");
title.textContent = ACTION.charAt(0).toUpperCase() + ACTION.slice(1);
title.style.textAlign = "center";
title.style.color = "#333";
form.appendChild(title);

if (ACTION === "login" || ACTION === "create account") {
const usernameInput = document.createElement("input");
usernameInput.type = "text";
usernameInput.name = "username";
usernameInput.placeholder = "Username";
usernameInput.style.width = "90%";
usernameInput.style.padding = "10px";
usernameInput.style.margin = "10px 0";
usernameInput.style.border = "1px solid #ccc";
usernameInput.style.borderRadius = "4px";
form.appendChild(usernameInput);

const passwordInput = document.createElement("input");
passwordInput.type = "password";
passwordInput.name = "password";
passwordInput.placeholder = "Password";
passwordInput.style.width = "90%";
passwordInput.style.padding = "10px";
passwordInput.style.margin = "10px 0";
passwordInput.style.border = "1px solid #ccc";
passwordInput.style.borderRadius = "4px";
form.appendChild(passwordInput);
}

if (ACTION === "create account" || ACTION === "recover password") {
const emailInput = document.createElement("input");
emailInput.type = "email";
emailInput.name = "email";
emailInput.placeholder = "Email";
emailInput.style.width = "95%";
emailInput.style.padding = "10px";
emailInput.style.margin = "10px 0";
emailInput.style.border = "1px solid #ccc";
emailInput.style.borderRadius = "4px";
form.appendChild(emailInput);
}

const submitButton = document.createElement("button");
submitButton.type = "submit";
submitButton.textContent = "Send";
submitButton.style.width = "100%";
submitButton.style.padding = "10px";
submitButton.style.margin = "10px 0";
submitButton.style.backgroundColor = "#4CAF50";
submitButton.style.color = "#fff";
submitButton.style.border = "none";
submitButton.style.borderRadius = "4px";
submitButton.style.cursor = "pointer";
form.appendChild(submitButton);

form.addEventListener("submit", (event) => {
event.preventDefault();
const formData = new FormData(form);
this.username = formData.get("username");
this.password = formData.get("password");
this.email = formData.get("email");

if (ACTION === "login") {
this.login({ USERNAME: this.username, PASSWORD: this.password });
} else if (ACTION === "create account") {
this.createAccount({
USERNAME: this.username,
PASSWORD: this.password,
EMAIL: this.email,
});
} else if (ACTION === "recover password") {
this.recoverPassword({ EMAIL: this.email });
}

this.hideForm();
});

// Ajouter les liens pour naviguer entre les formulaires
if (ACTION === "login" || ACTION === "create account") {
const resetPasswordLink = document.createElement("a");
resetPasswordLink.textContent = "Reset password";
resetPasswordLink.style.display = "block";
resetPasswordLink.style.textAlign = "center";
resetPasswordLink.style.marginTop = "10px";
resetPasswordLink.style.color = "#007BFF";
resetPasswordLink.style.cursor = "pointer";
resetPasswordLink.addEventListener("click", () => {
this.hideForm(false);
this.openForm({ ACTION: "recover password" });
});
form.appendChild(resetPasswordLink);
}

if (ACTION === "login" || ACTION === "recover password") {
const createAccountLink = document.createElement("a");
createAccountLink.textContent = "Create account";
createAccountLink.style.display = "block";
createAccountLink.style.textAlign = "center";
createAccountLink.style.marginTop = "10px";
createAccountLink.style.color = "#007BFF";
createAccountLink.style.cursor = "pointer";
createAccountLink.addEventListener("click", () => {
this.hideForm(false);
this.openForm({ ACTION: "create account" });
});
form.appendChild(createAccountLink);
}

document.body.appendChild(form);
}

hideForm() {
const form = document.querySelector("form");
if (form) {
document.body.removeChild(form);
this.turbowarp = ""; // Reset the form state
}
}

createAccount(args) {
const { USERNAME, PASSWORD, EMAIL } = args;
const user = { username: USERNAME, password: PASSWORD, email: EMAIL };
this.users.push(user);
console.log(`Account created for ${USERNAME}`);
}

login(args) {
const { USERNAME, PASSWORD } = args;
const user = this.users.find(
(u) => u.username === USERNAME && u.password === PASSWORD
);
console.log(
user
? `Login successful for ${USERNAME}`
: "Incorrect username or password."
);
}

recoverPassword(args) {
const { EMAIL } = args;
const user = this.users.find((u) => u.email === EMAIL);
console.log(
user ? `Your password is: ${user.password}` : "Email not found."
);
}

getUsername() {
return this.username;
}

getPassword() {
return this.password;
}

getEmail() {
return this.email;
}

getFormState() {
return this.turbowarp;
}

clear() {
this.username = "";
this.password = "";
this.email = "";
console.log("Values have been cleared.");
}
}

Scratch.extensions.register(new UserManagement());
})(Scratch);
8 changes: 7 additions & 1 deletion extensions/Lily/Assets.js
Original file line number Diff line number Diff line change
Expand Up @@ -362,8 +362,14 @@
const assetType = this._typeIsBitmap(blob.type)
? runtime.storage.AssetType.ImageBitmap
: runtime.storage.AssetType.ImageVector;

// Bitmap data format is not actually enforced, but setting it to something that isn't in scratch-parser's
// known format list will throw an error when someone tries to load the project.
// (https://github.com/scratchfoundation/scratch-parser/blob/665f05d739a202d565a4af70a201909393d456b2/lib/sb3_definitions.json#L51)
const dataType =
blob.type === "image/svg+xml" ? "svg" : blob.type.split("/")[1];
blob.type === "image/svg+xml"
? runtime.storage.DataFormat.SVG
: runtime.storage.DataFormat.PNG;

const arrayBuffer = await new Promise((resolve, reject) => {
const fr = new FileReader();
Expand Down
1 change: 1 addition & 0 deletions images/Eaieletronic/Login-page.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading