├── Mzazi
├── me
├── warn.js
├── tempnumber.js
├── botFunctions.js
└── fancy.js
├── Media
├── me.jpg
├── love
│ ├── me.js
│ ├── gay.jpg
│ ├── deep.jpg
│ ├── funny.jpg
│ ├── lesbian.jpg
│ ├── romantic.jpg
│ └── heartbreak.jpg
├── alive.mp3
├── menu.mp3
├── menu.mp4
└── mzazi.jpg
├── action
├── me.js
├── auth.js
└── events.js
├── lib
├── me.js
├── bardSession.json
├── imgur.js
├── mzaziquotely.js
├── remini.js
├── mzaziupload.js
├── mzaziexif.js
└── mzazifunc.js
├── pixel
├── Me.js
├── sc.js
└── index.html
├── session
└── creds.json
├── Procfile
├── LICENSE
├── pairing.js
├── README.md
├── set.js
├── package.json
├── tictactoe.js
├── app.json
└── index.js
/Mzazi/me:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Media/me.jpg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/action/me.js:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/lib/me.js:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/pixel/Me.js:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Media/love/me.js:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/session/creds.json:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: node index.js
2 |
--------------------------------------------------------------------------------
/Media/alive.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/alive.mp3
--------------------------------------------------------------------------------
/Media/menu.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/menu.mp3
--------------------------------------------------------------------------------
/Media/menu.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/menu.mp4
--------------------------------------------------------------------------------
/Media/mzazi.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/mzazi.jpg
--------------------------------------------------------------------------------
/Media/love/gay.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/gay.jpg
--------------------------------------------------------------------------------
/Media/love/deep.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/deep.jpg
--------------------------------------------------------------------------------
/Media/love/funny.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/funny.jpg
--------------------------------------------------------------------------------
/Media/love/lesbian.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/lesbian.jpg
--------------------------------------------------------------------------------
/Media/love/romantic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/romantic.jpg
--------------------------------------------------------------------------------
/Media/love/heartbreak.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/heartbreak.jpg
--------------------------------------------------------------------------------
/lib/bardSession.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "domain": ".google.com",
4 | "expirationDate": 1735304645.713204,
5 | "hostOnly": false,
6 | "httpOnly": true,
7 | "name": "__Secure-1PSID",
8 | "path": "/",
9 | "sameSite": "unspecified",
10 | "secure": true,
11 | "session": false,
12 | "storeId": "0",
13 | "value": "dQhhi48ceNMy2i5Ksoj3yOF2AyDj99sr3kXPGXNIRo893HVjPDlnUvlEoef5uisS4ttkqQ."
14 | }
15 | ]
16 |
--------------------------------------------------------------------------------
/action/auth.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const session = process.env.SESSION || '';
3 | async function authenticationn() {
4 | try {
5 | if (!fs.existsSync("./session/creds.json")) {
6 | console.log('Connecting...');
7 | await fs.writeFileSync("./session/creds.json", atob(session), "utf8");
8 | } else if (session !== "zokk") {
9 | await fs.writeFileSync("./session/creds.json", atob(session), "utf8");
10 | }
11 | } catch (_0xf348d3) {
12 | console.log("Session is invalid: " + _0xf348d3);
13 | return;
14 | }
15 | }
16 | module.exports = authenticationn;
17 |
--------------------------------------------------------------------------------
/lib/imgur.js:
--------------------------------------------------------------------------------
1 | const pkg = require('imgur');
2 | const fs = require('fs');
3 |
4 | const { ImgurClient } = pkg;
5 |
6 | const client = new ImgurClient({ clientId: 'a0113354926015a' });
7 |
8 | async function uploadtoimgur(imagepath) {
9 | try {
10 | const response = await client.upload({
11 | image: fs.createReadStream(imagepath),
12 | type: 'stream',
13 | });
14 |
15 | let url = response.data.link;
16 | console.log(url);
17 | return url;
18 | } catch (error) {
19 | console.error('Error uploading image to Imgur:', error);
20 | throw error;
21 | }
22 | }
23 |
24 | module.exports = uploadtoimgur;
25 |
--------------------------------------------------------------------------------
/pixel/sc.js:
--------------------------------------------------------------------------------
1 | fetch('/set.js')
2 | .then(response => response.text())
3 | .then(data => {
4 | console.log('Received settings data:', data);
5 | const set = JSON.parse(data.replace(/module.exports = /, ''));
6 | console.log('Parsed settings:', set);
7 |
8 |
9 |
10 | const container = document.querySelector('.container');
11 |
12 |
13 | const statusSection = document.createElement('div');
14 | statusSection.innerHTML = `
15 |
BOT STATUS
16 | BOT NAME: ${set.botname}
17 | MODE: ${set.mode}
18 | PREFIX: ${set.prefix}
19 | `;
20 | container.appendChild(statusSection);
21 | })
22 | .catch(error => console.error('Error fetching settings:', error));
23 |
--------------------------------------------------------------------------------
/lib/mzaziquotely.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const quote = async (text, name, avatar) => {
3 | const json = {
4 |
5 | "type": "quote",
6 | "format": "png",
7 | "backgroundColor": "#FFFFFF",
8 | "width": 512,
9 | "height": 768,
10 | "scale": 2,
11 |
12 | "messages": [
13 | {
14 | "entities": [],
15 | "avatar": true,
16 | "from": {
17 | "id": 1,
18 | "name": name,
19 | "photo": {
20 | "url": avatar,
21 | }
22 | },
23 |
24 | "text": text,
25 | "replyMessage": {}
26 | }
27 | ]
28 |
29 | };
30 |
31 | const res = await axios.post('https://bot.lyo.su/quote/generate',
32 | json,
33 |
34 | {
35 | headers: {'Content-Type': 'application/json'}
36 | })
37 |
38 | const buffer = Buffer.from(res.data.result.image, 'base64')
39 | return {
40 |
41 | status: "200",
42 | creator: "Mzazi",
43 | result: buffer
44 | }
45 | }
46 |
47 | module.exports = { quote }
48 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Mzazi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/pairing.js:
--------------------------------------------------------------------------------
1 | // Function to generate a WhatsApp pairing link
2 | const generatePairLink = async (client, m, text) => {
3 | try {
4 | let args = text.split(" ");
5 | if (args.length < 1) {
6 | return m.reply("❌ Please provide a client's WhatsApp number. Example: `.pair 254741388986`");
7 | }
8 |
9 | let clientNumber = args[0].trim();
10 |
11 | // Fetch the pair code from the pairing link API
12 | let response = await fetch(`https://mzazi-xmd-cjp7.onrender.com/generate?number=${clientNumber}`);
13 | let data = await response.json();
14 |
15 | if (!data.success) {
16 | return m.reply("⚠️ Failed to generate pair code. Try again.");
17 | }
18 |
19 | let pairCode = data.pairCode;
20 | let pairLink = `https://mzazi-xmd-cjp7.onrender.com/pair?code=${pairCode}&number=${clientNumber}`;
21 |
22 | let message = `🔗 *Pairing Link Generated:*\n📌 Client: ${clientNumber}\n🔑 Code: ${pairCode}\n🌍 Link: ${pairLink}`;
23 |
24 | await client.sendMessage(m.chat, { text: message });
25 | } catch (error) {
26 | console.error("Error in generatePairLink:", error);
27 | m.reply("⚠️ An error occurred while generating the pairing link.");
28 | }
29 | };
30 |
31 | // Export the function
32 | module.exports = { generatePairLink };
33 |
--------------------------------------------------------------------------------
/Mzazi/warn.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const path = require('path');
3 |
4 | const storePath = path.join(__dirname, 'store.json');
5 |
6 | // Read data from JSON file
7 | function readStore() {
8 | if (!fs.existsSync(storePath)) {
9 | return {};
10 | }
11 | const data = fs.readFileSync(storePath);
12 | return JSON.parse(data);
13 | }
14 |
15 | // Write data to JSON file
16 | function writeStore(data) {
17 | fs.writeFileSync(storePath, JSON.stringify(data, null, 2));
18 | }
19 |
20 | async function addUserWithWarnCount(jid) {
21 | const store = readStore();
22 | if (!store[jid]) {
23 | store[jid] = { warn_count: 0 };
24 | }
25 | store[jid].warn_count += 1;
26 | writeStore(store);
27 | console.log(`User ${jid} added or updated with a warn_count of ${store[jid].warn_count}.`);
28 | }
29 |
30 | async function getWarnCountByJID(jid) {
31 | const store = readStore();
32 | if (store[jid]) {
33 | return store[jid].warn_count;
34 | } else {
35 | return 0; // If the user is not found, return 0
36 | }
37 | }
38 |
39 | async function resetWarnCountByJID(jid) {
40 | const store = readStore();
41 | if (store[jid]) {
42 | store[jid].warn_count = 0;
43 | writeStore(store);
44 | console.log(`The warn_count for user ${jid} has been reset to 0.`);
45 | }
46 | }
47 |
48 | module.exports = {
49 | addUserWithWarnCount,
50 | getWarnCountByJID,
51 | resetWarnCountByJID,
52 | };
53 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 🌐 MZAZI-XMD | Multilingual Support
6 |
7 | Select your preferred language below to view the official site:
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | ---
31 |
32 | ## ℹ️ About
33 |
34 | Each version above offers a localized experience of **MZAZI-XMD**. Feel free to explore in your preferred language.
35 |
36 | ---
37 |
38 | > Built with passion by MZAZI and contributors.
39 |
--------------------------------------------------------------------------------
/lib/remini.js:
--------------------------------------------------------------------------------
1 | const FormData = require("form-data");
2 | async function remini(_0x33b965, _0x34eff3) {
3 | return new Promise(async (_0x14db15, _0x267c15) => {
4 | let _0x45d85b = ['enhance', "recolor", "dehaze"];
5 | if (_0x45d85b.includes(_0x34eff3)) {
6 | _0x34eff3 = _0x34eff3;
7 | } else {
8 | _0x34eff3 = _0x45d85b[0x0];
9 | }
10 | let _0x370778 = new FormData();
11 | let _0x5c019f = "https://inferenceengine.vyro.ai/" + _0x34eff3;
12 | _0x370778.append("model_version", 0x1, {
13 | 'Content-Transfer-Encoding': "binary",
14 | 'contentType': "multipart/form-data; charset=uttf-8"
15 | });
16 | _0x370778.append('image', Buffer.from(_0x33b965), {
17 | 'filename': "enhance_image_body.jpg",
18 | 'contentType': "image/jpeg"
19 | });
20 | _0x370778.submit({
21 | 'url': _0x5c019f,
22 | 'host': "inferenceengine.vyro.ai",
23 | 'path': '/' + _0x34eff3,
24 | 'protocol': "https:",
25 | 'headers': {
26 | 'User-Agent': 'okhttp/4.9.3',
27 | 'Connection': "Keep-Alive",
28 | 'Accept-Encoding': "gzip"
29 | }
30 | }, function (_0x319120, _0x175e8d) {
31 | if (_0x319120) {
32 | _0x267c15();
33 | }
34 | let _0x15e24d = [];
35 | _0x175e8d.on('data', function (_0x2918a5, _0x2d4e53) {
36 | _0x15e24d.push(_0x2918a5);
37 | }).on("end", () => {
38 | _0x14db15(Buffer.concat(_0x15e24d));
39 | });
40 | _0x175e8d.on("error", _0x90e19c => {
41 | _0x267c15();
42 | });
43 | });
44 | });
45 | }
46 | module.exports.remini = remini;
47 |
--------------------------------------------------------------------------------
/Mzazi/tempnumber.js:
--------------------------------------------------------------------------------
1 | const TEMPNUMBER_API_URL = 'https://keith-api.vercel.app/api/tempnumber';
2 | const TEMPNUMBER_CODE_API_URL = 'https://keith-api.vercel.app/api/tempnumbercode';
3 |
4 | module.exports = async (context) => {
5 | const { client, m } = context;
6 |
7 | try {
8 | // Fetch tempnumber data
9 | const tempNumberResponse = await fetch(TEMPNUMBER_API_URL);
10 | if (!tempNumberResponse.ok) throw new Error('Failed to fetch tempnumber data');
11 | const { result: tempNumbers } = await tempNumberResponse.json();
12 |
13 | let message = '┏━━ 🎉 *TEMP NUMBERS* 🎉 ━━◆\n';
14 | for (const { country, number, link } of tempNumbers) {
15 | message += `
16 | ┃ *Country:* ${country}
17 | ┃ *Number:* ${number}
18 | ┃ *Link:* [View SMS](${link})
19 | ┃
20 | `;
21 | }
22 | message += '╰───────────────◆\n';
23 |
24 | // Fetch tempnumber code data (if necessary)
25 | const tempNumberCodeResponse = await fetch(TEMPNUMBER_CODE_API_URL);
26 | const tempNumberCodeData = await tempNumberCodeResponse.json();
27 |
28 | if (tempNumberCodeData.status && tempNumberCodeData.code) {
29 | message += `\n*Temp Number Code:* ${tempNumberCodeData.code}\n`;
30 | } else {
31 | message += '\n*No code available for the current temp number.*\n';
32 | }
33 |
34 | // Send the message
35 | await client.sendMessage(m.chat, { text: message }, { quoted: m });
36 |
37 | } catch (error) {
38 | console.error('Error:', error);
39 | await client.sendMessage(m.chat, { text: 'An error occurred while fetching tempnumber data.' }, { quoted: m });
40 | }
41 | };
42 |
--------------------------------------------------------------------------------
/action/events.js:
--------------------------------------------------------------------------------
1 | const welcomegoodbye = process.env.WELCOMEGOODBYE || "FALSE";
2 | const botname = process.env.BOTNAME || "𝗠𝗭𝗔𝗭𝗜-𝗫𝗠𝗗";
3 | const Events = async (_0x3e9038, _0xde2ef2) => {
4 | try {
5 | let _0x2c0ca0 = await _0x3e9038.groupMetadata(_0xde2ef2.id);
6 | let _0x3f99f2 = _0xde2ef2.participants;
7 | for (let _0x2c7d9b of _0x3f99f2) {
8 | let _0xf672f2;
9 | try {
10 | _0xf672f2 = await _0x3e9038.profilePictureUrl(_0x2c7d9b, "image");
11 | } catch {
12 | _0xf672f2 = "https://files.catbox.moe/p3hl9n.jpg";
13 | }
14 | if (_0xde2ef2.action === 'add') {
15 | let _0x536efe = '@' + _0x2c7d9b.split('@')[0x0] + " Holla👋,\n\nWelcome to " + _0x2c0ca0.subject + ".\n\nYou might want to read group description,\nFollow group rules to avoid being removed.\n\n" + botname + " 2025.";
16 | if (welcomegoodbye === "TRUE") {
17 | await _0x3e9038.sendMessage(_0xde2ef2.id, {
18 | 'image': {
19 | 'url': _0xf672f2
20 | },
21 | 'caption': _0x536efe,
22 | 'mentions': [_0x2c7d9b]
23 | });
24 | }
25 | } else {
26 | if (_0xde2ef2.action === 'remove') {
27 | let _0x2e9b12 = '@' + _0x2c7d9b.split('@')[0x0] + " Has run out of data. Let's pray for the poor😔.\n\nAnyway Goodbye Hustler.\n\n" + botname + " 2025.";
28 | if (welcomegoodbye === "TRUE") {
29 | await _0x3e9038.sendMessage(_0xde2ef2.id, {
30 | 'image': {
31 | 'url': _0xf672f2
32 | },
33 | 'caption': _0x2e9b12,
34 | 'mentions': [_0x2c7d9b]
35 | });
36 | }
37 | }
38 | }
39 | }
40 | } catch (_0x193958) {
41 | console.log(_0x193958);
42 | }
43 | };
44 | module.exports = Events;
45 |
--------------------------------------------------------------------------------
/pixel/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | mzazi web
5 |
56 |
57 |
58 |
59 |
WELCOME TO MZAZI WEB
60 |
Holla, you have successfully connected to MZAZI-BOT.The bot is currently running and ACTIVE.
61 |
62 |
63 |

64 |

65 |
66 |
© 2025 MZAZI BOT
67 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/set.js:
--------------------------------------------------------------------------------
1 | /* if you're using pannel carefully edit this part
2 |
3 | There's no need to configure this if you're deploying via Heroku — just set them in the environment variables. And don't forget to rest, for even the relentless must recharge.*/
4 |
5 | const sessionName = 'session';
6 | const session = process.env.SESSION || '';
7 | const autobio = process.env.AUTOBIO || 'FALSE';
8 | const autolike = process.env.AUTOLIKE_STATUS || 'TRUE';
9 | const autoviewstatus = process.env.AUTOVIEW_STATUS || 'TRUE';
10 | const welcomegoodbye = process.env.WELCOMEGOODBYE || 'FALSE';
11 |
12 | const prefix = process.env.PREFIX || '/';
13 | const appname = process.env.APP_NAME || '';
14 | const herokuapi = process.env.HEROKU_API;
15 | const gptdm = process.env.GPT_INBOX || 'FALSE';
16 | const mode = process.env.MODE || 'PUBLIC';
17 | const antidel = process.env.ANTIDELETE || 'TRUE';
18 |
19 | const botname = process.env.BOTNAME || '𝗠𝗭𝗔𝗭𝗜-𝗫𝗠𝗗';
20 | const antibot = process.env.ANTIBOT || 'FALSE';
21 | const author = process.env.STICKER_AUTHOR ||'𝗕𝗢𝗧';
22 | const packname = process.env.STICKER_PACKNAME || '𝗠𝗭𝗔𝗭𝗜';
23 | const dev = process.env.DEV || '254741388986';
24 | const anticall = process.env.AUTOREJECT_CALL || 'TRUE';
25 |
26 | const menu = process.env.MENU_TYPE || 'VIDEO';
27 | const DevMzazi = dev.split(",");
28 | const badwordkick = process.env.BAD_WORD_KICK || 'FALSE';
29 | const bad = process.env.BAD_WORD || 'fuck';
30 | const autoread = process.env.AUTOREAD || 'FALSE';
31 |
32 | const admin = process.env.ADMIN_MSG || '𝗖𝗼𝗺𝗺𝗮𝗻𝗱 𝗿𝗲𝘀𝗲𝗿𝘃𝗲𝗱 𝗳𝗼𝗿 𝗔𝗱𝗺𝗶𝗻𝘀!';
33 | const group = process.env.GROUP_ONLY_MSG || '𝗖𝗼𝗺𝗺𝗮𝗻𝗱 𝗺𝗲𝗮𝗻𝘁 𝗳𝗼𝗿 𝗚𝗿𝗼𝘂𝗽𝘀!';
34 | const botAdmin = process.env.BOT_ADMIN_MSG || '𝗜 𝗻𝗲𝗲𝗱 𝗔𝗱𝗺𝗶𝗻 𝗽𝗿𝗲𝘃𝗶𝗹𝗲𝗱𝗴𝗲𝘀!';
35 | const NotOwner = process.env.NOT_OWNER_MSG || '𝗖𝗼𝗺𝗺𝗮𝗻𝗱 𝗺𝗲𝗮𝗻𝘁 𝗳𝗼𝗿 𝘁𝗵𝗲 𝗼𝘄𝗻𝗲𝗿!';
36 |
37 | const wapresence = process.env.WA_PRESENCE || 'recording';
38 | const antilink = process.env.ANTILINK || 'TRUE';
39 | const mycode = process.env.CODE || '254';
40 | const port = process.env.PORT || 10000;
41 | const antilinkall = process.env.ANTILINK_ALL || 'TRUE';
42 |
43 | module.exports = {
44 | session,
45 | antidel,
46 | sessionName,
47 | autobio,
48 | author,
49 | packname,
50 | dev,
51 | DevMzazi,
52 | badwordkick,
53 | anticall,
54 | bad,
55 | mode,
56 | group,
57 | NotOwner,
58 | botname,
59 | botAdmin,
60 | menu,
61 | autoread,
62 | antilink,
63 | admin,
64 | mycode,
65 | antilinkall,
66 | wapresence,
67 | welcomegoodbye,
68 | antibot,
69 | herokuapi,
70 | prefix,
71 | port,
72 | gptdm,
73 | appname,
74 | autolike,
75 | autoviewstatus,
76 | };
77 |
78 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MZAZI-XMD",
3 | "version": "2.0.0",
4 | "description": "WhatsApp Multi Device Bot",
5 | "main": "index.js",
6 | "type": "commonjs",
7 |
8 | "scripts": {
9 | "start": "node index.js"
10 | },
11 | "keywords": [
12 | "termux",
13 | "whatsapp-openai",
14 | "whatsapp-openai",
15 | "whatsapp-bot",
16 | "whatsapp-baileys",
17 | "baileys-md",
18 | "bot-wa",
19 | "bot-md",
20 | "whatsapp-multi-device"
21 | ],
22 | "base": "https://github.com/DikaArdnt/Hisoka-Morou",
23 | "author": "mzazi",
24 | "license": "MIT",
25 | "dependencies": {
26 | "@whiskeysockets/baileys": "^6.7.9",
27 | "@adiwajshing/keyed-db": "^0.2.4",
28 | "@hapi/boom": "^10.0.0",
29 | "@google/generative-ai":"^0.1.3",
30 | "badadvice": "^1.0.0",
31 | "g-bardai": "^1.0.4-beta",
32 | "aptoide-scraper": "^1.0.1",
33 | "awesome-phonenumber": "^2.64.0",
34 | "axios": "^1.3.6",
35 | "moment-timezone": "^0.5.34",
36 | "chalk": "^4.1.2",
37 | "child-process": "^1.0.2",
38 | "os": "^0.1.2",
39 | "file-type": "^16.5.3",
40 | "genius-lyrics": "^4.4.3",
41 | "google-tts-api": "^2.0.2",
42 | "tempmail.lol": "^4.1.0",
43 | "js-confuser": "^1.7.3",
44 | "crypto": "^1.0.1",
45 | "imgur": "2.3.0",
46 | "chatgpt-scraper": "^1.0.1",
47 | "g-i-s": "^2.1.7",
48 | "figlet": "^1.5.2",
49 | "fs": "0.0.1-security",
50 | "canvacord": "^5.4.9",
51 | "stream": "^0.0.2",
52 | "api-dylux" : "^1.8.5",
53 | "fluent-ffmpeg": "^2.1.2",
54 | "node-webpmux": "^3.1.5",
55 | "path": "^0.12.7",
56 | "libsignal": "2.0.1",
57 | "luxon": "^3.4.4",
58 | "express": "latest",
59 | "compile-run": "^2.3.4",
60 | "node-fetch-commonjs": "^3.3.2",
61 | "node-catbox": "3.2.0",
62 | "javascript-obfuscator": "^4.1.0",
63 | "heroku-client": "3.1.0",
64 | "node-fetch": "^2.6.1",
65 | "crypto": "^1.0.1",
66 | "child-process": "^1.0.2",
67 | "jimp": "^0.16.13",
68 | "human-readable": "^0.2.1",
69 | "quickmongo": "^5.2.0",
70 | "lodash": "^4.17.21",
71 | "gemini-ai": "^2.2.1",
72 | "performance-now": "^2.1.0",
73 | "util": "^0.12.5",
74 | "openai": "^3.1.0",
75 | "g4f": "^1.1.0",
76 | "acrcloud": "^1.4.0",
77 | "mumaker": "^2.0.0",
78 | "ruhend-scraper": "^8.0.3",
79 | "ytdl-secktor": "^0.0.1-development",
80 | "ytdl-core": "npm:@distube/ytdl-core",
81 | "yt-search": "^2.12.1",
82 | "youtube-yts": "^2.0.0",
83 | "pino": "^7.0.5",
84 | "wa-sticker-formatter": "^4.3.2",
85 | "qrcode-terminal": "^0.12.0",
86 | "util": "^0.12.4"
87 | },
88 | "directories": {
89 | "lib": "lib",
90 | "src": "src"
91 | },
92 | "repository": {
93 | "type": "git",
94 | "url": "git+https://github.com/TeddyDommie/MZAZI-XMD.git"
95 | },
96 | "bugs": {
97 | "url": "https://github.com/TeddyDommie/MZAZI-XMD/issues"
98 | },
99 | "homepage": "https://github.com/TeddyDommie/MZAZI-XMD#readme"
100 | }
101 |
--------------------------------------------------------------------------------
/lib/mzaziupload.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | let axios = require('axios')
4 | let BodyForm = require('form-data')
5 | let { fromBuffer } = require('file-type')
6 | let fetch = require('node-fetch')
7 | let fs = require('fs')
8 | let cheerio = require('cheerio')
9 |
10 | function TelegraPh (Path) {
11 | return new Promise (async (resolve, reject) => {
12 | if (!fs.existsSync(Path)) return reject(new Error("File not Found"))
13 | try {
14 | const form = new BodyForm();
15 | form.append("file", fs.createReadStream(Path))
16 | const data = await axios({
17 | url: "https://telegra.ph/upload",
18 | method: "POST",
19 | headers: {
20 | ...form.getHeaders()
21 | },
22 | data: form
23 | })
24 | return resolve("https://telegra.ph" + data.data[0].src)
25 | } catch (err) {
26 | return reject(new Error(String(err)))
27 | }
28 | })
29 | }
30 |
31 | async function UploadFileUgu (input) {
32 | return new Promise (async (resolve, reject) => {
33 | const form = new BodyForm();
34 | form.append("files[]", fs.createReadStream(input))
35 | await axios({
36 | url: "https://uguu.se/upload.php",
37 | method: "POST",
38 | headers: {
39 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
40 | ...form.getHeaders()
41 | },
42 | data: form
43 | }).then((data) => {
44 | resolve(data.data.files[0])
45 | }).catch((err) => reject(err))
46 | })
47 | }
48 |
49 | function webp2mp4File(path) {
50 | return new Promise((resolve, reject) => {
51 | const form = new BodyForm()
52 | form.append('new-image-url', '')
53 | form.append('new-image', fs.createReadStream(path))
54 | axios({
55 | method: 'post',
56 | url: 'https://s6.ezgif.com/webp-to-mp4',
57 | data: form,
58 | headers: {
59 | 'Content-Type': `multipart/form-data; boundary=${form._boundary}`
60 | }
61 | }).then(({ data }) => {
62 | const bodyFormThen = new BodyForm()
63 | const $ = cheerio.load(data)
64 | const file = $('input[name="file"]').attr('value')
65 | bodyFormThen.append('file', file)
66 | bodyFormThen.append('convert', "Convert WebP to MP4!")
67 | axios({
68 | method: 'post',
69 | url: 'https://ezgif.com/webp-to-mp4/' + file,
70 | data: bodyFormThen,
71 | headers: {
72 | 'Content-Type': `multipart/form-data; boundary=${bodyFormThen._boundary}`
73 | }
74 | }).then(({ data }) => {
75 | const $ = cheerio.load(data)
76 | const result = 'https:' + $('div#output > p.outfile > video > source').attr('src')
77 | resolve({
78 | status: true,
79 | message: "Created By MRHRTZ",
80 | result: result
81 | })
82 | }).catch(reject)
83 | }).catch(reject)
84 | })
85 | }
86 |
87 | async function floNime(medianya, options = {}) {
88 | const { ext } = await fromBuffer(medianya) || options.ext
89 | var form = new BodyForm()
90 | form.append('file', medianya, 'tmp.'+ext)
91 | let jsonnya = await fetch('https://flonime.my.id/upload', {
92 | method: 'POST',
93 | body: form
94 | })
95 | .then((response) => response.json())
96 | return jsonnya
97 | }
98 |
99 | module.exports = { TelegraPh, UploadFileUgu, webp2mp4File, floNime }
100 |
--------------------------------------------------------------------------------
/tictactoe.js:
--------------------------------------------------------------------------------
1 | class TicTacToe {
2 | // Define constants for better readability
3 | static PLAYER_X = 'X';
4 | static PLAYER_O = 'O';
5 | static EMPTY = ' ';
6 | static GAME_STATES = {
7 | ONGOING: 0,
8 | X_WON: 1,
9 | O_WON: 2,
10 | DRAW: 3,
11 | INVALID_MOVE: -1
12 | };
13 |
14 | constructor(playerX = TicTacToe.PLAYER_X, playerO = TicTacToe.PLAYER_O) {
15 | // Validate player markers
16 | if (typeof playerX !== 'string' || playerX.length !== 1) {
17 | throw new Error('Player X marker must be a single character');
18 | }
19 | if (typeof playerO !== 'string' || playerO.length !== 1) {
20 | throw new Error('Player O marker must be a single character');
21 | }
22 | if (playerX === playerO) {
23 | throw new Error('Players must have different markers');
24 | }
25 |
26 | this.playerX = playerX;
27 | this.playerO = playerO;
28 | this.currentPlayer = playerX;
29 | this.board = Array(9).fill(TicTacToe.EMPTY);
30 | this.gameState = TicTacToe.GAME_STATES.ONGOING;
31 | this.moveHistory = [];
32 | }
33 |
34 | makeMove(position) {
35 | // Validate game state
36 | if (this.gameState !== TicTacToe.GAME_STATES.ONGOING) {
37 | return {
38 | status: this.gameState,
39 | message: 'Game has already ended'
40 | };
41 | }
42 |
43 | // Validate position
44 | if (typeof position !== 'number' || position < 0 || position > 8) {
45 | return {
46 | status: TicTacToe.GAME_STATES.INVALID_MOVE,
47 | message: 'Position must be between 0 and 8'
48 | };
49 | }
50 |
51 | // Check if position is empty
52 | if (this.board[position] !== TicTacToe.EMPTY) {
53 | return {
54 | status: TicTacToe.GAME_STATES.INVALID_MOVE,
55 | message: 'Position already occupied'
56 | };
57 | }
58 |
59 | // Make the move
60 | this.board[position] = this.currentPlayer;
61 | this.moveHistory.push({
62 | player: this.currentPlayer,
63 | position: position,
64 | board: [...this.board]
65 | });
66 |
67 | // Check for win
68 | if (this.checkWin()) {
69 | this.gameState = this.currentPlayer === this.playerX
70 | ? TicTacToe.GAME_STATES.X_WON
71 | : TicTacToe.GAME_STATES.O_WON;
72 | return {
73 | status: this.gameState,
74 | message: `${this.currentPlayer} wins!`
75 | };
76 | }
77 |
78 | // Check for draw
79 | if (this.board.every(cell => cell !== TicTacToe.EMPTY)) {
80 | this.gameState = TicTacToe.GAME_STATES.DRAW;
81 | return {
82 | status: this.gameState,
83 | message: 'Game ended in a draw'
84 | };
85 | }
86 |
87 | // Switch player
88 | this.currentPlayer = this.currentPlayer === this.playerX
89 | ? this.playerO
90 | : this.playerX;
91 |
92 | return {
93 | status: TicTacToe.GAME_STATES.ONGOING,
94 | message: 'Move successful'
95 | };
96 | }
97 |
98 | checkWin() {
99 | const winPatterns = [
100 | [0, 1, 2], [3, 4, 5], [6, 7, 8], // rows
101 | [0, 3, 6], [1, 4, 7], [2, 5, 8], // columns
102 | [0, 4, 8], [2, 4, 6] // diagonals
103 | ];
104 |
105 | return winPatterns.some(pattern => {
106 | const [a, b, c] = pattern;
107 | return (
108 | this.board[a] !== TicTacToe.EMPTY &&
109 | this.board[a] === this.board[b] &&
110 | this.board[a] === this.board[c]
111 | );
112 | });
113 | }
114 |
115 | getBoard() {
116 | return [...this.board]; // Return a copy to prevent direct manipulation
117 | }
118 |
119 | getGameState() {
120 | return this.gameState;
121 | }
122 |
123 | getCurrentPlayer() {
124 | return this.currentPlayer;
125 | }
126 |
127 | displayBoard() {
128 | let display = '';
129 | this.board.forEach((cell, index) => {
130 | display += cell === TicTacToe.EMPTY ? index : cell;
131 | display += (index + 1) % 3 === 0 ? '\n' : ' | ';
132 | });
133 | return display;
134 | }
135 | }
136 |
137 | // Example usage:
138 | const game = new TicTacToe();
139 | console.log(game.displayBoard());
140 |
141 | // Make some moves
142 | game.makeMove(0); // X moves
143 | game.makeMove(4); // O moves
144 | game.makeMove(1); // X moves
145 | game.makeMove(5); // O moves
146 | game.makeMove(2); // X moves and wins
147 |
148 | console.log(game.displayBoard());
149 | console.log(game.getGameState());
150 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MZAZI-XMD",
3 | "description": "I don't know what I'm doing",
4 | "keywords": [
5 | "bot",
6 | "whatsapp",
7 | "mzazi",
8 | "whatsapp-stickers",
9 | "anime",
10 | "whatsapp-bot",
11 | "whatsapp-sticker-bot",
12 | "whatsapp-botto",
13 | "baileys",
14 | "baileys-md",
15 | "md-bot"
16 | ],
17 | "website": "https://github.com/TeddyDommie/MZAZI-XMD#readme",
18 | "repository": "https://github.com/TeddyDommie/MZAZI-XMD.git",
19 | "logo": "https://telegra.ph/file/eebe191a0520a79979b34.jpg",
20 | "success_url": "/",
21 | "env": {
22 | "PREFIX": {
23 | "description": "Prefix of MZAZI-XMD Ex: . , / , # , & etc. Put any symbol or leave it blank",
24 | "required": false
25 |
26 | },
27 | "DEV": {
28 | "description": "Put any phone numbers you want to be bot owner without + or spaces, separated by commas. Example: 254741388986,254100156216",
29 | "required": true,
30 | "value": "254741388986"
31 | },
32 | "NOT_OWNER_MSG": {
33 | "description": "Put a message that the bot will send if a parameter that requires only owner user is violated. Example: Owner only",
34 | "value": "Owner Only",
35 | "required": false
36 | },
37 |
38 |
39 | "BOT_ADMIN_MSG": {
40 | "description": "Put a message that the bot will send if a parameter that requires bot to be admin is violated. Example: Bot is not admin!",
41 | "value": "Bot is not admin",
42 | "required": false
43 | },
44 | "ADMIN_MSG": {
45 | "description": "Put a message that the bot will send if a parameter that requires only owner user is violated. Example: Only admins are allowed to use this command",
46 | "value": "Only admins are allowed to use this command",
47 | "required": false
48 | },
49 | "HEROKU_API": {
50 | "description": "Put a Heroku api key here, will be required to update vars in your Dm",
51 | "required": true
52 | },
53 | "BAD_WORD": {
54 | "description": "List words separated with commas that will be considered as bad and will trigger bot to kick. Example: fuck, pussy, hoe",
55 | "value": "Pussy, Mtaro, kuma",
56 | "required": false
57 | },
58 | "BAD_WORD_KICK": {
59 | "description": "Put here TRUE if you want the bot to automatically kick group members using words that you have listed as bad",
60 | "value": "FALSE",
61 | "required": false
62 | },
63 | "GROUP_ONLY_MSG": {
64 | "description": "Put a message that the bot will send if a parameter that works in group chats only is violated. Example: This command will work in groups only",
65 | "value": "This command will work in groups only",
66 | "required": false
67 | },
68 | "AUTOREAD": {
69 | "description": "Put here TRUE if you want bot to automatically bluetick messages in private chats",
70 | "value": "FALSE",
71 | "required": true
72 | },
73 | "AUTOVIEW": {
74 | "description": "Input TRUE if you want bot to automatically read status update",
75 | "value": "TRUE",
76 | "required": true
77 | },
78 | "WA_PRESENCE": {
79 | "description": "Input either recording, typing, online, or leave it blank. This enables bot to simulate typing or recording or online status even if you're not online.",
80 | "value": "typing",
81 | "required": true
82 | },
83 | "WELCOMEGOODBYE": {
84 | "description": "Input TRUE if you want bot to welcome new members joining group or wave goodbye to members leaving a group.",
85 | "value": "FALSE",
86 | "required": false
87 | },
88 |
89 | "ANTILINK": {
90 | "description": "Input TRUE if you want bot to kick link senders",
91 | "value": "TRUE",
92 | "required": true
93 | },
94 | "ANTILINK_ALL": {
95 | "description": "Input TRUE if you want bot to kick users sending any links.",
96 | "value": "TRUE",
97 | "required": true
98 | },
99 | "ANTIBOT": {
100 | "description": "Input TRUE if you want bot to kick other bots from group",
101 | "value": "TRUE",
102 | "required": false
103 | },
104 | "CODE": {
105 | "description": "Input you country code here without + eg 254, it Will be used to Eliminate foreigners from the group once prompted.",
106 | "value": "254",
107 | "required": true
108 | },
109 | "SESSION": {
110 | "description": "Paste your Session id here, as it is required for authenticationn.",
111 | "required": true
112 | },
113 | "MODE": {
114 | "description": "Input PRIVATE if you don't want other people to use your bot",
115 | "value": "PUBLIC",
116 | "required": true
117 | },
118 |
119 | "AUTOBIO": {
120 | "description": "Input TRUE if you want bot to autoupdate its about with current time and date.",
121 | "value": "TRUE",
122 | "required": false
123 | },
124 | "APP_NAME": {
125 | "description": "Input your app name that you put above, Must be in small letters.",
126 | "required": true
127 | },
128 | "STICKER_AUTHOR": {
129 | "description": "Input sticker data for author",
130 | "value": "MZAZI",
131 | "required": false
132 | },
133 | "STICKER_PACKNAME": {
134 | "description": "Input sticker data for packname",
135 | "value": "MZAZI",
136 | "required": false
137 | },
138 | "GPT_INBOX": {
139 | "description": "Input TRUE if you want bot to autoreply inbox messages using openai API.",
140 | "value": "FALSE",
141 | "required": false
142 | },
143 | "MENU_TYPE": {
144 | "description": "Input either VIDEO, LINK or IMAGE. This will allow bot to display different dynamic menu types",
145 | "value": "LINK",
146 | "required": false
147 |
148 |
149 |
150 | },
151 | "AUTOLIKE_STATUS": {
152 | "description": "input TRUE if you want bot to autolike status updates. This will only work if autostatus view is TRUE",
153 | "value": "TRUE",
154 | "required": false
155 | }
156 | },
157 | "buildpacks": [
158 | {
159 | "url": "heroku/nodejs"
160 | },
161 | {
162 | "url": "https://github.com/clhuang/heroku-buildpack-webp-binaries.git"
163 | },
164 | {
165 | "url": "https://github.com/heroku/heroku-buildpack-activestorage-preview"
166 | }
167 | ]
168 | }
169 |
--------------------------------------------------------------------------------
/lib/mzaziexif.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 | const { tmpdir } = require("os")
3 | const Crypto = require("crypto")
4 | const ff = require('fluent-ffmpeg')
5 | const webp = require("node-webpmux")
6 | const path = require("path")
7 |
8 | async function imageToWebp (media) {
9 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
10 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.jpg`)
11 |
12 | fs.writeFileSync(tmpFileIn, media)
13 |
14 | await new Promise((resolve, reject) => {
15 | ff(tmpFileIn)
16 | .on("error", reject)
17 | .on("end", () => resolve(true))
18 | .addOutputOptions([
19 | "-vcodec",
20 | "libwebp",
21 | "-vf",
22 | "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse"
23 | ])
24 | .toFormat("webp")
25 | .save(tmpFileOut)
26 | })
27 |
28 | const buff = fs.readFileSync(tmpFileOut)
29 | fs.unlinkSync(tmpFileOut)
30 | fs.unlinkSync(tmpFileIn)
31 | return buff
32 | }
33 |
34 | async function videoToWebp (media) {
35 |
36 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
37 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.mp4`)
38 |
39 | fs.writeFileSync(tmpFileIn, media)
40 |
41 | await new Promise((resolve, reject) => {
42 | ff(tmpFileIn)
43 | .on("error", reject)
44 | .on("end", () => resolve(true))
45 | .addOutputOptions([
46 | "-vcodec",
47 | "libwebp",
48 | "-vf",
49 | "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse",
50 | "-loop",
51 | "0",
52 | "-ss",
53 | "00:00:00",
54 | "-t",
55 | "00:00:05",
56 | "-preset",
57 | "default",
58 | "-an",
59 | "-vsync",
60 | "0"
61 | ])
62 | .toFormat("webp")
63 | .save(tmpFileOut)
64 | })
65 |
66 | const buff = fs.readFileSync(tmpFileOut)
67 | fs.unlinkSync(tmpFileOut)
68 | fs.unlinkSync(tmpFileIn)
69 | return buff
70 | }
71 |
72 | async function writeExifImg (media, metadata) {
73 | let wMedia = await imageToWebp(media)
74 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
75 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
76 | fs.writeFileSync(tmpFileIn, wMedia)
77 |
78 | if (metadata.packname || metadata.author) {
79 | const img = new webp.Image()
80 | const json = { "sticker-pack-id": `https://github.com/DikaArdnt/Hisoka-Morou`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] }
81 | const exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00])
82 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8")
83 | const exif = Buffer.concat([exifAttr, jsonBuff])
84 | exif.writeUIntLE(jsonBuff.length, 14, 4)
85 | await img.load(tmpFileIn)
86 | fs.unlinkSync(tmpFileIn)
87 | img.exif = exif
88 | await img.save(tmpFileOut)
89 | return tmpFileOut
90 | }
91 | }
92 |
93 | async function writeExifVid (media, metadata) {
94 | let wMedia = await videoToWebp(media)
95 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
96 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
97 | fs.writeFileSync(tmpFileIn, wMedia)
98 |
99 | if (metadata.packname || metadata.author) {
100 | const img = new webp.Image()
101 | const json = { "sticker-pack-id": `https://github.com/DikaArdnt/Hisoka-Morou`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] }
102 | const exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00])
103 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8")
104 | const exif = Buffer.concat([exifAttr, jsonBuff])
105 | exif.writeUIntLE(jsonBuff.length, 14, 4)
106 | await img.load(tmpFileIn)
107 | fs.unlinkSync(tmpFileIn)
108 | img.exif = exif
109 | await img.save(tmpFileOut)
110 | return tmpFileOut
111 | }
112 | }
113 |
114 | async function writeExif (media, metadata) {
115 | let wMedia = /webp/.test(media.mimetype) ? media.data : /image/.test(media.mimetype) ? await imageToWebp(media.data) : /video/.test(media.mimetype) ? await videoToWebp(media.data) : ""
116 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
117 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
118 | fs.writeFileSync(tmpFileIn, wMedia)
119 |
120 | if (metadata.packname || metadata.author) {
121 | const img = new webp.Image()
122 | const json = { "sticker-pack-id": `https://github.com/DikaArdnt/Hisoka-Morou`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] }
123 | const exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00])
124 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8")
125 | const exif = Buffer.concat([exifAttr, jsonBuff])
126 | exif.writeUIntLE(jsonBuff.length, 14, 4)
127 | await img.load(tmpFileIn)
128 | fs.unlinkSync(tmpFileIn)
129 | img.exif = exif
130 | await img.save(tmpFileOut)
131 | return tmpFileOut
132 | }
133 | }
134 |
135 | module.exports = { imageToWebp, videoToWebp, writeExifImg, writeExifVid, writeExif }
136 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /* MZAZI Bot - Fixed Version */
2 | const {
3 | makeCacheableSignalKeyStore,
4 | useMultiFileAuthState,
5 | fetchLatestBaileysVersion,
6 | default: mzaziConnect,
7 | DisconnectReason,
8 | jidDecode,
9 | proto,
10 | getContentType,
11 | downloadContentFromMessage
12 | } = require("@whiskeysockets/baileys");
13 |
14 | const pino = require("pino");
15 | const { Boom } = require("@hapi/boom");
16 | const fs = require("fs");
17 | const axios = require("axios");
18 | const express = require("express");
19 | const chalk = require("chalk");
20 | const FileType = require("file-type");
21 | const figlet = require("figlet");
22 |
23 | const app = express();
24 |
25 | const event = require("./action/events");
26 | const authenticationn = require("./action/auth");
27 | const PhoneNumber = require("awesome-phonenumber");
28 | const {
29 | imageToWebp,
30 | videoToWebp,
31 | writeExifImg,
32 | writeExifVid,
33 | } = require("./lib/mzaziexif");
34 |
35 | const {
36 | smsg,
37 | isUrl,
38 | generateMessageTag,
39 | getBuffer,
40 | getSizeMedia,
41 | fetchJson,
42 | sleep,
43 | } = require("./lib/mzazifunc");
44 |
45 | const {
46 | sessionName,
47 | session,
48 | autobio,
49 | autolike,
50 | port,
51 | packname,
52 | autoviewstatus,
53 | } = require("./set.js");
54 |
55 | const color = (text, color) =>
56 | !color ? chalk.green(text) : chalk.keyword(color)(text);
57 |
58 | console.log(
59 | color(
60 | figlet.textSync("MZAZI", {
61 | font: "Standard",
62 | horizontalLayout: "default",
63 | verticalLayout: "default",
64 | whitespaceBreak: false,
65 | }),
66 | "green"
67 | )
68 | );
69 |
70 | async function startMzazi() {
71 | await authenticationn();
72 | const { state, saveCreds } = await useMultiFileAuthState("session");
73 | const { version, isLatest } = await fetchLatestBaileysVersion();
74 |
75 | console.log(`Using WA v${version.join(".")}, isLatest: ${isLatest}`);
76 |
77 | const client = mzaziConnect({
78 | logger: pino({ level: "silent" }),
79 | printQRInTerminal: true,
80 | browser: ["MZAZI-XMD", "Safari", "5.1.7"],
81 | auth: state,
82 | syncFullHistory: true,
83 | });
84 | client.public = true;
85 |
86 | if (autobio === true) {
87 | setInterval(() => {
88 | const date = new Date();
89 | client.updateProfileStatus(
90 | `${date.toLocaleString("en-US", {
91 | timeZone: "Africa/Nairobi",
92 | })} It's a ${date.toLocaleString("en-US", {
93 | weekday: "long",
94 | timeZone: "Africa/Nairobi",
95 | })}.`
96 | );
97 | }, 10 * 1000);
98 | }
99 |
100 | client.ev.on("messages.upsert", async (chatUpdate) => {
101 | try {
102 | let mek = chatUpdate.messages[0];
103 | if (!mek.message) return;
104 | mek.message =
105 | Object.keys(mek.message)[0] === "ephemeralMessage"
106 | ? mek.message.ephemeralMessage.message
107 | : mek.message;
108 |
109 | if (
110 | autoviewstatus === "TRUE" &&
111 | mek.key.remoteJid === "status@broadcast"
112 | ) {
113 | client.readMessages([mek.key]);
114 | }
115 |
116 | if (
117 | autolike === "TRUE" &&
118 | mek.key.remoteJid === "status@broadcast"
119 | ) {
120 | const mzazii = await client.decodeJid(client.user.id);
121 | await client.sendMessage(
122 | mek.key.remoteJid,
123 | { react: { key: mek.key, text: "🎭" } },
124 | { statusJidList: [mek.key.participant, mzazii] }
125 | );
126 | }
127 |
128 | if (!client.public && !mek.key.fromMe && chatUpdate.type === "notify")
129 | return;
130 |
131 | let m = smsg(client, mek);
132 | const mzazi = require("./mzazi");
133 | mzazi(client, m, chatUpdate);
134 | } catch (err) {
135 | console.log(err);
136 | }
137 | });
138 |
139 | client.decodeJid = (jid) => {
140 | if (!jid) return jid;
141 | if (/:\d+@/gi.test(jid)) {
142 | let decode = jidDecode(jid) || {};
143 | return (
144 | (decode.user && decode.server && decode.user + "@" + decode.server) ||
145 | jid
146 | );
147 | } else return jid;
148 | };
149 |
150 | client.ev.on("contacts.update", (update) => {
151 | for (let contact of update) {
152 | let id = client.decodeJid(contact.id);
153 | console.log(`Contact updated: ${id} - ${contact.notify}`);
154 | }
155 | });
156 |
157 | client.ev.on("group-participants.update", (m) => event(client, m));
158 |
159 | client.ev.on("connection.update", async (update) => {
160 | const { connection, lastDisconnect } = update;
161 | if (connection === "close") {
162 | let reason = new Boom(lastDisconnect?.error)?.output.statusCode;
163 | if (
164 | [
165 | DisconnectReason.badSession,
166 | DisconnectReason.connectionClosed,
167 | DisconnectReason.connectionLost,
168 | DisconnectReason.connectionReplaced,
169 | DisconnectReason.loggedOut,
170 | DisconnectReason.restartRequired,
171 | DisconnectReason.timedOut,
172 | ].includes(reason)
173 | ) {
174 | console.log("Reconnecting...");
175 | startMzazi();
176 | } else {
177 | console.log(`Unknown DisconnectReason: ${reason} | ${connection}`);
178 | }
179 | } else if (connection === "open") {
180 | try {
181 | await client.groupAcceptInvite("ErhgRpemSxKDWJunjNr3yw");
182 | } catch (e) {
183 | console.log("Group invite failed or already joined.");
184 | }
185 | console.log(color("MZAZI-XMD connected!", "green"));
186 | }
187 | });
188 |
189 | client.ev.on("creds.update", saveCreds);
190 |
191 | // ========== Extended Client Methods ==========
192 |
193 | client.sendImage = async (jid, path, caption = "", quoted = "", options) => {
194 | let buffer = Buffer.isBuffer(path)
195 | ? path
196 | : /^data:.*?\/.*?;base64,/i.test(path)
197 | ? Buffer.from(path.split`,`[1], "base64")
198 | : /^https?:\/\//.test(path)
199 | ? await getBuffer(path)
200 | : fs.existsSync(path)
201 | ? fs.readFileSync(path)
202 | : Buffer.alloc(0);
203 | return await client.sendMessage(jid, { image: buffer, caption: caption, ...options }, { quoted });
204 | };
205 |
206 | client.sendFile = async (jid, PATH, fileName, quoted = {}, options = {}) => {
207 | let types = await client.getFile(PATH, true);
208 | let { filename, size, ext, mime, data } = types;
209 | let type = '', mimetype = mime, pathFile = filename;
210 | if (options.asDocument) type = 'document';
211 | if (options.asSticker || /webp/.test(mime)) {
212 | let { writeExif } = require('./lib/mzaziexif.js');
213 | let media = { mimetype: mime, data };
214 | pathFile = await writeExif(media, { packname: packname, author: packname, categories: options.categories ? options.categories : [] });
215 | await fs.promises.unlink(filename);
216 | type = 'sticker';
217 | mimetype = 'image/webp';
218 | } else if (/image/.test(mime)) type = 'image';
219 | else if (/video/.test(mime)) type = 'video';
220 | else if (/audio/.test(mime)) type = 'audio';
221 | else type = 'document';
222 | await client.sendMessage(jid, { [type]: { url: pathFile }, mimetype, fileName, ...options }, { quoted, ...options });
223 | return fs.promises.unlink(pathFile);
224 | };
225 |
226 | client.parseMention = async (text) => {
227 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net');
228 | };
229 |
230 | client.sendImageAsSticker = async (jid, path, quoted, options = {}) => {
231 | let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await getBuffer(path) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0);
232 | let buffer;
233 | if (options && (options.packname || options.author)) {
234 | buffer = await writeExifImg(buff, options);
235 | } else {
236 | buffer = await imageToWebp(buff);
237 | }
238 | await client.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted });
239 | return buffer;
240 | };
241 |
242 | client.sendVideoAsSticker = async (jid, path, quoted, options = {}) => {
243 | let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await getBuffer(path) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0);
244 | let buffer;
245 | if (options && (options.packname || options.author)) {
246 | buffer = await writeExifVid(buff, options);
247 | } else {
248 | buffer = await videoToWebp(buff);
249 | }
250 | await client.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted });
251 | return buffer;
252 | };
253 |
254 | client.downloadMediaMessage = async (message) => {
255 | let mime = (message.msg || message).mimetype || '';
256 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0];
257 | const stream = await downloadContentFromMessage(message, messageType);
258 | let buffer = Buffer.from([]);
259 | for await (const chunk of stream) {
260 | buffer = Buffer.concat([buffer, chunk]);
261 | }
262 | return buffer;
263 | };
264 |
265 | client.downloadAndSaveMediaMessage = async (message, filename, attachExtension = true) => {
266 | let quoted = message.msg ? message.msg : message;
267 | let mime = (message.msg || message).mimetype || '';
268 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0];
269 | const stream = await downloadContentFromMessage(quoted, messageType);
270 | let buffer = Buffer.from([]);
271 | for await (const chunk of stream) {
272 | buffer = Buffer.concat([buffer, chunk]);
273 | }
274 | let type = await FileType.fromBuffer(buffer);
275 | let trueFileName = attachExtension ? (filename + '.' + type.ext) : filename;
276 | await fs.writeFileSync(trueFileName, buffer);
277 | return trueFileName;
278 | };
279 |
280 | client.sendText = (jid, text, quoted = "", options) =>
281 | client.sendMessage(jid, { text: text, ...options }, { quoted });
282 |
283 | client.cMod = (jid, copy, text = "", sender = client.user.id, options = {}) => {
284 | let mtype = Object.keys(copy.message)[0];
285 | let isEphemeral = mtype === "ephemeralMessage";
286 | if (isEphemeral) {
287 | mtype = Object.keys(copy.message.ephemeralMessage.message)[0];
288 | }
289 | let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message;
290 | let content = msg[mtype];
291 | if (typeof content === "string") msg[mtype] = text || content;
292 | else if (content.caption) content.caption = text || content.caption;
293 | else if (content.text) content.text = text || content.text;
294 | if (typeof content !== "string") msg[mtype] = { ...content, ...options };
295 | if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant;
296 | if (copy.key.remoteJid.includes("@s.whatsapp.net")) sender = sender || copy.key.remoteJid;
297 | else if (copy.key.remoteJid.includes("@broadcast")) sender = sender || copy.key.remoteJid;
298 | copy.key.remoteJid = jid;
299 | copy.key.fromMe = sender === client.user.id;
300 | return proto.WebMessageInfo.fromObject(copy);
301 | };
302 |
303 | return client;
304 | }
305 |
306 | app.use(express.static("pixel"));
307 | app.get("/", (req, res) => res.sendFile(__dirname + "/index.html"));
308 | app.listen(port, () => console.log(`Server listening on port http://localhost:${port}`));
309 |
310 | startMzazi();
311 |
312 | let file = require.resolve(__filename);
313 | fs.watchFile(file, () => {
314 | fs.unwatchFile(file);
315 | console.log(chalk.redBright(`Update ${__filename}`));
316 | delete require.cache[file];
317 | require(file);
318 | });
319 |
--------------------------------------------------------------------------------
/Mzazi/botFunctions.js:
--------------------------------------------------------------------------------
1 | const { proto, delay, getContentType } = require('@whiskeysockets/baileys')
2 | const chalk = require('chalk')
3 | const fs = require('fs')
4 | const Crypto = require('crypto')
5 | const axios = require('axios')
6 | const moment = require('moment-timezone')
7 | const { sizeFormatter } = require('human-readable')
8 | const util = require('util')
9 | const Jimp = require('jimp')
10 | const { defaultMaxListeners } = require('stream')
11 |
12 |
13 | const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000)
14 |
15 | exports.unixTimestampSeconds = unixTimestampSeconds
16 |
17 | exports.generateMessageTag = (epoch) => {
18 | let tag = (0, exports.unixTimestampSeconds)().toString();
19 | if (epoch)
20 | tag += '.--' + epoch; // attach epoch if provided
21 | return tag;
22 | }
23 |
24 | exports.processTime = (timestamp, now) => {
25 | return moment.duration(now - moment(timestamp * 1000)).asSeconds()
26 | }
27 |
28 | exports.getRandom = (ext) => {
29 | return `${Math.floor(Math.random() * 10000)}${ext}`
30 | }
31 |
32 | exports.fetchBuffer = async (url, options) => {
33 | try {
34 | options ? options : {};
35 | const res = await axios({
36 | method: "GET",
37 | url,
38 | headers: {
39 | "User-Agent":
40 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36",
41 | DNT: 1,
42 | "Upgrade-Insecure-Request": 1,
43 | },
44 | ...options,
45 | responseType: "arraybuffer",
46 | });
47 | return res.data;
48 | } catch (err) {
49 | return err;
50 | }
51 | };
52 |
53 | exports.getBuffer = async (url, options) => {
54 | try {
55 | options ? options : {}
56 | const res = await axios({
57 | method: "get",
58 | url,
59 | headers: {
60 | 'DNT': 1,
61 | 'Upgrade-Insecure-Request': 1
62 | },
63 | ...options,
64 | responseType: 'arraybuffer'
65 | })
66 | return res.data
67 | } catch (err) {
68 | return err
69 | }
70 | }
71 |
72 | exports.fetchJson = async (url, options) => {
73 | try {
74 | options ? options : {}
75 | const res = await axios({
76 | method: 'GET',
77 | url: url,
78 | headers: {
79 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
80 | },
81 | ...options
82 | })
83 | return res.data
84 | } catch (err) {
85 | return err
86 | }
87 | }
88 |
89 | exports.runtime = function(seconds) {
90 | seconds = Number(seconds);
91 | var d = Math.floor(seconds / (3600 * 24));
92 | var h = Math.floor(seconds % (3600 * 24) / 3600);
93 | var m = Math.floor(seconds % 3600 / 60);
94 | var s = Math.floor(seconds % 60);
95 | var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : "";
96 | var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
97 | var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
98 | var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
99 | return dDisplay + hDisplay + mDisplay + sDisplay;
100 | }
101 |
102 | exports.clockString = (ms) => {
103 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000)
104 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60
105 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60
106 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':')
107 | }
108 |
109 | exports.sleep = async (ms) => {
110 | return new Promise(resolve => setTimeout(resolve, ms));
111 | }
112 |
113 |
114 | exports.isUrl = (url) => {
115 | return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/, 'gi'))
116 | }
117 |
118 | exports.getTime = (format, date) => {
119 | if (date) {
120 | return moment(date).locale('id').format(format)
121 | } else {
122 | return moment.tz('Africa/Harare').locale('id').format(format)
123 | }
124 | }
125 |
126 | exports.formatDate = (n, locale = 'zw') => {
127 | let d = new Date(n)
128 | return d.toLocaleDateString(locale, {
129 | weekday: 'long',
130 | day: 'numeric',
131 | month: 'long',
132 | year: 'numeric',
133 | hour: 'numeric',
134 | minute: 'numeric',
135 | second: 'numeric'
136 | })
137 | }
138 |
139 | exports.tanggal = (numer) => {
140 | myMonths = ["January","February","March","Aprill","May","June","July","August","September","October","November","Deceember"];
141 | myDays = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'];
142 | var tgl = new Date(numer);
143 | var day = tgl.getDate()
144 | bulan = tgl.getMonth()
145 | var thisDay = tgl.getDay(),
146 | thisDay = myDays[thisDay];
147 | var yy = tgl.getYear()
148 | var year = (yy < 1000) ? yy + 1900 : yy;
149 | const time = moment.tz('Africa/Harare').format('DD/MM HH:mm:ss')
150 | let d = new Date
151 | let locale = 'id'
152 | let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime()
153 | let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5]
154 |
155 | return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}`
156 | }
157 |
158 | exports.formatp = sizeFormatter({
159 | std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC'
160 | decimalPlaces: 2,
161 | keepTrailingZeroes: false,
162 | render: (literal, symbol) => `${literal} ${symbol}B`,
163 | })
164 |
165 | exports.jsonformat = (string) => {
166 | return JSON.stringify(string, null, 2)
167 | }
168 |
169 | function format(...args) {
170 | return util.format(...args)
171 | }
172 |
173 | exports.logic = (check, inp, out) => {
174 | if (inp.length !== out.length) throw new Error('Input and Output must have same length')
175 | for (let i in inp)
176 | if (util.isDeepStrictEqual(check, inp[i])) return out[i]
177 | return null
178 | }
179 |
180 | exports.generateProfilePicture = async (buffer) => {
181 | const jimp = await Jimp.read(buffer)
182 | const min = jimp.getWidth()
183 | const max = jimp.getHeight()
184 | const cropped = jimp.crop(0, 0, min, max)
185 | return {
186 | img: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG),
187 | preview: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG)
188 | }
189 | }
190 |
191 | exports.bytesToSize = (bytes, decimals = 2) => {
192 | if (bytes === 0) return '0 Bytes';
193 |
194 | const k = 1024;
195 | const dm = decimals < 0 ? 0 : decimals;
196 | const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
197 |
198 | const i = Math.floor(Math.log(bytes) / Math.log(k));
199 |
200 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
201 | }
202 |
203 | exports.getSizeMedia = (path) => {
204 | return new Promise((resolve, reject) => {
205 | if (/http/.test(path)) {
206 | axios.get(path)
207 | .then((res) => {
208 | let length = parseInt(res.headers['content-length'])
209 | let size = exports.bytesToSize(length, 3)
210 | if(!isNaN(length)) resolve(size)
211 | })
212 | } else if (Buffer.isBuffer(path)) {
213 | let length = Buffer.byteLength(path)
214 | let size = exports.bytesToSize(length, 3)
215 | if(!isNaN(length)) resolve(size)
216 | } else {
217 | reject('error gatau apah')
218 | }
219 | })
220 | }
221 |
222 | exports.parseMention = (text = '') => {
223 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net')
224 | }
225 |
226 |
227 | /**
228 | * Serialize Message
229 | * @param {WAConnection} conn
230 | * @param {Object} m
231 | * @param {store} store
232 | */
233 | exports.smsg = (conn, m, store) => {
234 | if (!m) return m
235 | let M = proto.WebMessageInfo
236 | if (m.key) {
237 | m.id = m.key.id
238 | m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16
239 | m.chat = m.key.remoteJid
240 | m.fromMe = m.key.fromMe
241 | m.isGroup = m.chat.endsWith('@g.us')
242 | m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '')
243 | if (m.isGroup) m.participant = conn.decodeJid(m.key.participant) || ''
244 | }
245 | if (m.message) {
246 | m.mtype = getContentType(m.message)
247 | m.msg = (m.mtype == 'viewOnceMessage' ? m.message[m.mtype].message[getContentType(m.message[m.mtype].message)] : m.message[m.mtype])
248 | m.body = m.message.conversation || m.msg.caption || m.msg.text || (m.mtype == 'listResponseMessage') && m.msg.singleSelectReply.selectedRowId || (m.mtype == 'buttonsResponseMessage') && m.msg.selectedButtonId || (m.mtype == 'viewOnceMessage') && m.msg.caption || m.text
249 | let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null
250 | m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : []
251 | if (m.quoted) {
252 | let type = getContentType(quoted)
253 | m.quoted = m.quoted[type]
254 | if (['productMessage'].includes(type)) {
255 | type = getContentType(m.quoted)
256 | m.quoted = m.quoted[type]
257 | }
258 | if (typeof m.quoted === 'string') m.quoted = {
259 | text: m.quoted
260 | }
261 | m.quoted.mtype = type
262 | m.quoted.id = m.msg.contextInfo.stanzaId
263 | m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat
264 | m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false
265 | m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant)
266 | m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id)
267 | m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.conversation || m.quoted.contentText || m.quoted.selectedDisplayText || m.quoted.title || ''
268 | m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : []
269 | m.getQuotedObj = m.getQuotedMessage = async () => {
270 | if (!m.quoted.id) return false
271 | let q = await store.loadMessage(m.chat, m.quoted.id, conn)
272 | return exports.smsg(conn, q, store)
273 | }
274 | let vM = m.quoted.fakeObj = M.fromObject({
275 | key: {
276 | remoteJid: m.quoted.chat,
277 | fromMe: m.quoted.fromMe,
278 | id: m.quoted.id
279 | },
280 | message: quoted,
281 | ...(m.isGroup ? { participant: m.quoted.sender } : {})
282 | })
283 |
284 | /**
285 | *
286 | * @returns
287 | */
288 | m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key })
289 |
290 | /**
291 | *
292 | * @param {*} jid
293 | * @param {*} forceForward
294 | * @param {*} options
295 | * @returns
296 | */
297 | m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options)
298 |
299 | /**
300 | *
301 | * @returns
302 | */
303 | m.quoted.download = () => conn.downloadMediaMessage(m.quoted)
304 | }
305 | }
306 | if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg)
307 | m.text = m.msg.text || m.msg.caption || m.message.conversation || m.msg.contentText || m.msg.selectedDisplayText || m.msg.title || ''
308 | /**
309 | * Reply to this message
310 | * @param {String|Object} text
311 | * @param {String|false} chatId
312 | * @param {Object} options
313 | */
314 | m.reply = (text, chatId = m.chat, options = {}) => Buffer.isBuffer(text) ? conn.sendMedia(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options })
315 | /**
316 | * Copy this message
317 | */
318 | m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m)))
319 |
320 | /**
321 | *
322 | * @param {*} jid
323 | * @param {*} forceForward
324 | * @param {*} options
325 | * @returns
326 | */
327 | m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options)
328 |
329 | return m
330 | }
331 |
332 |
333 | let file = require.resolve(__filename)
334 | fs.watchFile(file, () => {
335 | fs.unwatchFile(file)
336 | console.log(chalk.redBright(`Update ${__filename}`))
337 | delete require.cache[file]
338 | require(file)
339 | })
340 |
--------------------------------------------------------------------------------
/lib/mzazifunc.js:
--------------------------------------------------------------------------------
1 | const { proto, delay, getContentType } = require('@whiskeysockets/baileys')
2 | const chalk = require('chalk')
3 | const fs = require('fs')
4 | const Crypto = require('crypto')
5 | const axios = require('axios')
6 | const moment = require('moment-timezone')
7 | const { sizeFormatter } = require('human-readable')
8 | const util = require('util')
9 | const Jimp = require('jimp')
10 | const { defaultMaxListeners } = require('stream')
11 |
12 |
13 | const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000)
14 |
15 | exports.unixTimestampSeconds = unixTimestampSeconds
16 |
17 | exports.generateMessageTag = (epoch) => {
18 | let tag = (0, exports.unixTimestampSeconds)().toString();
19 | if (epoch)
20 | tag += '.--' + epoch; // attach epoch if provided
21 | return tag;
22 | }
23 |
24 | exports.processTime = (timestamp, now) => {
25 | return moment.duration(now - moment(timestamp * 1000)).asSeconds()
26 | }
27 |
28 | exports.getRandom = (ext) => {
29 | return `${Math.floor(Math.random() * 10000)}${ext}`
30 | }
31 |
32 | exports.getBuffer = async (url, options) => {
33 | try {
34 | options ? options : {}
35 | const res = await axios({
36 | method: "get",
37 | url,
38 | headers: {
39 | 'DNT': 1,
40 | 'Upgrade-Insecure-Request': 1
41 | },
42 | ...options,
43 | responseType: 'arraybuffer'
44 | })
45 | return res.data
46 | } catch (err) {
47 | return err
48 | }
49 | }
50 |
51 | exports.fetchJson = async (url, options) => {
52 | try {
53 | options ? options : {}
54 | const res = await axios({
55 | method: 'GET',
56 | url: url,
57 | headers: {
58 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
59 | },
60 | ...options
61 | })
62 | return res.data
63 | } catch (err) {
64 | return err
65 | }
66 | }
67 |
68 | exports.runtime = function(seconds) {
69 | seconds = Number(seconds);
70 | var d = Math.floor(seconds / (3600 * 24));
71 | var h = Math.floor(seconds % (3600 * 24) / 3600);
72 | var m = Math.floor(seconds % 3600 / 60);
73 | var s = Math.floor(seconds % 60);
74 | var dDisplay = d > 0 ? d + (d == 1 ? " 𝗱𝗮𝘆, " : " 𝗗𝗮𝘆𝘀, ") : "";
75 | var hDisplay = h > 0 ? h + (h == 1 ? " 𝗵𝗼𝘂𝗿, " : " 𝗛𝗼𝘂𝗿𝘀, ") : "";
76 | var mDisplay = m > 0 ? m + (m == 1 ? " 𝗺𝗶𝗻𝘂𝘁𝗲, " : " 𝗠𝗶𝗻𝘂𝘁𝗲𝘀, ") : "";
77 | var sDisplay = s > 0 ? s + (s == 1 ? " 𝘀𝗲𝗰𝗼𝗻𝗱" : " 𝗦𝗲𝗰𝗼𝗻𝗱𝘀") : "";
78 | return dDisplay + hDisplay + mDisplay + sDisplay;
79 | }
80 |
81 | exports.clockString = (ms) => {
82 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000)
83 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60
84 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60
85 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':')
86 | }
87 |
88 | exports.sleep = async (ms) => {
89 | return new Promise(resolve => setTimeout(resolve, ms));
90 | }
91 |
92 | exports.isUrl = (url) => {
93 | return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/, 'gi'))
94 | }
95 |
96 | exports.getTime = (format, date) => {
97 | if (date) {
98 | return moment(date).locale('id').format(format)
99 | } else {
100 | return moment.tz('Africa/Harare').locale('id').format(format)
101 | }
102 | }
103 |
104 | exports.formatDate = (n, locale = 'zw') => {
105 | let d = new Date(n)
106 | return d.toLocaleDateString(locale, {
107 | weekday: 'long',
108 | day: 'numeric',
109 | month: 'long',
110 | year: 'numeric',
111 | hour: 'numeric',
112 | minute: 'numeric',
113 | second: 'numeric'
114 | })
115 | }
116 |
117 | exports.tanggal = (numer) => {
118 | myMonths = ["January","February","March","April","May","June","July","August","September","October","November","December"];
119 | myDays = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'];
120 | var tgl = new Date(numer);
121 | var day = tgl.getDate()
122 | bulan = tgl.getMonth()
123 | var thisDay = tgl.getDay(),
124 | thisDay = myDays[thisDay];
125 | var yy = tgl.getYear()
126 | var year = (yy < 1000) ? yy + 1900 : yy;
127 | const time = moment.tz('Africa/Harare').format('DD/MM HH:mm:ss')
128 | let d = new Date
129 | let locale = 'id'
130 | let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime()
131 | let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5]
132 |
133 | return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}`
134 | }
135 |
136 | exports.formatp = sizeFormatter({
137 | std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC'
138 | decimalPlaces: 2,
139 | keepTrailingZeroes: false,
140 | render: (literal, symbol) => `${literal} ${symbol}B`,
141 | })
142 |
143 | exports.jsonformat = (string) => {
144 | return JSON.stringify(string, null, 2)
145 | }
146 |
147 | function format(...args) {
148 | return util.format(...args)
149 | }
150 |
151 | exports.logic = (check, inp, out) => {
152 | if (inp.length !== out.length) throw new Error('Input and Output must have same length')
153 | for (let i in inp)
154 | if (util.isDeepStrictEqual(check, inp[i])) return out[i]
155 | return null
156 | }
157 |
158 | exports.generateProfilePicture = async (buffer) => {
159 | const jimp = await Jimp.read(buffer)
160 | const min = jimp.getWidth()
161 | const max = jimp.getHeight()
162 | const cropped = jimp.crop(0, 0, min, max)
163 | return {
164 | img: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG),
165 | preview: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG)
166 | }
167 | }
168 |
169 | exports.bytesToSize = (bytes, decimals = 2) => {
170 | if (bytes === 0) return '0 Bytes';
171 |
172 | const k = 1024;
173 | const dm = decimals < 0 ? 0 : decimals;
174 | const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
175 |
176 | const i = Math.floor(Math.log(bytes) / Math.log(k));
177 |
178 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
179 | }
180 |
181 | exports.getSizeMedia = (path) => {
182 | return new Promise((resolve, reject) => {
183 | if (/http/.test(path)) {
184 | axios.get(path)
185 | .then((res) => {
186 | let length = parseInt(res.headers['content-length'])
187 | let size = exports.bytesToSize(length, 3)
188 | if(!isNaN(length)) resolve(size)
189 | })
190 | } else if (Buffer.isBuffer(path)) {
191 | let length = Buffer.byteLength(path)
192 | let size = exports.bytesToSize(length, 3)
193 | if(!isNaN(length)) resolve(size)
194 | } else {
195 | reject('error gatau apah')
196 | }
197 | })
198 | }
199 |
200 | exports.parseMention = (text = '') => {
201 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net')
202 | }
203 |
204 |
205 | /**
206 | * Serialize Message
207 | * @param {WAConnection} conn
208 | * @param {Object} m
209 | * @param {store} store
210 | */
211 |
212 | exports.smsg = (conn, m, store) => {
213 | if (!m) return m
214 | let M = proto.WebMessageInfo
215 | if (m.key) {
216 | m.id = m.key.id
217 | m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16
218 | m.chat = m.key.remoteJid
219 | m.fromMe = m.key.fromMe
220 | m.isGroup = m.chat.endsWith('@g.us')
221 | m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '')
222 | if (m.isGroup) m.participant = conn.decodeJid(m.key.participant) || ''
223 | }
224 | if (m.message) {
225 | m.mtype = getContentType(m.message)
226 | m.msg = (m.mtype == 'viewOnceMessage' ? m.message[m.mtype].message[getContentType(m.message[m.mtype].message)] : m.message[m.mtype])
227 | m.body = m.message.conversation || m.msg.caption || m.msg.text || (m.mtype == 'listResponseMessage') && m.msg.singleSelectReply.selectedRowId || (m.mtype == 'buttonsResponseMessage') && m.msg.selectedButtonId || (m.mtype == 'viewOnceMessage') && m.msg.caption || m.text
228 | let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null
229 | m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : []
230 | if (m.quoted) {
231 | let type = getContentType(quoted)
232 | m.quoted = m.quoted[type]
233 | if (['productMessage'].includes(type)) {
234 | type = getContentType(m.quoted)
235 | m.quoted = m.quoted[type]
236 | }
237 | if (typeof m.quoted === 'string') m.quoted = {
238 | text: m.quoted
239 | }
240 | m.quoted.mtype = type
241 | m.quoted.id = m.msg.contextInfo.stanzaId
242 | m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat
243 | m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false
244 | m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant)
245 | m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id)
246 | m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.conversation || m.quoted.contentText || m.quoted.selectedDisplayText || m.quoted.title || ''
247 | m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : []
248 | m.getQuotedObj = m.getQuotedMessage = async () => {
249 | if (!m.quoted.id) return false
250 | let q = await store.loadMessage(m.chat, m.quoted.id, conn)
251 | return exports.smsg(conn, q, store)
252 | }
253 | let vM = m.quoted.fakeObj = M.fromObject({
254 | key: {
255 | remoteJid: m.quoted.chat,
256 | fromMe: m.quoted.fromMe,
257 | id: m.quoted.id
258 | },
259 | message: quoted,
260 | ...(m.isGroup ? { participant: m.quoted.sender } : {})
261 | })
262 |
263 | /**
264 | *
265 | * @returns
266 | */
267 | m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key })
268 |
269 | /**
270 | *
271 | * @param {*} jid
272 | * @param {*} forceForward
273 | * @param {*} options
274 | * @returns
275 | */
276 | m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options)
277 |
278 | /**
279 | *
280 | * @returns
281 | */
282 | m.quoted.download = () => conn.downloadMediaMessage(m.quoted)
283 | }
284 | }
285 | if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg)
286 | m.text = m.msg.text || m.msg.caption || m.message.conversation || m.msg.contentText || m.msg.selectedDisplayText || m.msg.title || ''
287 | /**
288 | * Reply to this message
289 | * @param {String|Object} text
290 | * @param {String|false} chatId
291 | * @param {Object} options
292 | */
293 | m.reply = (text, chatId = m.chat, options = {}) => Buffer.isBuffer(text) ? conn.sendMedia(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options })
294 | /**
295 | * Copy this message
296 | */
297 | m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m)))
298 |
299 | /**
300 | *
301 | * @param {*} jid
302 | * @param {*} forceForward
303 | * @param {*} options
304 | * @returns
305 | */
306 | m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options)
307 |
308 | return m
309 | }
310 |
311 |
312 | let file = require.resolve(__filename)
313 | fs.watchFile(file, () => {
314 | fs.unwatchFile(file)
315 | console.log(chalk.redBright(`Update ${__filename}`))
316 | delete require.cache[file]
317 | require(file)
318 | })
319 |
--------------------------------------------------------------------------------
/Mzazi/fancy.js:
--------------------------------------------------------------------------------
1 | function apply(map, text) {
2 | let result = "";
3 | for (let character of text.split("")) {
4 | if (map[character] !== undefined) result += map[character];
5 | else if (map[character.toLowerCase()] !== undefined) result += map[character.toLowerCase()];
6 | else result += character;
7 | }
8 | return result;
9 | }
10 |
11 | function list(text, fancy) {
12 | let styles = Object.keys(fancy).filter(e => e.length < 3);
13 | let msg = '\n*Fancy Disponible:*\n\n';
14 | for (let style in styles) {
15 | if (style == 33) {
16 | msg += (parseInt(style) + 1) + '. ' + 'Keith-Md' + '\n';
17 | } else {
18 | msg += (parseInt(style) + 1) + '. ' + fancy.apply(fancy[parseInt(style)], text) + '\n';
19 | }
20 | }
21 | return msg;
22 | }
23 |
24 | module.exports = {
25 | 0:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ค","b":"๖","c":"¢","d":"໓","e":"ē","f":"f","g":"ງ","h":"h","i":"i","j":"ว","k":"k","l":"l","m":"๓","n":"ຖ","o":"໐","p":"p","q":"๑","r":"r","s":"Ş","t":"t","u":"น","v":"ง","w":"ຟ","x":"x","y":"ฯ","z":"ຊ","A":"ค","B":"๖","C":"¢","D":"໓","E":"ē","F":"f","G":"ງ","H":"h","I":"i","J":"ว","K":"k","L":"l","M":"๓","N":"ຖ","O":"໐","P":"p","Q":"๑","R":"r","S":"Ş","T":"t","U":"น","V":"ง","W":"ຟ","X":"x","Y":"ฯ","Z":"ຊ" },
26 | 1:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ą","b":"ც","c":"ƈ","d":"ɖ","e":"ɛ","f":"ʄ","g":"ɠ","h":"ɧ","i":"ı","j":"ʝ","k":"ƙ","l":"Ɩ","m":"ɱ","n":"ŋ","o":"ơ","p":"℘","q":"զ","r":"ཞ","s":"ʂ","t":"ɬ","u":"ų","v":"۷","w":"ῳ","x":"ҳ","y":"ყ","z":"ʑ","A":"ą","B":"ც","C":"ƈ","D":"ɖ","E":"ɛ","F":"ʄ","G":"ɠ","H":"ɧ","I":"ı","J":"ʝ","K":"ƙ","L":"Ɩ","M":"ɱ","N":"ŋ","O":"ơ","P":"℘","Q":"զ","R":"ཞ","S":"ʂ","T":"ɬ","U":"ų","V":"۷","W":"ῳ","X":"ҳ","Y":"ყ","Z":"ʑ" },
27 | 2:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ム","b":"乃","c":"ᄃ","d":"り","e":"乇","f":"キ","g":"ム","h":"ん","i":"ノ","j":"フ","k":"ズ","l":"レ","m":"ᄊ","n":"刀","o":"の","p":"ア","q":"ゐ","r":"尺","s":"丂","t":"イ","u":"ひ","v":"√","w":"W","x":"メ","y":"リ","z":"乙","A":"ム","B":"乃","C":"ᄃ","D":"り","E":"乇","F":"キ","G":"ム","H":"ん","I":"ノ","J":"フ","K":"ズ","L":"レ","M":"ᄊ","N":"刀","O":"の","P":"ア","Q":"ゐ","R":"尺","S":"丂","T":"イ","U":"ひ","V":"√","W":"W","X":"メ","Y":"リ","Z":"乙" },
28 | 3:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"卂","b":"乃","c":"匚","d":"ᗪ","e":"乇","f":"千","g":"Ꮆ","h":"卄","i":"丨","j":"フ","k":"Ҝ","l":"ㄥ","m":"爪","n":"几","o":"ㄖ","p":"卩","q":"Ɋ","r":"尺","s":"丂","t":"ㄒ","u":"ㄩ","v":"ᐯ","w":"山","x":"乂","y":"ㄚ","z":"乙","A":"卂","B":"乃","C":"匚","D":"ᗪ","E":"乇","F":"千","G":"Ꮆ","H":"卄","I":"丨","J":"フ","K":"Ҝ","L":"ㄥ","M":"爪","N":"几","O":"ㄖ","P":"卩","Q":"Ɋ","R":"尺","S":"丂","T":"ㄒ","U":"ㄩ","V":"ᐯ","W":"山","X":"乂","Y":"ㄚ","Z":"乙" },
29 | 4:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"🄰","b":"🄱","c":"🄲","d":"🄳","e":"🄴","f":"🄵","g":"🄶","h":"🄷","i":"🄸","j":"🄹","k":"🄺","l":"🄻","m":"🄼","n":"🄽","o":"🄾","p":"🄿","q":"🅀","r":"🅁","s":"🅂","t":"🅃","u":"🅄","v":"🅅","w":"🅆","x":"🅇","y":"🅈","z":"🅉","A":"🄰","B":"🄱","C":"🄲","D":"🄳","E":"🄴","F":"🄵","G":"🄶","H":"🄷","I":"🄸","J":"🄹","K":"🄺","L":"🄻","M":"🄼","N":"🄽","O":"🄾","P":"🄿","Q":"🅀","R":"🅁","S":"🅂","T":"🅃","U":"🅄","V":"🅅","W":"🅆","X":"🅇","Y":"🅈","Z":"🅉" },
30 | 5:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"Ꮧ","b":"Ᏸ","c":"ፈ","d":"Ꮄ","e":"Ꮛ","f":"Ꭶ","g":"Ꮆ","h":"Ꮒ","i":"Ꭵ","j":"Ꮰ","k":"Ꮶ","l":"Ꮭ","m":"Ꮇ","n":"Ꮑ","o":"Ꭷ","p":"Ꭾ","q":"Ꭴ","r":"Ꮢ","s":"Ꮥ","t":"Ꮦ","u":"Ꮼ","v":"Ꮙ","w":"Ꮗ","x":"ጀ","y":"Ꭹ","z":"ፚ","A":"Ꮧ","B":"Ᏸ","C":"ፈ","D":"Ꮄ","E":"Ꮛ","F":"Ꭶ","G":"Ꮆ","H":"Ꮒ","I":"Ꭵ","J":"Ꮰ","K":"Ꮶ","L":"Ꮭ","M":"Ꮇ","N":"Ꮑ","O":"Ꭷ","P":"Ꭾ","Q":"Ꭴ","R":"Ꮢ","S":"Ꮥ","T":"Ꮦ","U":"Ꮼ","V":"Ꮙ","W":"Ꮗ","X":"ጀ","Y":"Ꭹ","Z":"ፚ" },
31 | 6:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ᗩ","b":"ᗷ","c":"ᑕ","d":"ᗪ","e":"E","f":"ᖴ","g":"G","h":"ᕼ","i":"I","j":"ᒍ","k":"K","l":"ᒪ","m":"ᗰ","n":"ᑎ","o":"O","p":"ᑭ","q":"ᑫ","r":"ᖇ","s":"ᔕ","t":"T","u":"ᑌ","v":"ᐯ","w":"ᗯ","x":"᙭","y":"Y","z":"ᘔ","A":"ᗩ","B":"ᗷ","C":"ᑕ","D":"ᗪ","E":"E","F":"ᖴ","G":"G","H":"ᕼ","I":"I","J":"ᒍ","K":"K","L":"ᒪ","M":"ᗰ","N":"ᑎ","O":"O","P":"ᑭ","Q":"ᑫ","R":"ᖇ","S":"ᔕ","T":"T","U":"ᑌ","V":"ᐯ","W":"ᗯ","X":"᙭","Y":"Y","Z":"ᘔ" },
32 | 7:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ǟ","b":"ɮ","c":"ƈ","d":"ɖ","e":"ɛ","f":"ʄ","g":"ɢ","h":"ɦ","i":"ɨ","j":"ʝ","k":"ӄ","l":"ʟ","m":"ʍ","n":"ռ","o":"օ","p":"ք","q":"զ","r":"ʀ","s":"ֆ","t":"ȶ","u":"ʊ","v":"ʋ","w":"ա","x":"Ӽ","y":"ʏ","z":"ʐ","A":"ǟ","B":"ɮ","C":"ƈ","D":"ɖ","E":"ɛ","F":"ʄ","G":"ɢ","H":"ɦ","I":"ɨ","J":"ʝ","K":"ӄ","L":"ʟ","M":"ʍ","N":"ռ","O":"օ","P":"ք","Q":"զ","R":"ʀ","S":"ֆ","T":"ȶ","U":"ʊ","V":"ʋ","W":"ա","X":"Ӽ","Y":"ʏ","Z":"ʐ" },
33 | 8:{"0":"𝟶","1":"𝟷","2":"𝟸","3":"𝟹","4":"𝟺","5":"𝟻","6":"𝟼","7":"𝟽","8":"𝟾","9":"𝟿","a":"𝚊","b":"𝚋","c":"𝚌","d":"𝚍","e":"𝚎","f":"𝚏","g":"𝚐","h":"𝚑","i":"𝚒","j":"𝚓","k":"𝚔","l":"𝚕","m":"𝚖","n":"𝚗","o":"𝚘","p":"𝚙","q":"𝚚","r":"𝚛","s":"𝚜","t":"𝚝","u":"𝚞","v":"𝚟","w":"𝚠","x":"𝚡","y":"𝚢","z":"𝚣","A":"𝙰","B":"𝙱","C":"𝙲","D":"𝙳","E":"𝙴","F":"𝙵","G":"𝙶","H":"𝙷","I":"𝙸","J":"𝙹","K":"𝙺","L":"𝙻","M":"𝙼","N":"𝙽","O":"𝙾","P":"𝙿","Q":"𝚀","R":"𝚁","S":"𝚂","T":"𝚃","U":"𝚄","V":"𝚅","W":"𝚆","X":"𝚇","Y":"𝚈","Z":"𝚉" },
34 | 9:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"𝙖","b":"𝙗","c":"𝙘","d":"𝙙","e":"𝙚","f":"𝙛","g":"𝙜","h":"𝙝","i":"𝙞","j":"𝙟","k":"𝙠","l":"𝙡","m":"𝙢","n":"𝙣","o":"𝙤","p":"𝙥","q":"𝙦","r":"𝙧","s":"𝙨","t":"𝙩","u":"𝙪","v":"𝙫","w":"𝙬","x":"𝙭","y":"𝙮","z":"𝙯","A":"𝘼","B":"𝘽","C":"𝘾","D":"𝘿","E":"𝙀","F":"𝙁","G":"𝙂","H":"𝙃","I":"𝙄","J":"𝙅","K":"𝙆","L":"𝙇","M":"𝙈","N":"𝙉","O":"𝙊","P":"𝙋","Q":"𝙌","R":"𝙍","S":"𝙎","T":"𝙏","U":"𝙐","V":"𝙑","W":"𝙒","X":"𝙓","Y":"𝙔","Z":"𝙕" },
35 | 10:{"0":"𝟎","1":"𝟏","2":"𝟐","3":"𝟑","4":"𝟒","5":"𝟓","6":"𝟔","7":"𝟕","8":"𝟖","9":"𝟗","a":"𝐚","b":"𝐛","c":"𝐜","d":"𝐝","e":"𝐞","f":"𝐟","g":"𝐠","h":"𝐡","i":"𝐢","j":"𝐣","k":"𝐤","l":"𝐥","m":"𝐦","n":"𝐧","o":"𝐨","p":"𝐩","q":"𝐪","r":"𝐫","s":"𝐬","t":"𝐭","u":"𝐮","v":"𝐯","w":"𝐰","x":"𝐱","y":"𝐲","z":"𝐳","A":"𝐀","B":"𝐁","C":"𝐂","D":"𝐃","E":"𝐄","F":"𝐅","G":"𝐆","H":"𝐇","I":"𝐈","J":"𝐉","K":"𝐊","L":"𝐋","M":"𝐌","N":"𝐍","O":"𝐎","P":"𝐏","Q":"𝐐","R":"𝐑","S":"𝐒","T":"𝐓","U":"𝐔","V":"𝐕","W":"𝐖","X":"𝐗","Y":"𝐘","Z":"𝐙" },
36 | 11:{"0":"𝟬","1":"𝟭","2":"𝟮","3":"𝟯","4":"𝟰","5":"𝟱","6":"𝟲","7":"𝟳","8":"𝟴","9":"𝟵","a":"𝗮","b":"𝗯","c":"𝗰","d":"𝗱","e":"𝗲","f":"𝗳","g":"𝗴","h":"𝗵","i":"𝗶","j":"𝗷","k":"𝗸","l":"𝗹","m":"𝗺","n":"𝗻","o":"𝗼","p":"𝗽","q":"𝗾","r":"𝗿","s":"𝘀","t":"𝘁","u":"𝘂","v":"𝘃","w":"𝘄","x":"𝘅","y":"𝘆","z":"𝘇","A":"𝗔","B":"𝗕","C":"𝗖","D":"𝗗","E":"𝗘","F":"𝗙","G":"𝗚","H":"𝗛","I":"𝗜","J":"𝗝","K":"𝗞","L":"𝗟","M":"𝗠","N":"𝗡","O":"𝗢","P":"𝗣","Q":"𝗤","R":"𝗥","S":"𝗦","T":"𝗧","U":"𝗨","V":"𝗩","W":"𝗪","X":"𝗫","Y":"𝗬","Z":"𝗭" },
37 | 12: {"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"𝘢","b":"𝘣","c":"𝘤","d":"𝘥","e":"𝘦","f":"𝘧","g":"𝘨","h":"𝘩","i":"𝘪","j":"𝘫","k":"𝘬","l":"𝘭","m":"𝘮","n":"𝘯","o":"𝘰","p":"𝘱","q":"𝘲","r":"𝘳","s":"𝘴","t":"𝘵","u":"𝘶","v":"𝘷","w":"𝘸","x":"𝘹","y":"𝘺","z":"𝘻","A":"𝘈","B":"𝘉","C":"𝘊","D":"𝘋","E":"𝘌","F":"𝘍","G":"𝘎","H":"𝘏","I":"𝘐","J":"𝘑","K":"𝘒","L":"𝘓","M":"𝘔","N":"𝘕","O":"𝘖","P":"𝘗","Q":"𝘘","R":"𝘙","S":"𝘚","T":"𝘛","U":"𝘜","V":"𝘝","W":"𝘞","X":"𝘟","Y":"𝘠","Z":"𝘡" },
38 | 13:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"α","b":"Ⴆ","c":"ƈ","d":"ԃ","e":"ҽ","f":"ϝ","g":"ɠ","h":"ԋ","i":"ι","j":"ʝ","k":"ƙ","l":"ʅ","m":"ɱ","n":"ɳ","o":"σ","p":"ρ","q":"ϙ","r":"ɾ","s":"ʂ","t":"ƚ","u":"υ","v":"ʋ","w":"ɯ","x":"x","y":"ყ","z":"ȥ","A":"A","B":"B","C":"C","D":"D","E":"E","F":"F","G":"G","H":"H","I":"I","J":"J","K":"K","L":"L","M":"M","N":"N","O":"O","P":"P","Q":"Q","R":"R","S":"S","T":"T","U":"U","V":"V","W":"W","X":"X","Y":"Y","Z":"Z" },
39 | 14:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"₳","b":"฿","c":"₵","d":"Đ","e":"Ɇ","f":"₣","g":"₲","h":"Ⱨ","i":"ł","j":"J","k":"₭","l":"Ⱡ","m":"₥","n":"₦","o":"Ø","p":"₱","q":"Q","r":"Ɽ","s":"₴","t":"₮","u":"Ʉ","v":"V","w":"₩","x":"Ӿ","y":"Ɏ","z":"Ⱬ","A":"₳","B":"฿","C":"₵","D":"Đ","E":"Ɇ","F":"₣","G":"₲","H":"Ⱨ","I":"ł","J":"J","K":"₭","L":"Ⱡ","M":"₥","N":"₦","O":"Ø","P":"₱","Q":"Q","R":"Ɽ","S":"₴","T":"₮","U":"Ʉ","V":"V","W":"₩","X":"Ӿ","Y":"Ɏ","Z":"Ⱬ" },
40 | 15:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"å","b":"ß","c":"¢","d":"Ð","e":"ê","f":"£","g":"g","h":"h","i":"ï","j":"j","k":"k","l":"l","m":"m","n":"ñ","o":"ð","p":"þ","q":"q","r":"r","s":"§","t":"†","u":"µ","v":"v","w":"w","x":"x","y":"¥","z":"z","A":"Ä","B":"ß","C":"Ç","D":"Ð","E":"È","F":"£","G":"G","H":"H","I":"Ì","J":"J","K":"K","L":"L","M":"M","N":"ñ","O":"Ö","P":"þ","Q":"Q","R":"R","S":"§","T":"†","U":"Ú","V":"V","W":"W","X":"×","Y":"¥","Z":"Z" },
41 | 16:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"α","b":"в","c":"¢","d":"∂","e":"є","f":"ƒ","g":"g","h":"н","i":"ι","j":"נ","k":"к","l":"ℓ","m":"м","n":"η","o":"σ","p":"ρ","q":"q","r":"я","s":"ѕ","t":"т","u":"υ","v":"ν","w":"ω","x":"χ","y":"у","z":"z","A":"α","B":"в","C":"¢","D":"∂","E":"є","F":"ƒ","G":"g","H":"н","I":"ι","J":"נ","K":"к","L":"ℓ","M":"м","N":"η","O":"σ","P":"ρ","Q":"q","R":"я","S":"ѕ","T":"т","U":"υ","V":"ν","W":"ω","X":"χ","Y":"у","Z":"z" },
42 | 17:{"0":"⊘","1":"𝟙","2":"ϩ","3":"Ӡ","4":"५","5":"Ƽ","6":"Ϭ","7":"7","8":"𝟠","9":"९","a":"ą","b":"ҍ","c":"ç","d":"ժ","e":"ҽ","f":"ƒ","g":"ց","h":"հ","i":"ì","j":"ʝ","k":"ҟ","l":"Ӏ","m":"ʍ","n":"ղ","o":"օ","p":"ք","q":"զ","r":"ɾ","s":"ʂ","t":"է","u":"մ","v":"ѵ","w":"ա","x":"×","y":"վ","z":"Հ","A":"Ⱥ","B":"β","C":"↻","D":"Ꭰ","E":"Ɛ","F":"Ƒ","G":"Ɠ","H":"Ƕ","I":"į","J":"ل","K":"Ҡ","L":"Ꝉ","M":"Ɱ","N":"ហ","O":"ට","P":"φ","Q":"Ҩ","R":"འ","S":"Ϛ","T":"Ͳ","U":"Ա","V":"Ỽ","W":"చ","X":"ჯ","Y":"Ӌ","Z":"ɀ" },
43 | 18:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"Λ","b":"B","c":"ᄃ","d":"D","e":"Σ","f":"F","g":"G","h":"Ή","i":"I","j":"J","k":"K","l":"ᄂ","m":"M","n":"П","o":"Ө","p":"P","q":"Q","r":"Я","s":"Ƨ","t":"Ƭ","u":"Ц","v":"V","w":"Щ","x":"X","y":"Y","z":"Z","A":"Λ","B":"B","C":"ᄃ","D":"D","E":"Σ","F":"F","G":"G","H":"Ή","I":"I","J":"J","K":"K","L":"ᄂ","M":"M","N":"П","O":"Ө","P":"P","Q":"Q","R":"Я","S":"Ƨ","T":"Ƭ","U":"Ц","V":"V","W":"Щ","X":"X","Y":"Y","Z":"Z" },
44 | 19:{"0":"₀","1":"₁","2":"₂","3":"₃","4":"₄","5":"₅","6":"₆","7":"₇","8":"₈","9":"₉","a":"ₐ","b":"b","c":"c","d":"d","e":"ₑ","f":"f","g":"g","h":"ₕ","i":"ᵢ","j":"ⱼ","k":"ₖ","l":"ₗ","m":"ₘ","n":"ₙ","o":"ₒ","p":"ₚ","q":"q","r":"ᵣ","s":"ₛ","t":"ₜ","u":"ᵤ","v":"ᵥ","w":"w","x":"ₓ","y":"y","z":"z","A":"ₐ","B":"B","C":"C","D":"D","E":"ₑ","F":"F","G":"G","H":"ₕ","I":"ᵢ","J":"ⱼ","K":"ₖ","L":"ₗ","M":"ₘ","N":"ₙ","O":"ₒ","P":"ₚ","Q":"Q","R":"ᵣ","S":"ₛ","T":"ₜ","U":"ᵤ","V":"ᵥ","W":"W","X":"ₓ","Y":"Y","Z":"Z","+":"₊","-":"₋",":":"₌","(":"₍",")":"₎" },
45 | 20:{"0":"⁰","1":"¹","2":"²","3":"³","4":"⁴","5":"⁵","6":"⁶","7":"⁷","8":"⁸","9":"⁹","a":"ᵃ","b":"ᵇ","c":"ᶜ","d":"ᵈ","e":"ᵉ","f":"ᶠ","g":"ᵍ","h":"ʰ","i":"ⁱ","j":"ʲ","k":"ᵏ","l":"ˡ","m":"ᵐ","n":"ⁿ","o":"ᵒ","p":"ᵖ","q":"q","r":"ʳ","s":"ˢ","t":"ᵗ","u":"ᵘ","v":"ᵛ","w":"ʷ","x":"ˣ","y":"ʸ","z":"ᶻ","A":"ᴬ","B":"ᴮ","C":"ᶜ","D":"ᴰ","E":"ᴱ","F":"ᶠ","G":"ᴳ","H":"ᴴ","I":"ᴵ","J":"ᴶ","K":"ᴷ","L":"ᴸ","M":"ᴹ","N":"ᴺ","O":"ᴼ","P":"ᴾ","Q":"Q","R":"ᴿ","S":"ˢ","T":"ᵀ","U":"ᵁ","V":"ⱽ","W":"ᵂ","X":"ˣ","Y":"ʸ","Z":"ᶻ","+":"⁺","-":"⁻",":":"⁼","(":"⁽",")":"⁾" },
46 | 21:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ค","b":"๒","c":"ς","d":"๔","e":"є","f":"Ŧ","g":"ﻮ","h":"ђ","i":"เ","j":"ן","k":"к","l":"ɭ","m":"๓","n":"ภ","o":"๏","p":"ק","q":"ợ","r":"г","s":"ร","t":"Շ","u":"ย","v":"ש","w":"ฬ","x":"א","y":"ץ","z":"չ","A":"ค","B":"๒","C":"ς","D":"๔","E":"є","F":"Ŧ","G":"ﻮ","H":"ђ","I":"เ","J":"ן","K":"к","L":"ɭ","M":"๓","N":"ภ","O":"๏","P":"ק","Q":"ợ","R":"г","S":"ร","T":"Շ","U":"ย","V":"ש","W":"ฬ","X":"א","Y":"ץ","Z":"չ" },
47 | 22:{"0":"𝟘","1":"𝟙","2":"𝟚","3":"𝟛","4":"𝟜","5":"𝟝","6":"𝟞","7":"𝟟","8":"𝟠","9":"𝟡","a":"𝕒","b":"𝕓","c":"𝕔","d":"𝕕","e":"𝕖","f":"𝕗","g":"𝕘","h":"𝕙","i":"𝕚","j":"𝕛","k":"𝕜","l":"𝕝","m":"𝕞","n":"𝕟","o":"𝕠","p":"𝕡","q":"𝕢","r":"𝕣","s":"𝕤","t":"𝕥","u":"𝕦","v":"𝕧","w":"𝕨","x":"𝕩","y":"𝕪","z":"𝕫","A":"𝔸","B":"𝔹","C":"ℂ","D":"𝔻","E":"𝔼","F":"𝔽","G":"𝔾","H":"ℍ","I":"𝕀","J":"𝕁","K":"𝕂","L":"𝕃","M":"𝕄","N":"ℕ","O":"𝕆","P":"ℙ","Q":"ℚ","R":"ℝ","S":"𝕊","T":"𝕋","U":"𝕌","V":"𝕍","W":"𝕎","X":"𝕏","Y":"𝕐","Z":"ℤ" },
48 | 23:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"𝖆","b":"𝖇","c":"𝖈","d":"𝖉","e":"𝖊","f":"𝖋","g":"𝖌","h":"𝖍","i":"𝖎","j":"𝖏","k":"𝖐","l":"𝖑","m":"𝖒","n":"𝖓","o":"𝖔","p":"𝖕","q":"𝖖","r":"𝖗","s":"𝖘","t":"𝖙","u":"𝖚","v":"𝖛","w":"𝖜","x":"𝖝","y":"𝖞","z":"𝖟","A":"𝕬","B":"𝕭","C":"𝕮","D":"𝕯","E":"𝕰","F":"𝕱","G":"𝕲","H":"𝕳","I":"𝕴","J":"𝕵","K":"𝕶","L":"𝕷","M":"𝕸","N":"𝕹","O":"𝕺","P":"𝕻","Q":"𝕼","R":"𝕽","S":"𝕾","T":"𝕿","U":"𝖀","V":"𝖁","W":"𝖂","X":"𝖃","Y":"𝖄","Z":"𝖅" },
49 | 24:{q:"🆀",w:"🆆",e:"🅴",r:"🆁",t:"🆃",y:"🆈",u:"🆄",i:"🅸",o:"🅾",p:"🅿",a:"🅰",s:"🆂",d:"🅳",f:"🅵",g:"🅶",h:"🅷",j:"🅹",k:"🅺",l:"🅻",z:"🆉",x:"🆇",c:"🅲",v:"🆅",b:"🅱",n:"🅽",m:"🅼"},
50 | 25:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"𝓪","b":"𝓫","c":"𝓬","d":"𝓭","e":"𝓮","f":"𝓯","g":"𝓰","h":"𝓱","i":"𝓲","j":"𝓳","k":"𝓴","l":"𝓵","m":"𝓶","n":"𝓷","o":"𝓸","p":"𝓹","q":"𝓺","r":"𝓻","s":"𝓼","t":"𝓽","u":"𝓾","v":"𝓿","w":"𝔀","x":"𝔁","y":"𝔂","z":"𝔃","A":"𝓐","B":"𝓑","C":"𝓒","D":"𝓓","E":"𝓔","F":"𝓕","G":"𝓖","H":"𝓗","I":"𝓘","J":"𝓙","K":"𝓚","L":"𝓛","M":"𝓜","N":"𝓝","O":"𝓞","P":"𝓟","Q":"𝓠","R":"𝓡","S":"𝓢","T":"𝓣","U":"𝓤","V":"𝓥","W":"𝓦","X":"𝓧","Y":"𝓨","Z":"𝓩" },
51 | 26:{"a":"𝔞","b":"𝔟","c":"𝔠","d":"𝔡","e":"𝔢","f":"𝔣","g":"𝔤","h":"𝔥","i":"𝔦","j":"𝔧","k":"𝔨","l":"𝔩","m":"𝔪","n":"𝔫","o":"𝔬","p":"𝔭","q":"𝔮","r":"𝔯","s":"𝔰","t":"𝔱","u":"𝔲","v":"𝔳","w":"𝔴","x":"𝔵","y":"𝔶","z":"𝔷","A":"𝔄","B":"𝔅","C":"ℭ","D":"𝔇","E":"𝔈","F":"𝔉","G":"𝔊","H":"ℌ","I":"ℑ","J":"𝔍","K":"𝔎","L":"𝔏","M":"𝔐","N":"𝔑","O":"𝔒","P":"𝔓","Q":"𝔔","R":"ℜ","S":"𝔖","T":"𝔗","U":"𝔘","V":"𝔙","W":"𝔚","X":"𝔛","Y":"𝔜","Z":"ℨ" },
52 | 27:{"`":"`","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","0":"0","-":"-",":":"=","~":"~","!":"!","@":"@","#":"#","$":"$","%":"%","^":"^","&":"&","*":"*","(":"(",")":")","_":"_","+":"+","q":"q","w":"w","e":"e","r":"r","t":"t","y":"y","u":"u","i":"i","o":"o","p":"p","[":"[","]":"]","\\":"\\","Q":"Q","W":"W","E":"E","R":"R","T":"T","Y":"Y","U":"U","I":"I","O":"O","P":"P","{":"{","}":"}","|":"|","a":"a","s":"s","d":"d","f":"f","g":"g","h":"h","j":"j","k":"k","l":"l",";":";","'":"'","A":"A","S":"S","D":"D","F":"F","G":"G","H":"H","J":"J","K":"K","L":"L",":":":","\"":"\"","z":"z","x":"x","c":"c","v":"v","b":"b","n":"n","m":"m",",":",",".":".","/":"/","Z":"Z","X":"X","C":"C","V":"V","B":"B","N":"N","M":"M","<":"<",">":">","?":"?"},
53 | 28:{"a":"ᴀ","b":"ʙ","c":"ᴄ","d":"ᴅ","e":"ᴇ","f":"ғ","g":"ɢ","h":"ʜ","i":"ɪ","j":"ᴊ","k":"ᴋ","l":"ʟ","m":"ᴍ","n":"ɴ","o":"ᴏ","p":"ᴘ","q":"ǫ","r":"ʀ","s":"s","t":"ᴛ","u":"ᴜ","v":"ᴠ","w":"ᴡ","x":"x","y":"ʏ","z":"ᴢ","A":"ᴀ","B":"ʙ","C":"ᴄ","D":"ᴅ","E":"ᴇ","F":"ғ","G":"ɢ","H":"ʜ","I":"ɪ","J":"ᴊ","K":"ᴋ","L":"ʟ","M":"ᴍ","N":"ɴ","O":"ᴏ","P":"ᴘ","Q":"ǫ","R":"ʀ","S":"s","T":"ᴛ","U":"ᴜ","V":"ᴠ","W":"ᴡ","X":"x","Y":"ʏ","Z":"ᴢ" },
54 | 29:{"a":"𝒂","b":"𝒃","c":"𝒄","d":"𝒅","e":"𝒆","f":"𝒇","g":"𝒈","h":"𝒉","i":"𝒊","j":"𝒋","k":"𝒌","l":"𝒍","m":"𝒎","n":"𝒏","o":"𝒐","p":"𝒑","q":"𝒒","r":"𝒓","s":"𝒔","t":"𝒕","u":"𝒖","v":"𝒗","w":"𝒘","x":"𝒙","y":"𝒚","z":"𝒛","A":"𝐴","B":"𝐵","C":"𝐶","D":"𝐷","E":"𝐸","F":"𝐹","G":"𝐺","H":"𝐻","I":"𝐼","J":"𝐽","K":"𝐾","L":"𝐿","M":"𝑀","N":"𝑁","O":"𝑂","P":"𝑃","Q":"𝑄","R":"𝑅","S":"𝑆","T":"𝑇","U":"𝑈","V":"𝑉","W":"𝑊","X":"𝑋","Y":"𝑌","Z":"𝑍" },
55 | 30:{"a":"𝛥","b":"𝐵","c":"𝐶","d":"𝐷","e":"𝛯","f":"𝐹","g":"𝐺","h":"𝛨","i":"𝛪","j":"𝐽","k":"𝛫","l":"𝐿","m":"𝛭","n":"𝛮","o":"𝛩","p":"𝛲","q":"𝑄","r":"𝑅","s":"𝑆","t":"𝑇","u":"𝑈","v":"𝛻","w":"𝑊","x":"𝛸","y":"𝑌","z":"𝛧","A":"𝛥","B":"𝐵","C":"𝐶","D":"𝐷","E":"𝛯","F":"𝐹","G":"𝐺","H":"𝛨","I":"𝛪","J":"𝐽","K":"𝛫","L":"𝐿","M":"𝛭","N":"𝛮","O":"𝛩","P":"𝛲","Q":"𝑄","R":"𝑅","S":"𝑆","T":"𝑇","U":"𝑈","V":"𝛻","W":"𝑊","X":"𝛸","Y":"𝑌","Z":"𝛧"},
56 | 31:{"A":"𝚫","B":"𝚩","C":"𝐂","D":"𝐃","E":"𝚵","F":"𝐅","G":"𝐆","H":"𝚮","I":"𝚰","J":"𝐉","K":"𝐊","L":"𝐋","M":"𝚳","N":"𝚴","O":"𝚯","P":"𝚸","Q":"𝐐","R":"𝚪","S":"𝐒","T":"𝚻","U":"𝐔","V":"𝛁","W":"𝐖","X":"𝚾","Y":"𝐘","Z":"𝚭","a":"𝚫","b":"𝚩","c":"𝐂","d":"𝐃","e":"𝚵","f":"𝐅","g":"𝐆","h":"𝚮","i":"𝚰","j":"𝐉","k":"𝐊","l":"𝐋","m":"𝚳","n":"𝚴","o":"𝚯","p":"𝚸","q":"𝐐","r":"𝚪","s":"𝐒","t":"𝚻","u":"𝐔","v":"𝛁","w":"𝐖","x":"𝚾","y":"𝐘","z":"𝚭"},
57 | 32:{"A":"ꪖ","B":"᥇","C":"ᥴ","D":"ᦔ","E":"ꫀ","F":"ᠻ","G":"ᧁ","H":"ꫝ","I":"ﺃ","J":"꠹","K":"ᛕ","L":"ꪶ","M":"ꪑ","N":"ꪀ","O":"ꪮ","P":"ᜣ","Q":"ꪇ","R":"᥅","S":"ᦓ","T":"ꪻ","U":"ꪊ","V":"ꪜ","W":"᭙","X":"᥊","Y":"ꪗ","Z":"ɀ","a":"ꪖ","b":"᥇","c":"ᥴ","d":"ᦔ","e":"ꫀ","f":"ᠻ","g":"ᧁ","h":"ꫝ","i":"ﺃ","j":"꠹","k":"ᛕ","l":"ꪶ","m":"ꪑ","n":"ꪀ","o":"ꪮ","p":"ᜣ","q":"ꪇ","r":"᥅","s":"ᦓ","t":"ꪻ","u":"ꪊ","v":"ꪜ","w":"᭙","x":"᥊","y":"ꪗ","z":"ɀ"},
58 | 33:{"ഒ":"ඉ","എ":"ᬤ","ഉ":"ຂ","ക":"ᤌ","ഗ":"ꪭ","ത":"ꫧ","ന":"ღ͢","മ്പ":"൩","വ":"൨","യ":"ᨨ͓","ര":"ᰍ","ി":"᭄","ീ":"ꪻ","ാ":"ꫂ","(":"ꪶ","ു":"⫰","്":"᷃","്":"ັ","ർ":"൪","ണ":"𑇥̅","ട":"ຮ","ട്ട":"ჴ","െ":"൭͛","ം":"◕","ഞ":"ൡ̅","േ":"ල","ൽ":"ᰢ","ന്ന":"ꢳ"},
59 | apply,
60 | list
61 | };
62 |
--------------------------------------------------------------------------------