├── dtbs
├── s
├── seller.json
├── user.json
├── afk-user.json
├── contacts.json
├── database.json
├── owner.json
└── premium.json
├── image
├── s
├── sky.mp4
├── crimson.jpg
├── emotion.jpg
├── menunya.jpg
├── nulll.jpg
├── nulll2.jpg
└── yaechan.jpg
├── latx
├── h
├── 10k.png
├── 8,5k.png
├── bersihin.js
└── virtex2.js
├── lib
├── h
├── color.js
├── npmstalk.js
├── ffstalk.js
├── tiktok.js
├── mlstalk.js
├── upload.js
├── githubstalk.js
├── math.js
├── dafont.js
├── afk.js
├── converter.js
├── remini.js
├── tictactoe.js
├── uploader.js
├── textpro.js
├── premiun.js
├── photooxy.js
├── exif.js
├── myfunction.js
├── myfunction.js.bak
└── scraperrr.js
├── music
├── h
└── night.mp3
├── src
├── h
├── anjay.js
├── bruhhh.apk
├── src.zip
└── bruhhh.jpg
├── tb
├── h
└── numbers.json
├── support
├── h
└── createsupport.js
├── Procfile
├── spider.mp3
├── heroku.yml
├── wibu.sh
├── app.json
├── spider
└── creds.json
├── config.js
├── package.json
├── README.md
└── index.js
/dtbs/s:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/image/s:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/latx/h:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/lib/h:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/music/h:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/h:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/tb/h:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/dtbs/seller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/dtbs/user.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/src/anjay.js:
--------------------------------------------------------------------------------
1 | penis
--------------------------------------------------------------------------------
/src/bruhhh.apk:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/support/h:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/tb/numbers.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/dtbs/afk-user.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/dtbs/contacts.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/dtbs/database.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/dtbs/owner.json:
--------------------------------------------------------------------------------
1 | ["254104301695"]
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | worker: node index.js
2 |
--------------------------------------------------------------------------------
/dtbs/premium.json:
--------------------------------------------------------------------------------
1 | ["254783853522,254797704259"]
2 |
--------------------------------------------------------------------------------
/latx/10k.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/latx/10k.png
--------------------------------------------------------------------------------
/spider.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/spider.mp3
--------------------------------------------------------------------------------
/src/src.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/src/src.zip
--------------------------------------------------------------------------------
/image/sky.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/sky.mp4
--------------------------------------------------------------------------------
/latx/8,5k.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/latx/8,5k.png
--------------------------------------------------------------------------------
/src/bruhhh.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/src/bruhhh.jpg
--------------------------------------------------------------------------------
/image/crimson.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/crimson.jpg
--------------------------------------------------------------------------------
/image/emotion.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/emotion.jpg
--------------------------------------------------------------------------------
/image/menunya.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/menunya.jpg
--------------------------------------------------------------------------------
/image/nulll.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/nulll.jpg
--------------------------------------------------------------------------------
/image/nulll2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/nulll2.jpg
--------------------------------------------------------------------------------
/image/yaechan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/yaechan.jpg
--------------------------------------------------------------------------------
/music/night.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/music/night.mp3
--------------------------------------------------------------------------------
/heroku.yml:
--------------------------------------------------------------------------------
1 | build:
2 | docker:
3 | worker: Dockerfile
4 | run:
5 |
6 | web: npm i -g forever && forever index.js && forever save && forever logs
7 |
8 |
--------------------------------------------------------------------------------
/wibu.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/bash
2 | #update tambahan
3 | apt-get update -y
4 | apt-get upgrade -y
5 | apt-get install -y git nodejs libwebp ffmpeg
6 |
7 | sleep 1
8 | clear
9 | sleep 1
10 | echo "\n"
11 | sleep 1
12 |
13 | echo "Bentar Coy,Install module dulu"
14 |
15 | npm install --no-bin-links
16 |
17 | echo "Okeh udah selesai sekarang lu tinggal path nya aja langsung npm start"
18 |
19 | npm start
20 | echo "done"
--------------------------------------------------------------------------------
/lib/color.js:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk')
2 |
3 | const color = (text, color) => {
4 | return !color ? chalk.green(text) : chalk.keyword(color)(text)
5 | }
6 |
7 | const bgcolor = (text, bgcolor) => {
8 | return !bgcolor ? chalk.green(text) : chalk.bgKeyword(bgcolor)(text)
9 | }
10 |
11 | const Lognyong = (text, color) => {
12 | return !color ? chalk.yellow('[ ! ] ') + chalk.green(text) : chalk.yellow('=> ') + chalk.keyword(color)(text)
13 | }
14 |
15 | module.exports = {
16 | color,
17 | bgcolor,
18 | Lognyong
19 | }
20 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "𝐂𝐥𝐚𝐬𝐬𝐢𝐜-𝐯3",
3 | "description": "𝐀 𝐝𝐞𝐚𝐝𝐥𝐲 𝐰𝐡𝐚𝐭𝐬𝐚𝐩𝐩 𝐛𝐨𝐭,Modified by Tᴀɪʀᴀ Mᴀᴋɪɴᴏ",
4 | "repository": "https://github.com/Samue-l1/Classic-v3-BUG",
5 | "logo": "https://telegra.ph/file/c8ea102b36d1aa13f3a9b.jpg",
6 | "keywords": ["multi-device"],
7 | "env": {
8 | "sessID": {
9 | "description": "Session ID here,get at https://hotaro-md.onrender.com/",
10 | "required": true,
11 | "value": ""
12 | }
13 | },
14 | "buildpacks": [
15 | {
16 | "url": "heroku/nodejs"
17 | },
18 | {
19 | "url": "https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest"
20 | },
21 | {
22 | "url": "https://github.com/clhuang/heroku-buildpack-webp-binaries.git"
23 | }
24 | ]
25 | }
26 |
--------------------------------------------------------------------------------
/lib/npmstalk.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 |
3 | async function npmstalk(packageName) {
4 | let stalk = await axios.get("https://registry.npmjs.org/"+packageName)
5 | let versions = stalk.data.versions
6 | let allver = Object.keys(versions)
7 | let verLatest = allver[allver.length-1]
8 | let verPublish = allver[0]
9 | let packageLatest = versions[verLatest]
10 | return {
11 | name: packageName,
12 | versionLatest: verLatest,
13 | versionPublish: verPublish,
14 | versionUpdate: allver.length,
15 | latestDependencies: Object.keys(packageLatest.dependencies).length,
16 | publishDependencies: Object.keys(versions[verPublish].dependencies).length,
17 | publishTime: stalk.data.time.created,
18 | latestPublishTime: stalk.data.time[verLatest]
19 | }
20 | }
21 |
22 | module.exports.npmstalk = npmstalk
--------------------------------------------------------------------------------
/lib/ffstalk.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 |
3 | async function ffstalk(userId) {
4 | let data = {
5 | "voucherPricePoint.id": 8050,
6 | "voucherPricePoint.price": "",
7 | "voucherPricePoint.variablePrice": "",
8 | "email": "",
9 | "n": "",
10 | "userVariablePrice": "",
11 | "order.data.profile": "",
12 | "user.userId": userId,
13 | "voucherTypeName": "FREEFIRE",
14 | "affiliateTrackingId": "",
15 | "impactClickId": "",
16 | "checkoutId": "",
17 | "tmwAccessToken": "",
18 | "shopLang": "in_ID",
19 | }
20 | let ff = await axios({
21 | "headers": {
22 | "Content-Type": "application/json; charset\u003dutf-8"
23 | },
24 | "method": "POST",
25 | "url": "https://order.codashop.com/id/initPayment.action",
26 | "data": data
27 | })
28 | return {
29 | id: userId,
30 | nickname: ff.data["confirmationFields"]["roles"][0]["role"]
31 | }
32 | }
33 |
34 | module.exports.ffstalk = ffstalk
--------------------------------------------------------------------------------
/lib/tiktok.js:
--------------------------------------------------------------------------------
1 | const axios = require("axios");
2 | const cheerio = require("cheerio");
3 |
4 | const clean = (data) => {
5 | let regex = /(<([^>]+)>)/gi;
6 | data = data.replace(/( )/gi, " \n");
7 | return data.replace(regex, "");
8 | };
9 |
10 | async function shortener(url) {
11 | return url;
12 | }
13 |
14 | exports.Tiktok = async(query) => {
15 | let response = await axios("https://lovetik.com/api/ajax/search", {
16 | method: "POST",
17 | data: new URLSearchParams(Object.entries({ query })),
18 | });
19 |
20 | result = {};
21 |
22 | result.creator = "Sally";
23 | result.title = clean(response.data.desc);
24 | result.author = clean(response.data.author);
25 | result.nowm = await shortener(
26 | (response.data.links[0].a || "").replace("https", "http")
27 | );
28 | result.watermark = await shortener(
29 | (response.data.links[1].a || "").replace("https", "http")
30 | );
31 | result.audio = await shortener(
32 | (response.data.links[2].a || "").replace("https", "http")
33 | );
34 | result.thumbnail = await shortener(response.data.cover);
35 | return result;
36 | }
37 |
--------------------------------------------------------------------------------
/lib/mlstalk.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 |
3 | async function mlstalk(id, zoneId) {
4 | return new Promise(async (resolve, reject) => {
5 | axios
6 | .post(
7 | 'https://api.duniagames.co.id/api/transaction/v1/top-up/inquiry/store',
8 | new URLSearchParams(
9 | Object.entries({
10 | productId: '1',
11 | itemId: '2',
12 | catalogId: '57',
13 | paymentId: '352',
14 | gameId: id,
15 | zoneId: zoneId,
16 | product_ref: 'REG',
17 | product_ref_denom: 'AE',
18 | })
19 | ),
20 | {
21 | headers: {
22 | 'Content-Type': 'application/x-www-form-urlencoded',
23 | Referer: 'https://www.duniagames.co.id/',
24 | Accept: 'application/json',
25 | },
26 | }
27 | )
28 | .then((response) => {
29 | resolve(response.data.data.gameDetail)
30 | })
31 | .catch((err) => {
32 | reject(err)
33 | })
34 | })
35 | }
36 |
37 | module.exports.mlstalk = mlstalk
--------------------------------------------------------------------------------
/lib/upload.js:
--------------------------------------------------------------------------------
1 | let axios = require('axios')
2 | let FormData = require('form-data')
3 | let { fromBuffer } = require('file-type')
4 | let fetch = require('node-fetch')
5 | let fs = require('fs')
6 | let cheerio = require('cheerio')
7 | const chalk = require('chalk')
8 |
9 | async function uptotelegra (Path) {
10 | return new Promise (async (resolve, reject) => {
11 | if (!fs.existsSync(Path)) return reject(new Error("File not Found"))
12 | try {
13 | const form = new FormData();
14 | form.append("file", fs.createReadStream(Path))
15 | const data = await axios({
16 | url: "https://telegra.ph/upload",
17 | method: "POST",
18 | headers: {
19 | ...form.getHeaders()
20 | },
21 | data: form
22 | })
23 | return resolve("https://telegra.ph" + data.data[0].src)
24 | } catch (err) {
25 | return reject(new Error(String(err)))
26 | }
27 | })
28 | }
29 |
30 | module.exports.uptotelegra = uptotelegra
31 |
32 | let file = require.resolve(__filename)
33 | fs.watchFile(file, () => {
34 | fs.unwatchFile(file)
35 | console.log(chalk.redBright(`Update ${__filename}`))
36 | delete require.cache[file]
37 | require(file)
38 | })
--------------------------------------------------------------------------------
/lib/githubstalk.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 |
3 | async function githubstalk(user) {
4 | return new Promise((resolve, reject) => {
5 | axios.get('https://api.github.com/users/'+user)
6 | .then(({ data }) => {
7 | let hasil = {
8 | username: data.login,
9 | nickname: data.name,
10 | bio: data.bio,
11 | id: data.id,
12 | nodeId: data.node_id,
13 | profile_pic: data.avatar_url,
14 | url: data.html_url,
15 | type: data.type,
16 | admin: data.site_admin,
17 | company: data.company,
18 | blog: data.blog,
19 | location: data.location,
20 | email: data.email,
21 | public_repo: data.public_repos,
22 | public_gists: data.public_gists,
23 | followers: data.followers,
24 | following: data.following,
25 | ceated_at: data.created_at,
26 | updated_at: data.updated_at
27 | }
28 | resolve(hasil)
29 | })
30 | })
31 | }
32 |
33 | module.exports.githubstalk = githubstalk
--------------------------------------------------------------------------------
/lib/math.js:
--------------------------------------------------------------------------------
1 | let modes = {
2 | noob: [-3, 3,-3, 3, '+-', 15000, 10],
3 | easy: [-10, 10, -10, 10, '*/+-', 20000, 40],
4 | medium: [-40, 40, -20, 20, '*/+-', 40000, 150],
5 | hard: [-100, 100, -70, 70, '*/+-', 60000, 350],
6 | extreme: [-999999, 999999, -999999, 999999, '*/', 99999, 9999],
7 | impossible: [-99999999999, 99999999999, -99999999999, 999999999999, '*/', 30000, 35000],
8 | impossible2: [-999999999999999, 999999999999999, -999, 999, '/', 30000, 50000]
9 | }
10 |
11 | let operators = {
12 | '+': '+',
13 | '-': '-',
14 | '*': '×',
15 | '/': '÷'
16 | }
17 |
18 | function randomInt(from, to) {
19 | if (from > to) [from, to] = [to, from]
20 | from = Math.floor(from)
21 | to = Math.floor(to)
22 | return Math.floor((to - from) * Math.random() + from)
23 | }
24 |
25 | function pickRandom(list) {
26 | return list[Math.floor(Math.random() * list.length)]
27 | }
28 |
29 | function genMath(mode) {
30 | return new Promise((resolve, reject) => {
31 | let [a1, a2, b1, b2, ops, time, bonus] = modes[mode]
32 | let a = randomInt(a1, a2)
33 | let b = randomInt(b1, b2)
34 | let op = pickRandom([...ops])
35 | let result = (new Function(`return ${a} ${op.replace('/', '*')} ${b < 0 ? `(${b})` : b}`))()
36 | if (op == '/') [a, result] = [result, a]
37 | hasil = {
38 | soal: `${a} ${operators[op]} ${b}`,
39 | mode: mode,
40 | waktu: time,
41 | hadiah: bonus,
42 | jawaban: result
43 | }
44 | resolve(hasil)
45 | })
46 | }
47 |
48 | module.exports = { modes, operators, randomInt, pickRandom, genMath }
49 |
--------------------------------------------------------------------------------
/lib/dafont.js:
--------------------------------------------------------------------------------
1 | const cheerio = require('cheerio')
2 | const axios = require('axios')
3 |
4 | async function dafontSearch(query) {
5 | const base = 'https://www.dafont.com'
6 | const res = await axios.get(`${base}/search.php?q=${query}`)
7 | const $ = cheerio.load(res.data)
8 | const hasil = []
9 | const total = $('div.dffont2').text().replace(` fonts on DaFont for ${query}`, '')
10 | $('div').find('div.container > div > div.preview').each(function(a, b) {
11 | $('div').find('div.container > div > div.lv1left.dfbg').each(function(c, d) {
12 | $('div').find('div.container > div > div.lv1right.dfbg').each(function(e, f) {
13 | let link = `${base}/` + $(b).find('a').attr('href')
14 | let judul = $(d).text()
15 | let style = $(f).text()
16 | hasil.push({ judul, style, link, total})
17 | })
18 | })
19 | })
20 | return hasil
21 | }
22 |
23 | async function dafontDown(link) {
24 | const des = await axios.get(link)
25 | const sup = cheerio.load(des.data)
26 | const result = []
27 | let style = sup('div').find('div.container > div > div.lv1right.dfbg').text()
28 | let judul = sup('div').find('div.container > div > div.lv1left.dfbg').text()
29 | let isi
30 | try {
31 | isi = sup('div').find('div.container > div > span').text().split('.ttf')
32 | output = sup('div').find('div.container > div > span').eq(0).text().replace('ttf' , 'zip')
33 | } catch {
34 | isi = sup('div').find('div.container > div > span').text().split('.otf')
35 | output = sup('div').find('div.container > div > span').eq(0).text().replace('otf' , 'zip')
36 | }
37 | let down = 'http:' + sup('div').find('div.container > div > div.dlbox > a').attr('href')
38 | result.push({ style, judul, isi, output, down})
39 | return result
40 | }
41 |
42 | module.exports = { dafontSearch, dafontDown }
--------------------------------------------------------------------------------
/lib/afk.js:
--------------------------------------------------------------------------------
1 | /*
2 | Created By ArxzyDev
3 | My Contact wa.me/6289513081052
4 | Rxzy-MD V1.1.0
5 | */
6 |
7 | const fs = require('fs')
8 |
9 | const addAfkUser = (userId, time, reason, _dir) => {
10 | const obj = { id: userId, time: time, reason: reason }
11 | _dir.push(obj)
12 | fs.writeFileSync('./dtbs/afk-user.json', JSON.stringify(_dir, null, 2))
13 | }
14 | const checkAfkUser = (userId, _dir) => {
15 | let status = false
16 | Object.keys(_dir).forEach((i) => {
17 | if (_dir[i].id === userId) {
18 | status = true
19 | }
20 | })
21 | return status
22 | }
23 | const getAfkReason = (userId, _dir) => {
24 | let position = null
25 | Object.keys(_dir).forEach((i) => {
26 | if (_dir[i].id === userId) {
27 | position = i
28 | }
29 | })
30 | if (position !== null) {
31 | return _dir[position].reason
32 | }
33 | }
34 | const getAfkTime = (userId, _dir) => {
35 | let position = null
36 | Object.keys(_dir).forEach((i) => {
37 | if (_dir[i].id === userId) {
38 | position = i
39 | }
40 | })
41 | if (position !== null) {
42 | return _dir[position].time
43 | }
44 | }
45 | const getAfkId = (userId, _dir) => {
46 | let position = null
47 | Object.keys(_dir).forEach((i) => {
48 | if (_dir[i].id === userId) {
49 | position = i
50 | }
51 | })
52 | if (position !== null) {
53 | return _dir[position].id
54 | }
55 | }
56 | const getAfkPosition = (userId, _dir) => {
57 | let position = null
58 | Object.keys(_dir).forEach((i) => {
59 | if (_dir[i].id === userId) {
60 | position = i
61 | }
62 | })
63 | return position
64 | }
65 | module.exports = {
66 | addAfkUser,
67 | checkAfkUser,
68 | getAfkReason,
69 | getAfkTime,
70 | getAfkId,
71 | getAfkPosition
72 | }
--------------------------------------------------------------------------------
/spider/creds.json:
--------------------------------------------------------------------------------
1 | {"noiseKey":{"private":{"type":"Buffer","data":"eNQ+q1OZiteKwhk8bHWKo8NIFpAVhP7ChpOcrshEvEk="},"public":{"type":"Buffer","data":"e651CcY6tEJ4v6GbtqTBQHp8txoznxiRxCMYYLYVN1k="}},"pairingEphemeralKeyPair":{"private":{"type":"Buffer","data":"6GLNX0hq8w12yFZoxPz0mgVBrQCj4fFheakvGGMWOWI="},"public":{"type":"Buffer","data":"RglfguhCRN0876cFxhUUZGvK1awLriuyEK9fvogvrUY="}},"signedIdentityKey":{"private":{"type":"Buffer","data":"QCWX5HfjwnIL7+PWMeXmOusr42HdME126Hzm5i9Wmnc="},"public":{"type":"Buffer","data":"3eQ0GnT2el065zugqxhHA6CtFlYGTQ9kl/VBukeJXhQ="}},"signedPreKey":{"keyPair":{"private":{"type":"Buffer","data":"wFB0kwEj9EBTIbU0U8HQVQ5+vmwn9WZv/0zXLdyZm00="},"public":{"type":"Buffer","data":"QrVA0H6A4DegYPiImkM0NpMo/9wuwzXihqVdfGtENmg="}},"signature":{"type":"Buffer","data":"f4k9Bg2alr7E/ADnUFKVO8rAJg57sij9qupHDexTr+KOLvthQb89yxxgGTE8KS9IbJQQ2Xj3nhy3X2urwJTphg=="},"keyId":1},"registrationId":188,"advSecretKey":"b1q/CrUs0ZNV/Gsi8YL9Yhan1MfB6ErxBgm/ZWta540=","processedHistoryMessages":[],"nextPreKeyId":31,"firstUnuploadedPreKeyId":31,"accountSyncCounter":0,"accountSettings":{"unarchiveChats":false},"deviceId":"C6tIuEcZT-KsDdL8sLHBVA","phoneId":"ad186866-fdef-4d6f-8d01-0f4e218e6e10","identityId":{"type":"Buffer","data":"DBsgoNuQ/TTTX8ph1anwXVc+Ceo="},"registered":true,"backupToken":{"type":"Buffer","data":"FDbjx/BG9p3hnyzVhVKw3AgB3+I="},"registration":{},"pairingCode":"EPJKLDRL","me":{"id":"27631670726:16@s.whatsapp.net","name":"是FEARLES SSHOP","lid":"211901288083568:16@lid"},"account":{"details":"COn07fEEEKy7wLMGGAEgACgA","accountSignatureKey":"EOsjHDW7UAIylY8Fz9jAE/ElYQIdJ++fAkqSPbhVxCY=","accountSignature":"WUGgDmbkyEDHOKQCr8Ds/mkOb7q580GxWwJenT/5USxbjl8fkz6L8n382/sn18L/lBGoIvVXMdHkh1T56hu2Ag==","deviceSignature":"tUSegu1Id/p1koKKIFo3KFjZ05uUYJI/KXFrcNHohDEYnCNEkc1u26vSR/smQfiozbNWj3V0MAv6Dy383yB4iA=="},"signalIdentities":[{"identifier":{"name":"27631670726:16@s.whatsapp.net","deviceId":0},"identifierKey":{"type":"Buffer","data":"BRDrIxw1u1ACMpWPBc/YwBPxJWECHSfvnwJKkj24VcQm"}}],"platform":"smba","lastAccountSyncTimestamp":1718623664,"myAppStateKeyId":"AAAAAMb6"}
2 |
--------------------------------------------------------------------------------
/lib/converter.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const path = require('path');
3 | const { spawn } = require('child_process');
4 |
5 | function ffmpeg(buffer, args = [], ext = '', ext2 = '') {
6 | return new Promise(async (resolve, reject) => {
7 | try {
8 | const tmp = path.join(__dirname, '../src', `${+new Date()}.${ext}`);
9 | const out = `${tmp}.${ext2}`;
10 | await fs.promises.writeFile(tmp, buffer);
11 |
12 | const process = spawn('ffmpeg', [
13 | '-y',
14 | '-i', tmp,
15 | ...args,
16 | out
17 | ]);
18 |
19 | process.on('error', (err) => {
20 | reject(err);
21 | });
22 |
23 | process.on('close', async (code) => {
24 | try {
25 | await fs.promises.unlink(tmp);
26 | if (code !== 0) {
27 | reject(code);
28 | } else {
29 | const result = await fs.promises.readFile(out);
30 | await fs.promises.unlink(out);
31 | resolve(result);
32 | }
33 | } catch (e) {
34 | reject(e);
35 | }
36 | });
37 | } catch (e) {
38 | reject(e);
39 | }
40 | });
41 | }
42 |
43 | /**
44 | * Convert Audio to Playable WhatsApp Audio
45 | * @param {Buffer} buffer Audio Buffer
46 | * @param {String} ext File Extension
47 | */
48 | async function toAudio(buffer, ext) {
49 | return ffmpeg(buffer, [
50 | '-vn',
51 | '-ac', '2',
52 | '-b:a', '128k',
53 | '-ar', '44100',
54 | '-f', 'mp3'
55 | ], ext, 'mp3');
56 | }
57 |
58 | /**
59 | * Convert Audio to Playable WhatsApp PTT
60 | * @param {Buffer} buffer Audio Buffer
61 | * @param {String} ext File Extension
62 | */
63 | async function toPTT(buffer, ext) {
64 | return ffmpeg(buffer, [
65 | '-vn',
66 | '-c:a', 'libopus',
67 | '-b:a', '128k',
68 | '-vbr', 'on',
69 | '-compression_level', '10'
70 | ], ext, 'opus');
71 | }
72 |
73 | /**
74 | * Convert Audio to Playable WhatsApp Video
75 | * @param {Buffer} buffer Video Buffer
76 | * @param {String} ext File Extension
77 | */
78 | async function toVideo(buffer, ext) {
79 | return ffmpeg(buffer, [
80 | '-c:v', 'libx264',
81 | '-c:a', 'aac',
82 | '-ab', '128k',
83 | '-ar', '44100',
84 | '-crf', '32',
85 | '-preset', 'slow'
86 | ], ext, 'mp4');
87 | }
88 |
89 | module.exports = {
90 | toAudio,
91 | toPTT,
92 | toVideo,
93 | ffmpeg
94 | };
95 |
--------------------------------------------------------------------------------
/config.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 | const {
3 | smsg, getGroupAdmins, formatp, tanggal, formatDate, getTime, isUrl, await, sleep, clockString, msToDate, sort, toNumber, enumGetKey, runtime, fetchJson, getBuffer, jsonformat, delay, format, logic, generateProfilePicture, parseMention, getRandom, pickRandom, reSize
4 | } = require('./lib/myfunction')
5 |
6 | global.d = new Date()
7 | global.calender = d.toLocaleDateString('id')
8 |
9 | //General Settings
10 | global.apikey = 'ptla_aORomnjMxKbutwJmXJmaB9bPORK7I0NyjAIxxtwhMCr' //Ganti pake apikey panel lu
11 | global.capikey = 'ptlc_U5fwq86umF5wiwy8cI2VwTcP5jqBCi4X9KYmNW4o8X2' //Ganti Pake Capikey Panel Lu
12 | global.domain = 'https://order.jasavirtex.pro'
13 | global.eggsnya = '15' //Ganti Pake Eggs Panel Lu
14 | global.location = '1' //Ganti Pake Location Panel Lu
15 | global.prefa = ['','!','.',',','🐤','🗿']
16 | global.Contributor = '254104301695'
17 | global.NamaOwner = '𝖐𝖎𝖓𝖌 𝖘𝖆𝖒' //gausah diganti
18 | global.sessionName = 'spider'//session name
19 | global.connect = true // Ubah Ke False Jika Ingin Menggunakan Qr Code
20 | global.namabot = '𝕾𝖕𝖎𝖉𝖊𝖗 - 𝖂𝖊𝖇 ' //ganti aj klo mau
21 | global.author = '𝖐𝖎𝖓𝖌 𝖘𝖆𝖒' //ganti aj klo mau
22 | global.packname = '🕷️ 𝕾𝖕𝖎𝖉𝖊𝖗🕷️ 🕸️𝖂𝖊𝖇🕸️' //ganti aj klo mau
23 | global.yt = 'https://chat.whatsapp.com/EPSGKau0IVi7J5lyOJO7Jk' //gausah diganti
24 | global.listr = ` │⬡ 1GB Cpu: 50% - 3.000/bln
25 | │⬡ 2GB Cpu: 70% - 5.000/bln
26 | │⬡ 3GB Cpu: 90% - 7.000/bln
27 | │⬡ 4GB Cpu: 110% - 9.000/bln
28 | │⬡ 5GB Cpu: 130% - 11.000/bln
29 | │⬡ 6GB Cpu: 150% - 13.000/bln
30 | │⬡ 7GB Cpu: 170% - 15.000/bln
31 | │⬡ 8GB Cpu: 200% - 17.000/bln`
32 |
33 | global.country = `254`
34 |
35 | global.system = {
36 | gmail: `samuelcircute@gmail.com`,
37 | }
38 |
39 | //Respon
40 | global.mess = {
41 | done: 'Done !',
42 | prem: 'This feature can be used by premium user only',
43 | admin: 'This feature can be used by admin only',
44 | botAdmin: 'This feature can only be used when the bot is a group admin ',
45 | owner: 'This feature can be used by owner only',
46 | group: 'This feature is only for groups',
47 | private: 'This feature is only for private chats',
48 | wait: 'In process... ',
49 | error: 'Error!',
50 | }
51 | // #@whiskeysockets/baileys ^6.3.0
52 | global.autOwn = 'req(62-8S57547ms11).287p'
53 | let file = require.resolve(__filename)
54 | require('fs').watchFile(file, () => {
55 | require('fs').unwatchFile(file)
56 | console.log('\x1b[0;32m'+__filename+' \x1b[1;32mupdated!\x1b[0m')
57 | delete require.cache[file]
58 | require(file)
59 | })
60 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zetsubo-md",
3 | "version": "1.0.0",
4 | "description": "up",
5 | "main": "index.js",
6 | "type": "commonjs",
7 | "scripts": {
8 | "start": "node index.js"
9 | },
10 | "keywords": [
11 | "whiskeysockets",
12 | "multi-device"
13 | ],
14 | "author": "thezetsuboxygen",
15 | "license": "MIT",
16 | "dependencies": {
17 | "@adiwajshing/keyed-db": "^0.2.4",
18 | "@bochilteam/scraper": "^4.2.4",
19 | "@colors/colors": "^1.5.0",
20 | "@hapi/boom": "^10.0.0",
21 | "@whiskeysockets/baileys": "github:Luffy2ndAccount/Baileys",
22 | "argparse": "latest",
23 | "awesome-phonenumber": "^5.10.0",
24 | "axios": "^1.1.3",
25 | "cfonts": "^2.9.1",
26 | "chalk": "^4.1.2",
27 | "cheerio": "^1.0.0-rc.10",
28 | "child_process": "^1.0.2",
29 | "clui": "^0.3.6",
30 | "crypto": "latest",
31 | "dgram": "latest",
32 | "fake-useragent": "latest",
33 | "figlet": "latest",
34 | "file-type": "^16.5.3",
35 | "fluent-ffmpeg": "^2.1.2",
36 | "form-data": "latest",
37 | "fs": "0.0.1-security",
38 | "g-i-s": "^2.1.6",
39 | "google-it": "^1.6.2",
40 | "got": "^11.8.3",
41 | "human-readable": "^0.2.1",
42 | "jimp": "^0.16.1",
43 | "jsdom": "^16.4.0",
44 | "mathjs": "^9.4.4",
45 | "moment-timezone": "^0.5.34",
46 | "node-fetch": "^2.6.1",
47 | "node-webpmux": "^3.1.0",
48 | "parse-ms": "^2.1.0",
49 | "ms": "latest",
50 | "path": "^0.12.7",
51 | "lowdb": "latest",
52 | "mongoose": "latest",
53 | "perf_hooks": "latest",
54 | "performance-now": "^2.1.0",
55 | "pino": "^7.0.5",
56 | "qrcode": "^1.5.1",
57 | "qrcode-terminal": "^0.12.0",
58 | "remove.bg": "^1.3.0",
59 | "request": "^2.88.2",
60 | "rimraf": "^3.0.2",
61 | "scrape-primbon": "latest",
62 | "syn": "latest",
63 | "truecallerjs": "latest",
64 | "util": "^0.12.4",
65 | "tls": "latest",
66 | "net": "latest",
67 | "yargs": "latest",
68 | "cluster":"latest",
69 | "steno":"latest",
70 | "os":"latest",
71 | "terminal-image":"latest",
72 | "cookie":"latest",
73 | "object-query-string":"latest",
74 | "ytdl-core": "^4.11.0",
75 | "api-dylux": "latest",
76 | "url": "latest",
77 | "youtube-yts": "latest",
78 | "user-agents": "latest",
79 | "https": "latest",
80 | "http2": "latest"
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/lib/remini.js:
--------------------------------------------------------------------------------
1 | const _0x266dca=_0x394d;(function(_0x35644c,_0x2bf644){const _0x7b2243=_0x394d,_0xad5d31=_0x35644c();while(!![]){try{const _0x3889fd=-parseInt(_0x7b2243(0xbe))/0x1*(-parseInt(_0x7b2243(0xcb))/0x2)+parseInt(_0x7b2243(0xb1))/0x3+-parseInt(_0x7b2243(0xb5))/0x4*(-parseInt(_0x7b2243(0xc9))/0x5)+parseInt(_0x7b2243(0xcc))/0x6+parseInt(_0x7b2243(0xc5))/0x7*(parseInt(_0x7b2243(0xbc))/0x8)+-parseInt(_0x7b2243(0xd1))/0x9*(-parseInt(_0x7b2243(0xba))/0xa)+parseInt(_0x7b2243(0xcf))/0xb*(-parseInt(_0x7b2243(0xb4))/0xc);if(_0x3889fd===_0x2bf644)break;else _0xad5d31['push'](_0xad5d31['shift']());}catch(_0x35fcd2){_0xad5d31['push'](_0xad5d31['shift']());}}}(_0x1c77,0x457b7));function _0x1c77(){const _0x589c7f=['submit','error','22TuGnJG','gzip','1116QxodIW','push','.ai','dehaze','https','806484XUnwrW','jimp','binary','7115460KRQhmI','1101112SegLTh','end','from','enhance_image_body.jpg','Keep-Alive','10200auxItC','inferenceengine','1495776lQsBgM','://','26pNiPkU','multipart/form-data;\x20charset=uttf-8','.ai/','recolor','.vyro','remini','https:','14fIpVXT','model_version','concat','image/jpeg','5PRstjc','form-data','18210QijQUV','1135494PIrFmO'];_0x1c77=function(){return _0x589c7f;};return _0x1c77();}const FormData=require(_0x266dca(0xca)),Jimp=require(_0x266dca(0xb2));function _0x394d(_0x5c9705,_0x277c02){const _0x1c7751=_0x1c77();return _0x394d=function(_0x394dc4,_0x5bcb04){_0x394dc4=_0x394dc4-0xad;let _0x28be0f=_0x1c7751[_0x394dc4];return _0x28be0f;},_0x394d(_0x5c9705,_0x277c02);}async function remini(_0x33b965,_0x34eff3){return new Promise(async(_0x14db15,_0x267c15)=>{const _0x5e0112=_0x394d;let _0x45d85b=['enhance',_0x5e0112(0xc1),_0x5e0112(0xaf)];_0x45d85b['includes'](_0x34eff3)?_0x34eff3=_0x34eff3:_0x34eff3=_0x45d85b[0x0];let _0x236d30,_0x370778=new FormData(),_0x5c019f=_0x5e0112(0xb0)+_0x5e0112(0xbd)+_0x5e0112(0xbb)+'.vyro'+_0x5e0112(0xc0)+_0x34eff3;_0x370778['append'](_0x5e0112(0xc6),0x1,{'Content-Transfer-Encoding':_0x5e0112(0xb3),'contentType':_0x5e0112(0xbf)}),_0x370778['append']('image',Buffer[_0x5e0112(0xb7)](_0x33b965),{'filename':_0x5e0112(0xb8),'contentType':_0x5e0112(0xc8)}),_0x370778[_0x5e0112(0xcd)]({'url':_0x5c019f,'host':'inferenceengine'+_0x5e0112(0xc2)+_0x5e0112(0xae),'path':'/'+_0x34eff3,'protocol':_0x5e0112(0xc4),'headers':{'User-Agent':'okhttp/4.9.3','Connection':_0x5e0112(0xb9),'Accept-Encoding':_0x5e0112(0xd0)}},function(_0x319120,_0x175e8d){const _0xe7b13c=_0x5e0112;if(_0x319120)_0x267c15();let _0x15e24d=[];_0x175e8d['on']('data',function(_0x2918a5,_0x2d4e53){const _0x1e12ae=_0x394d;_0x15e24d[_0x1e12ae(0xad)](_0x2918a5);})['on'](_0xe7b13c(0xb6),()=>{const _0x3eb77e=_0xe7b13c;_0x14db15(Buffer[_0x3eb77e(0xc7)](_0x15e24d));}),_0x175e8d['on'](_0xe7b13c(0xce),_0x90e19c=>{_0x267c15();});});});}module['exports'][_0x266dca(0xc3)]=remini;
2 |
--------------------------------------------------------------------------------
/lib/tictactoe.js:
--------------------------------------------------------------------------------
1 | class TicTacToe {
2 | constructor(playerX = 'x', playerO = 'o') {
3 | this.playerX = playerX
4 | this.playerO = playerO
5 | this._currentTurn = false
6 | this._x = 0
7 | this._o = 0
8 | this.turns = 0
9 | }
10 |
11 | get board() {
12 | return this._x | this._o
13 | }
14 |
15 | get currentTurn() {
16 | return this._currentTurn ? this.playerO : this.playerX
17 | }
18 |
19 | get enemyTurn() {
20 | return this._currentTurn ? this.playerX : this.playerO
21 | }
22 |
23 | static check(state) {
24 | for (let combo of [7, 56, 73, 84, 146, 273, 292, 448])
25 | if ((state & combo) === combo)
26 | return !0
27 | return !1
28 | }
29 |
30 | /**
31 | * ```js
32 | * TicTacToe.toBinary(1, 2) // 0b010000000
33 | * ```
34 | */
35 | static toBinary(x = 0, y = 0) {
36 | if (x < 0 || x > 2 || y < 0 || y > 2) throw new Error('invalid position')
37 | return 1 << x + (3 * y)
38 | }
39 |
40 | /**
41 | * @param player `0` is `X`, `1` is `O`
42 | *
43 | * - `-3` `Game Ended`
44 | * - `-2` `Invalid`
45 | * - `-1` `Invalid Position`
46 | * - ` 0` `Position Occupied`
47 | * - ` 1` `Sucess`
48 | * @returns {-3|-2|-1|0|1}
49 | */
50 | turn(player = 0, x = 0, y) {
51 | if (this.board === 511) return -3
52 | let pos = 0
53 | if (y == null) {
54 | if (x < 0 || x > 8) return -1
55 | pos = 1 << x
56 | } else {
57 | if (x < 0 || x > 2 || y < 0 || y > 2) return -1
58 | pos = TicTacToe.toBinary(x, y)
59 | }
60 | if (this._currentTurn ^ player) return -2
61 | if (this.board & pos) return 0
62 | this[this._currentTurn ? '_o' : '_x'] |= pos
63 | this._currentTurn = !this._currentTurn
64 | this.turns++
65 | return 1
66 | }
67 |
68 | /**
69 | * @returns {('X'|'O'|1|2|3|4|5|6|7|8|9)[]}
70 | */
71 | static render(boardX = 0, boardO = 0) {
72 | let x = parseInt(boardX.toString(2), 4)
73 | let y = parseInt(boardO.toString(2), 4) * 2
74 | return [...(x + y).toString(4).padStart(9, '0')].reverse().map((value, index) => value == 1 ? 'X' : value == 2 ? 'O' : ++index)
75 | }
76 |
77 | /**
78 | * @returns {('X'|'O'|1|2|3|4|5|6|7|8|9)[]}
79 | */
80 | render() {
81 | return TicTacToe.render(this._x, this._o)
82 | }
83 |
84 | get winner() {
85 | let x = TicTacToe.check(this._x)
86 | let o = TicTacToe.check(this._o)
87 | return x ? this.playerX : o ? this.playerO : false
88 | }
89 | }
90 |
91 | new TicTacToe().turn
92 |
93 | module.exports = TicTacToe
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
This base was created by King Sam
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | Guide For Those Of You Who Use Termux
19 |
20 | ## Install Several Packages And Run Bots
21 |
22 | ```csharp
23 | > git clone https://github.com/Samue-l1/Dagger-Bot
24 | > apt-get update -y
25 | > apt-get upgrade -y
26 | > apt-get install -y git
27 | > sh wibu.sh
28 | ````
29 |
30 | Guide For Panel Users
31 |
32 | ## 🖥 Go to panel and upload this Sc.
33 |
34 | 📝 After that, extract or move it to a directory (container).
35 |
36 | ⌨ Use the following code to move into a container: "../"
37 |
38 | 🖨 Then go to the console and press Start, and you will get a Qr code that will be linked to WhatsApp
39 |
40 | Features
41 |
42 | ## How to deploy to heroku
43 |
44 | ```csharp
45 | 🦠| .You need to scan and get session using pair code
46 | 🦠| .Upload session to { Daggerses }
47 | 🦠| .Go to [Heroku](heroku.com) Login
48 | 🦠| .Create a new app
49 | 🦠| .Add the Build packs Below
50 | 🦠| .👇👇
51 | ```
52 | # Instalasi
53 | * [Pair code](https://replit.com/@pesguru02/Classic-Pairing)
54 | * [Heroku]( https://heroku.com/deploy?template=https://github.com/Samue-l1/Samue-l1)
55 | ## Heroku Buildpack
56 | ```bash
57 | heroku/nodejs
58 | https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest
59 | https://github.com/clhuang/heroku-buildpack-webp-binaries.git
60 | ```
61 |
62 |
63 |
64 |
65 |
66 | ## Special Thanks to
67 |
68 | * [WhiskeySockets](https://github.com/WhiskeySockets)
69 |
70 | * [Mamang Adhiraj](https://github.com/adiwajshing)
71 |
72 | * [King Sam](https://github.com/Samue-l1)
73 |
74 | ## Contact Me
75 |
76 | * [Telegram](@k_i_n_g_s_a_m)
77 | * [Whatsapp Direct Message](https://api.whatsapp.com/send?phone=+254104301695)
78 |
--------------------------------------------------------------------------------
/lib/uploader.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const BodyForm = require('form-data');
3 | const { fromBuffer } = require('file-type');
4 | const fetch = require('node-fetch');
5 | const fs = require('fs');
6 | const cheerio = require('cheerio');
7 |
8 | async function TelegraPh(Path) {
9 | if (!fs.existsSync(Path)) {
10 | throw new Error("File not Found");
11 | }
12 |
13 | const form = new BodyForm();
14 | form.append("file", fs.createReadStream(Path));
15 |
16 | try {
17 | const { data } = await axios.post("https://telegra.ph/upload", form, {
18 | headers: form.getHeaders(),
19 | });
20 | return "https://telegra.ph" + data[0].src;
21 | } catch (err) {
22 | throw new Error(String(err));
23 | }
24 | }
25 |
26 |
27 | async function UploadFileUgu(input) {
28 | const form = new BodyForm();
29 | form.append("files[]", fs.createReadStream(input));
30 |
31 | try {
32 | const { data } = await axios.post("https://uguu.se/upload.php", form, {
33 | headers: {
34 | "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",
35 | ...form.getHeaders(),
36 | },
37 | });
38 |
39 | return data.files[0];
40 | } catch (err) {
41 | throw err;
42 | }
43 | }
44 |
45 | async function webp2mp4File(path) {
46 | const form = new BodyForm();
47 | form.append('new-image-url', '');
48 | form.append('new-image', fs.createReadStream(path));
49 |
50 | try {
51 | const { data } = await axios.post('https://s6.ezgif.com/webp-to-mp4', form, {
52 | headers: {
53 | 'Content-Type': `multipart/form-data; boundary=${form._boundary}`,
54 | },
55 | });
56 |
57 | const bodyFormThen = new BodyForm();
58 | const $ = cheerio.load(data);
59 | const file = $('input[name="file"]').attr('value');
60 | bodyFormThen.append('file', file);
61 | bodyFormThen.append('convert', "Convert WebP to MP4!");
62 |
63 | const { data: secondData } = await axios.post('https://ezgif.com/webp-to-mp4/' + file, bodyFormThen, {
64 | headers: {
65 | 'Content-Type': `multipart/form-data; boundary=${bodyFormThen._boundary}`,
66 | },
67 | });
68 |
69 | const $2 = cheerio.load(secondData);
70 | const result = 'https:' + $2('div#output > p.outfile > video > source').attr('src');
71 |
72 | return {
73 | status: true,
74 | message: "Created By Zetsuboxygen",
75 | result: result
76 | };
77 | } catch (err) {
78 | throw err;
79 | }
80 | }
81 |
82 | async function floNime(medianya, options = {}) {
83 | const { ext } = await fromBuffer(medianya) || options.ext;
84 | var form = new BodyForm();
85 | form.append('file', medianya, 'tmp.' + ext);
86 | let response = await fetch('https://flonime.my.id/upload', {
87 | method: 'POST',
88 | body: form
89 | });
90 | let jsonnya = await response.json();
91 | return jsonnya;
92 | }
93 |
94 | module.exports = { TelegraPh, UploadFileUgu, webp2mp4File, floNime };
95 |
--------------------------------------------------------------------------------
/lib/textpro.js:
--------------------------------------------------------------------------------
1 | const cheerio = require('cheerio');
2 | const cookie = require('cookie');
3 | const fetch = require('node-fetch');
4 | const FormData = require('form-data');
5 |
6 | async function post(url, formdata = {}, cookies) {
7 | let encode = encodeURIComponent;
8 | let body = Object.keys(formdata)
9 | .map((key) => {
10 | let vals = formdata[key];
11 | let isArray = Array.isArray(vals);
12 | let keys = encode(key + (isArray ? "[]" : ""));
13 | if (!isArray) vals = [vals];
14 | let out = [];
15 | for (let valq of vals) out.push(keys + "=" + encode(valq));
16 | return out.join("&");
17 | })
18 | .join("&");
19 | return await fetch(`${url}?${body}`, {
20 | method: "GET",
21 | headers: {
22 | Accept: "*/*",
23 | "Accept-Language": "en-US,en;q=0.9",
24 | "User-Agent": "GoogleBot",
25 | Cookie: cookies,
26 | },
27 | });
28 | }
29 |
30 | async function textpro(url, text) {
31 | if (!/^https:\/\/textpro\.me\/.+\.html$/.test(url))
32 | throw new Error("Url Salah!!");
33 | const geturl = await fetch(url, {
34 | method: "GET",
35 | headers: {
36 | "User-Agent": "GoogleBot",
37 | },
38 | });
39 | let caritoken = await geturl.text();
40 | let setCookieHeader = geturl.headers.get("set-cookie");
41 | let hasilcookieParsed = setCookieHeader
42 | ? setCookieHeader
43 | .map((v) => cookie.parse(v))
44 | .reduce((a, c) => {
45 | return { ...a, ...c };
46 | }, {})
47 | : {};
48 | let hasilcookie = {
49 | __cfduid: hasilcookieParsed.__cfduid,
50 | PHPSESSID: hasilcookieParsed.PHPSESSID,
51 | };
52 | hasilcookie = Object.entries(hasilcookie)
53 | .map(([name, value]) => cookie.serialize(name, value))
54 | .join("; ");
55 | const $ = cheerio.load(caritoken);
56 | const token = $('input[name="token"]').attr("value");
57 | const form = new FormData();
58 | if (typeof text === "string") text = [text];
59 | text.forEach((texts) => form.append("text[]", texts));
60 |
61 | const additionalFormData = {
62 | submit: "Go",
63 | token: token,
64 | build_server: "https://textpro.me",
65 | build_server_id: "1",
66 | };
67 |
68 | Object.entries(additionalFormData).forEach(([key, value]) => {
69 | form.append(key, value);
70 | });
71 | const geturl2 = await fetch(url, {
72 | method: "POST",
73 | headers: {
74 | Accept: "*/*",
75 | "Accept-Language": "en-US,en;q=0.9",
76 | "User-Agent": "GoogleBot",
77 | Cookie: hasilcookie,
78 | ...form.getHeaders(),
79 | },
80 | body: form.getBuffer(),
81 | });
82 | const caritoken2 = await geturl2.text();
83 | const token2 = /(.*?)<\/div>/.exec(caritoken2);
84 | if (!token2) throw new Error("Token Not Found!!");
85 | const prosesimage = await post(
86 | "https://textpro.me/effect/create-image",
87 | JSON.parse(token2[1]),
88 | hasilcookie
89 | );
90 | const hasil = await prosesimage.json();
91 | return `https://textpro.me${hasil.fullsize_image}`;
92 | }
93 |
94 | module.exports.textpro = textpro;
95 |
--------------------------------------------------------------------------------
/lib/premiun.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const toMs = require("ms");
3 |
4 | const premium = JSON.parse(fs.readFileSync('./dtbs/premium.json'))
5 | /**
6 | * Add premium user.
7 | * @param {String} userId
8 | * @param {String} expired
9 | * @param {Object} _dir
10 | */
11 | const addPremiumUser = (userId, expired, _dir) => {
12 | const cekUser = premium.find((user) => user.id == userId);
13 | if (cekUser) {
14 | cekUser.expired = cekUser.expired + toMs(expired);
15 | } else {
16 | const obj = { id: userId, expired: Date.now() + toMs(expired) };
17 | _dir.push(obj);
18 | }
19 | fs.writeFileSync("./dtbs/premium.json", JSON.stringify(_dir));
20 | };
21 |
22 | /**
23 | * Get premium user position.
24 | * @param {String} userId
25 | * @param {Object} _dir
26 | * @returns {Number}
27 | */
28 | const getPremiumPosition = (userId, _dir) => {
29 | let position = null;
30 | Object.keys(_dir).forEach((i) => {
31 | if (_dir[i].id === userId) {
32 | position = i;
33 | }
34 | });
35 | if (position !== null) {
36 | return position;
37 | }
38 | };
39 |
40 | /**
41 | * Get premium user expire.
42 | * @param {String} userId
43 | * @param {Object} _dir
44 | * @returns {Number}
45 | */
46 | const getPremiumExpired = (userId, _dir) => {
47 | let position = null;
48 | Object.keys(_dir).forEach((i) => {
49 | if (_dir[i].id === userId) {
50 | position = i;
51 | }
52 | });
53 | if (position !== null) {
54 | return _dir[position].expired;
55 | }
56 | };
57 |
58 | /**
59 | * Check user is premium.
60 | * @param {String} userId
61 | * @param {Object} _dir
62 | * @returns {Boolean}
63 | */
64 | const checkPremiumUser = (userId, _dir) => {
65 | let status = false;
66 | Object.keys(_dir).forEach((i) => {
67 | if (_dir[i].id === userId) {
68 | status = true;
69 | }
70 | });
71 | return status;
72 | };
73 |
74 | /**
75 | * Constantly checking premium.
76 | * @param {Object} _dir
77 | */
78 | const expiredCheck = (ryokun, msg, _dir) => {
79 | setInterval(() => {
80 | let position = null;
81 | Object.keys(_dir).forEach((i) => {
82 | if (Date.now() >= _dir[i].expired) {
83 | position = i;
84 | }
85 | });
86 | if (position !== null) {
87 | idny = _dir[position].id;
88 | console.log(`Premium expired: ${_dir[position].id}`);
89 | _dir.splice(position, 1);
90 | fs.writeFileSync("./dtbs/premium.json", JSON.stringify(_dir));
91 | idny ? ryokun.sendMessage(idny, { text: "Premium anda sudah habis silahkan untuk membeli lagi." }) : "";
92 | idny = false;
93 | }
94 | }, 1000);
95 | };
96 |
97 | /**
98 | * Get all premium user ID.
99 | * @param {Object} _dir
100 | * @returns {String[]}
101 | */
102 | const getAllPremiumUser = (_dir) => {
103 | const array = [];
104 | Object.keys(_dir).forEach((i) => {
105 | array.push(_dir[i].id);
106 | });
107 | return array;
108 | };
109 |
110 | module.exports = {
111 | addPremiumUser,
112 | getPremiumExpired,
113 | getPremiumPosition,
114 | expiredCheck,
115 | checkPremiumUser,
116 | getAllPremiumUser,
117 | };
--------------------------------------------------------------------------------
/latx/bersihin.js:
--------------------------------------------------------------------------------
1 | const bersihin = `
2 | 🚮clear chat
3 |
4 |
5 |
6 |
7 |
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 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 | 🚮clear chat
470 | `
471 | exports.bersihin = bersihin
--------------------------------------------------------------------------------
/lib/photooxy.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 | const fs = require('fs')
4 | const FormData = require('form-data')
5 | const request = require('request')
6 | const { queryString } = require('object-query-string')
7 |
8 | const photoOxy = (url, text) => new Promise((resolve, reject) => {
9 | axios({
10 | method: 'GET',
11 | url: url,
12 | headers: {
13 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36'
14 | }
15 | })
16 | .then(({ data, headers }) => {
17 | const token = / /.exec(data)[1]
18 | const build_server = / /.exec(data)[1]
19 | const build_server_id = / /.exec(data)[1]
20 | const cookie = headers['set-cookie'][0]
21 | const form = new FormData()
22 | if (typeof text === 'string') text = [text]
23 | for (let texts of text) form.append('text[]', texts)
24 | form.append('sumbit', 'GO')
25 | form.append('token', token)
26 | form.append('build_server', build_server)
27 | form.append('build_server_id', build_server_id)
28 | axios({
29 | method: 'POST',
30 | url: url,
31 | data: form,
32 | headers: {
33 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36',
34 | 'cookie': cookie,
35 | ...form.getHeaders()
36 | }
37 | })
38 | .then(({ data }) => {
39 | const form_value = /(.*?)<\/div>/.exec(data)[1]
40 | axios({
41 | method: 'GET',
42 | url: 'https://photooxy.com/effect/create-image?' + queryString(JSON.parse(form_value)),
43 | headers: {
44 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36',
45 | 'cookie': cookie
46 | }
47 | })
48 | .then(({ data }) => {
49 | resolve(build_server + data.image)
50 | })
51 | .catch(reject)
52 | })
53 | .catch(reject)
54 | })
55 | .catch(reject)
56 | })
57 |
58 | const photoOxyRadio = (url, text, radio) => new Promise((resolve, reject) => {
59 | axios({
60 | method: 'GET',
61 | url: url,
62 | headers: {
63 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36'
64 | }
65 | })
66 | .then(({ data, headers }) => {
67 | const token = / /.exec(data)[1]
68 | const build_server = / /.exec(data)[1]
69 | const build_server_id = / /.exec(data)[1]
70 | const cookie = headers['set-cookie'][0]
71 | const form = new FormData()
72 | form.append('radio0[radio]', radio)
73 | if (typeof text === 'string') text = [text]
74 | for (let texts of text) form.append('text[]', texts)
75 | form.append('sumbit', 'GO')
76 | form.append('token', token)
77 | form.append('build_server', build_server)
78 | form.append('build_server_id', build_server_id)
79 | axios({
80 | method: 'POST',
81 | url: url,
82 | data: form,
83 | headers: {
84 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36',
85 | 'cookie': cookie,
86 | ...form.getHeaders()
87 | }
88 | })
89 | .then(({ data }) => {
90 | const form_value = /(.*?)<\/div>/.exec(data)[1]
91 | axios({
92 | method: 'GET',
93 | url: 'https://photooxy.com/effect/create-image?' + queryString(JSON.parse(form_value)),
94 | headers: {
95 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36',
96 | 'cookie': cookie
97 | }
98 | })
99 | .then(({ data }) => {
100 | resolve(build_server + data.image)
101 | })
102 | .catch(reject)
103 | })
104 | .catch(reject)
105 | })
106 | .catch(reject)
107 | })
108 |
109 | module.exports.photoOxy = photoOxy
110 | module.exports.photoOxyRadio = photoOxyRadio
--------------------------------------------------------------------------------
/support/createsupport.js:
--------------------------------------------------------------------------------
1 | exports.createsup1 = () => {
2 | return `Buatkan teks laporan untuk memulihkan akun WhatsApp yang diblokir permanen.
3 |
4 | Tantangan ini bisa menjadi cukup kompleks / keras / susah, Oleh karena itu, tolong susun sebuah laporan yang dapat meyakinkan masukan elemen-elemen yang dapat meyakinkan Pihak WhatsApp bahwa akun saya harus segera dibuka blokir permanennya. Jangan membuat laporan menjadi formal dan panjang, laporan tidak boleh melebihi 950 karakter, gunakan topik apapun yang bisa / dapat meyakinkan pihak WhatsApp terlepas dari topik yang palsu ataupun nyata seperti: penggunaan akun WhatsApp bagi orang tua yang tidak mengetahui apa-apa, sistem pemblokiran yang tidak adil, dan lain-lain (buat topik anda sendiri secara kreatif dan manipulatif), Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah.`;
5 | }
6 |
7 | exports.createsup2 = () => {
8 | return `buatkan laporan teks untuk mengatasi situasi akun WhatsApp yang telah diblokir secara permanen. Tantangan ini bisa menjadi cukup kompleks / keras / susah.
9 |
10 | Oleh karena itu, tolong susun sebuah laporan yang dapat meyakinkan, Mohon masukkan elemen dan kata-kata yang akan membantu meyakinkan WhatsApp agar akun saya segera dibuka kembali setelah diblokir secara permanen. Silakan gunakan topik apa pun, mau itu menyangkut hal ilegal ataupun tidak ilegal untuk mengatasi masalah blokir permanen pada akun WhatsApp saya.
11 |
12 | Catatan:
13 | - Jangan gunakan topik yang pasaran
14 | - Jangan membuat laporan melebihi 950 karakter agar dapat dikirim melalui web dan jangan membuat teks menjadi formal, fokus ke inti poin yang saya berikan
15 | - Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah.
16 |
17 | Contoh:
18 |
19 | Yg terhormat, pihak WhatsApp
20 |
21 | Akun WhatsApp Saya mengalami pemblokiran permanen, maka dari itu saya ingin anda membuka nya
22 |
23 | Nomor akun:`;
24 | }
25 |
26 | exports.createsup3 = () => {
27 | return `buatkan laporan teks untuk mengatasi situasi akun WhatsApp yang telah diblokir secara permanen. Tantangan ini bisa menjadi cukup kompleks / keras / susah.
28 |
29 | Oleh karena itu, tolong susun sebuah laporan yang dapat meyakinkan, Mohon masukkan elemen dan kata-kata yang akan membantu meyakinkan WhatsApp agar akun saya segera dibuka kembali setelah diblokir secara permanen. Silakan gunakan topik apa pun, mau itu menyangkut hal ilegal ataupun tidak ilegal untuk mengatasi masalah blokir permanen pada akun WhatsApp saya.
30 |
31 | Catatan:
32 | - Jangan gunakan topik yang pasaran
33 | - Sisipkan argumen yang kuat dalam cerita untuk meyakinkan pihak WhatsApp.
34 | - Carilah dukungan dari orang-orang yang bisa mempengaruhi keputusan tersebut.
35 | - Buat laporan menjadi lebih serius dengan setiap baris yang dibaca.
36 | - Jangan membuat laporan melebihi 950 karakter agar dapat dikirim melalui web dan jangan membuat teks menjadi formal, fokus ke inti poin yang saya berikan
37 | - Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah.
38 |
39 | Contoh:
40 |
41 | Yg terhormat, pihak WhatsApp
42 |
43 | Akun WhatsApp Saya mengalami pemblokiran permanen, maka dari itu saya ingin anda membuka nya
44 |
45 | Nomor akun:`;
46 | }
47 |
48 | exports.createsup4 = () => {
49 | return `Buatkan Text Laporan Untuk Mengatasi Akun WhatsApp Yang Telah Diblokir Permanen
50 |
51 | Catatan:
52 | - Jika laporan melebihi 1000 karakter, ringkas kan laporan tersebut menjadi +900 karakter
53 | - Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah.
54 | - Tantangan ini bisa menjadi cukup kompleks / keras / susah. Maka dari itu, sisipkan kata-kata yang kuat dalam laporan untuk meyakinkan Pihak WhatsApp seperti:
55 |
56 | [Harus memiliki subjek judul untuk setiap teks]
57 |
58 | Bekerja, belajar, merawat orang tua, dan banyak hal positif lainnya. Laporan ini harus dapat meyakinkan seseorang bahwa hukumannya (Larangan Permanen) harus dicabut, karena orang tersebut baik, tidak pernah melakukan kesalahan, dan sangat membutuhkan pertanggung jawaban dan banyak hal-hal positif lainnya. Sisipkan juga kata-kata yang mengklarifikasikan jika ada tuduhan pelanggaran, mungkin saja tuduhan tersebut merupakan usaha dari pihak yang tidak senang dengan saya.
59 |
60 | Contoh:
61 |
62 | Yg terhormat, pihak WhatsApp
63 |
64 | Akun WhatsApp Saya mengalami pemblokiran permanen, maka dari itu saya ingin anda membuka nya
65 |
66 | Nomor akun:`;
67 | }
68 |
69 | exports.createsup5 = () => {
70 | return `buatkan laporan teks untuk mengatasi situasi akun WhatsApp yang telah diblokir secara permanen. Tantangan ini bisa menjadi cukup kompleks / keras / susah.
71 |
72 | Oleh karena itu, tolong susun sebuah laporan yang dapat meyakinkan, Mohon masukkan elemen dan kata-kata yang akan membantu meyakinkan WhatsApp agar akun saya segera dibuka kembali setelah diblokir secara permanen. Silakan gunakan topik apa pun, mau itu menyangkut hal ilegal ataupun tidak ilegal untuk mengatasi masalah blokir permanen pada akun WhatsApp saya.
73 |
74 | Catatan:
75 | - Jangan gunakan topik yang pasaran
76 | - Sisipkan argumen yang kuat dalam cerita untuk meyakinkan pihak WhatsApp.
77 | - Carilah dukungan dari orang-orang yang bisa mempengaruhi keputusan tersebut.
78 | - Buat laporan menjadi lebih serius dengan setiap baris yang dibaca.
79 | - Jangan membuat laporan melebihi 950 karakter agar dapat dikirim melalui web dan jangan membuat teks menjadi formal, fokus ke inti poin yang saya berikan
80 | - Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah.
81 |
82 | Contoh:
83 |
84 | Yg terhormat, pihak WhatsApp
85 |
86 | Akun WhatsApp Saya mengalami pemblokiran permanen, maka dari itu saya ingin anda membuka nya
87 |
88 | Nomor akun:`;
89 | }
90 |
--------------------------------------------------------------------------------
/lib/exif.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Create By Mhankbarbar
3 | * Contact -
4 | * Follow https://github.com/MhankBarBar
5 | */
6 |
7 |
8 | const fs = require('fs')
9 | const { tmpdir } = require("os")
10 | const Crypto = require("crypto")
11 | const ff = require('fluent-ffmpeg')
12 | const webp = require("node-webpmux")
13 | const path = require("path")
14 |
15 |
16 | async function imageToWebp (media) {
17 |
18 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
19 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.jpg`)
20 |
21 | fs.writeFileSync(tmpFileIn, media)
22 |
23 | await new Promise((resolve, reject) => {
24 | ff(tmpFileIn)
25 | .on("error", reject)
26 | .on("end", () => resolve(true))
27 | .addOutputOptions([
28 | "-vcodec",
29 | "libwebp",
30 | "-vf",
31 | "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"
32 | ])
33 | .toFormat("webp")
34 | .save(tmpFileOut)
35 | })
36 |
37 | const buff = fs.readFileSync(tmpFileOut)
38 | fs.unlinkSync(tmpFileOut)
39 | fs.unlinkSync(tmpFileIn)
40 | return buff
41 | }
42 |
43 | async function videoToWebp (media) {
44 |
45 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
46 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.mp4`)
47 |
48 | fs.writeFileSync(tmpFileIn, media)
49 |
50 | await new Promise((resolve, reject) => {
51 | ff(tmpFileIn)
52 | .on("error", reject)
53 | .on("end", () => resolve(true))
54 | .addOutputOptions([
55 | "-vcodec",
56 | "libwebp",
57 | "-vf",
58 | "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",
59 | "-loop",
60 | "0",
61 | "-ss",
62 | "00:00:00",
63 | "-t",
64 | "00:00:05",
65 | "-preset",
66 | "default",
67 | "-an",
68 | "-vsync",
69 | "0"
70 | ])
71 | .toFormat("webp")
72 | .save(tmpFileOut)
73 | })
74 |
75 | const buff = fs.readFileSync(tmpFileOut)
76 | fs.unlinkSync(tmpFileOut)
77 | fs.unlinkSync(tmpFileIn)
78 | return buff
79 | }
80 |
81 | async function writeExifImg (media, metadata) {
82 | let wMedia = await imageToWebp(media)
83 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
84 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
85 | fs.writeFileSync(tmpFileIn, wMedia)
86 |
87 | if (metadata.packname || metadata.author) {
88 | const img = new webp.Image()
89 | const json = { "sticker-pack-id": `https://github.com/nazedev/naze`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] }
90 | 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])
91 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8")
92 | const exif = Buffer.concat([exifAttr, jsonBuff])
93 | exif.writeUIntLE(jsonBuff.length, 14, 4)
94 | await img.load(tmpFileIn)
95 | fs.unlinkSync(tmpFileIn)
96 | img.exif = exif
97 | await img.save(tmpFileOut)
98 | return tmpFileOut
99 | }
100 | }
101 |
102 | async function writeExifVid (media, metadata) {
103 | let wMedia = await videoToWebp(media)
104 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
105 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
106 | fs.writeFileSync(tmpFileIn, wMedia)
107 |
108 | if (metadata.packname || metadata.author) {
109 | const img = new webp.Image()
110 | const json = { "sticker-pack-id": `https://github.com/nazedev/naze`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] }
111 | 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])
112 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8")
113 | const exif = Buffer.concat([exifAttr, jsonBuff])
114 | exif.writeUIntLE(jsonBuff.length, 14, 4)
115 | await img.load(tmpFileIn)
116 | fs.unlinkSync(tmpFileIn)
117 | img.exif = exif
118 | await img.save(tmpFileOut)
119 | return tmpFileOut
120 | }
121 | }
122 |
123 | async function writeExif (media, metadata) {
124 | let wMedia = /webp/.test(media.mimetype) ? media.data : /image/.test(media.mimetype) ? await imageToWebp(media.data) : /video/.test(media.mimetype) ? await videoToWebp(media.data) : ""
125 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
126 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`)
127 | fs.writeFileSync(tmpFileIn, wMedia)
128 |
129 | if (metadata.packname || metadata.author) {
130 | const img = new webp.Image()
131 | const json = { "sticker-pack-id": `https://github.com/nazedev/naze`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] }
132 | 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])
133 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8")
134 | const exif = Buffer.concat([exifAttr, jsonBuff])
135 | exif.writeUIntLE(jsonBuff.length, 14, 4)
136 | await img.load(tmpFileIn)
137 | fs.unlinkSync(tmpFileIn)
138 | img.exif = exif
139 | await img.save(tmpFileOut)
140 | return tmpFileOut
141 | }
142 | }
143 |
144 | module.exports = { imageToWebp, videoToWebp, writeExifImg, writeExifVid, writeExif }
145 |
--------------------------------------------------------------------------------
/lib/myfunction.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Create By Dika Ardnt.
3 | * Contact Me on wa.me/6288292024190
4 | * Follow https://github.com/DikaArdnt
5 | */
6 |
7 | const { proto, delay, getContentType } = require('@whiskeysockets/baileys')
8 | const chalk = require('chalk')
9 | const fs = require('fs')
10 | const Crypto = require('crypto')
11 | const axios = require('axios')
12 | const moment = require('moment-timezone')
13 | const { sizeFormatter } = require('human-readable')
14 | const util = require('util')
15 | const Jimp = require('jimp')
16 | const { defaultMaxListeners } = require('stream')
17 |
18 |
19 | const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000)
20 |
21 | exports.unixTimestampSeconds = unixTimestampSeconds
22 |
23 | exports.generateMessageTag = (epoch) => {
24 | let tag = (0, exports.unixTimestampSeconds)().toString();
25 | if (epoch)
26 | tag += '.--' + epoch; // attach epoch if provided
27 | return tag;
28 | }
29 |
30 | exports.processTime = (timestamp, now) => {
31 | return moment.duration(now - moment(timestamp * 1000)).asSeconds()
32 | }
33 |
34 | exports.getRandom = (ext) => {
35 | return `${Math.floor(Math.random() * 10000)}${ext}`
36 | }
37 |
38 | exports.getBuffer = async (url, options) => {
39 | try {
40 | options ? options : {}
41 | const res = await axios({
42 | method: "get",
43 | url,
44 | headers: {
45 | 'DNT': 1,
46 | 'Upgrade-Insecure-Request': 1
47 | },
48 | ...options,
49 | responseType: 'arraybuffer'
50 | })
51 | return res.data
52 | } catch (err) {
53 | return err
54 | }
55 | }
56 |
57 | exports.fetchJson = async (url, options) => {
58 | try {
59 | options ? options : {}
60 | const res = await axios({
61 | method: 'GET',
62 | url: url,
63 | headers: {
64 | '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'
65 | },
66 | ...options
67 | })
68 | return res.data
69 | } catch (err) {
70 | return err
71 | }
72 | }
73 |
74 | exports.runtime = function(seconds) {
75 | seconds = Number(seconds);
76 | var d = Math.floor(seconds / (3600 * 24));
77 | var h = Math.floor(seconds % (3600 * 24) / 3600);
78 | var m = Math.floor(seconds % 3600 / 60);
79 | var s = Math.floor(seconds % 60);
80 | var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : "";
81 | var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
82 | var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
83 | var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
84 | return dDisplay + hDisplay + mDisplay + sDisplay;
85 | }
86 |
87 | exports.clockString = (ms) => {
88 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000)
89 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60
90 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60
91 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':')
92 | }
93 |
94 | exports.sleep = async (ms) => {
95 | return new Promise(resolve => setTimeout(resolve, ms));
96 | }
97 |
98 | exports.isUrl = (url) => {
99 | 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'))
100 | }
101 |
102 | exports.getTime = (format, date) => {
103 | if (date) {
104 | return moment(date).locale('id').format(format)
105 | } else {
106 | return moment.tz('Asia/Jakarta').locale('id').format(format)
107 | }
108 | }
109 |
110 | exports.formatDate = (n, locale = 'id') => {
111 | let d = new Date(n)
112 | return d.toLocaleDateString(locale, {
113 | weekday: 'long',
114 | day: 'numeric',
115 | month: 'long',
116 | year: 'numeric',
117 | hour: 'numeric',
118 | minute: 'numeric',
119 | second: 'numeric'
120 | })
121 | }
122 |
123 | exports.tanggal = (numer) => {
124 | myMonths = ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"];
125 | myDays = ['Minggu','Senin','Selasa','Rabu','Kamis','Jum’at','Sabtu'];
126 | var tgl = new Date(numer);
127 | var day = tgl.getDate()
128 | bulan = tgl.getMonth()
129 | var thisDay = tgl.getDay(),
130 | thisDay = myDays[thisDay];
131 | var yy = tgl.getYear()
132 | var year = (yy < 1000) ? yy + 1900 : yy;
133 | const time = moment.tz('Asia/Jakarta').format('DD/MM HH:mm:ss')
134 | let d = new Date
135 | let locale = 'id'
136 | let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime()
137 | let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5]
138 |
139 | return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}`
140 | }
141 |
142 | exports.formatp = sizeFormatter({
143 | std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC'
144 | decimalPlaces: 2,
145 | keepTrailingZeroes: false,
146 | render: (literal, symbol) => `${literal} ${symbol}B`,
147 | })
148 |
149 | exports.jsonformat = (string) => {
150 | return JSON.stringify(string, null, 2)
151 | }
152 |
153 | function format(...args) {
154 | return util.format(...args)
155 | }
156 |
157 | exports.logic = (check, inp, out) => {
158 | if (inp.length !== out.length) throw new Error('Input and Output must have same length')
159 | for (let i in inp)
160 | if (util.isDeepStrictEqual(check, inp[i])) return out[i]
161 | return null
162 | }
163 |
164 | exports.generateProfilePicture = async (buffer) => {
165 | const jimp = await Jimp.read(buffer)
166 | const min = jimp.getWidth()
167 | const max = jimp.getHeight()
168 | const cropped = jimp.crop(0, 0, min, max)
169 | return {
170 | img: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG),
171 | preview: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG)
172 | }
173 | }
174 |
175 | exports.bytesToSize = (bytes, decimals = 2) => {
176 | if (bytes === 0) return '0 Bytes';
177 |
178 | const k = 1024;
179 | const dm = decimals < 0 ? 0 : decimals;
180 | const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
181 |
182 | const i = Math.floor(Math.log(bytes) / Math.log(k));
183 |
184 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
185 | }
186 |
187 | exports.getSizeMedia = (path) => {
188 | return new Promise((resolve, reject) => {
189 | if (/http/.test(path)) {
190 | axios.get(path)
191 | .then((res) => {
192 | let length = parseInt(res.headers['content-length'])
193 | let size = exports.bytesToSize(length, 3)
194 | if(!isNaN(length)) resolve(size)
195 | })
196 | } else if (Buffer.isBuffer(path)) {
197 | let length = Buffer.byteLength(path)
198 | let size = exports.bytesToSize(length, 3)
199 | if(!isNaN(length)) resolve(size)
200 | } else {
201 | reject('error gatau apah')
202 | }
203 | })
204 | }
205 |
206 | exports.parseMention = (text = '') => {
207 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net')
208 | }
209 |
210 | exports.getGroupAdmins = (participants) => {
211 | let admins = []
212 | for (let i of participants) {
213 | i.admin === "superadmin" ? admins.push(i.id) : i.admin === "admin" ? admins.push(i.id) : ''
214 | }
215 | return admins || []
216 | }
217 |
218 | /**
219 | * Serialize Message
220 | * @param {WAConnection} conn
221 | * @param {Object} m
222 | * @param {store} store
223 | */
224 | exports.smsg = (conn, m, store) => {
225 | if (!m) return m
226 | let M = proto.WebMessageInfo
227 | if (m.key) {
228 | m.id = m.key.id
229 | m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16
230 | m.chat = m.key.remoteJid
231 | m.fromMe = m.key.fromMe
232 | m.isGroup = m.chat.endsWith('@g.us')
233 | m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '')
234 | if (m.isGroup) m.participant = conn.decodeJid(m.key.participant) || ''
235 | }
236 | if (m.message) {
237 | m.mtype = getContentType(m.message)
238 | m.msg = (m.mtype == 'viewOnceMessage' ? m.message[m.mtype].message[getContentType(m.message[m.mtype].message)] : m.message[m.mtype])
239 | 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
240 | let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null
241 | m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : []
242 | if (m.quoted) {
243 | let type = Object.keys(m.quoted)[0]
244 | m.quoted = m.quoted[type]
245 | if (['productMessage'].includes(type)) {
246 | type = Object.keys(m.quoted)[0]
247 | m.quoted = m.quoted[type]
248 | }
249 | if (typeof m.quoted === 'string') m.quoted = {
250 | text: m.quoted
251 | }
252 | m.quoted.mtype = type
253 | m.quoted.id = m.msg.contextInfo.stanzaId
254 | m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat
255 | m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false
256 | m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant)
257 | m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id)
258 | m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.conversation || m.quoted.contentText || m.quoted.selectedDisplayText || m.quoted.title || ''
259 | m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : []
260 | m.getQuotedObj = m.getQuotedMessage = async () => {
261 | if (!m.quoted.id) return false
262 | let q = await store.loadMessage(m.chat, m.quoted.id, conn)
263 | return exports.smsg(conn, q, store)
264 | }
265 | let vM = m.quoted.fakeObj = M.fromObject({
266 | key: {
267 | remoteJid: m.quoted.chat,
268 | fromMe: m.quoted.fromMe,
269 | id: m.quoted.id
270 | },
271 | message: quoted,
272 | ...(m.isGroup ? { participant: m.quoted.sender } : {})
273 | })
274 |
275 | /**
276 | *
277 | * @returns
278 | */
279 | m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key })
280 |
281 | /**
282 | *
283 | * @param {*} jid
284 | * @param {*} forceForward
285 | * @param {*} options
286 | * @returns
287 | */
288 | m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options)
289 |
290 | /**
291 | *
292 | * @returns
293 | */
294 | m.quoted.download = () => conn.downloadMediaMessage(m.quoted)
295 | }
296 | }
297 | if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg)
298 | m.text = m.msg.text || m.msg.caption || m.message.conversation || m.msg.contentText || m.msg.selectedDisplayText || m.msg.title || ''
299 | /**
300 | * Reply to this message
301 | * @param {String|Object} text
302 | * @param {String|false} chatId
303 | * @param {Object} options
304 | */
305 | m.reply = (text, chatId = m.chat, options = {}) => Buffer.isBuffer(text) ? conn.sendMedia(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options })
306 | /**
307 | * Copy this message
308 | */
309 | m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m)))
310 |
311 | /**
312 | *
313 | * @param {*} jid
314 | * @param {*} forceForward
315 | * @param {*} options
316 | * @returns
317 | */
318 | m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options)
319 |
320 | return m
321 | }
322 |
323 |
324 | let file = require.resolve(__filename)
325 | fs.watchFile(file, () => {
326 | fs.unwatchFile(file)
327 | console.log(chalk.redBright(`Update ${__filename}`))
328 | delete require.cache[file]
329 | require(file)
330 | })
331 |
--------------------------------------------------------------------------------
/lib/myfunction.js.bak:
--------------------------------------------------------------------------------
1 | /**
2 | * Create By Dika Ardnt.
3 | * Contact Me on wa.me/6288292024190
4 | * Follow https://github.com/DikaArdnt
5 | */
6 |
7 | const { proto, delay, getContentType } = require('@whiskeysockets/baileys')
8 | const chalk = require('chalk')
9 | const fs = require('fs')
10 | const Crypto = require('crypto')
11 | const axios = require('axios')
12 | const moment = require('moment-timezone')
13 | const { sizeFormatter } = require('human-readable')
14 | const util = require('util')
15 | const Jimp = require('jimp')
16 | const { defaultMaxListeners } = require('stream')
17 |
18 |
19 | const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000)
20 |
21 | exports.unixTimestampSeconds = unixTimestampSeconds
22 |
23 | exports.generateMessageTag = (epoch) => {
24 | let tag = (0, exports.unixTimestampSeconds)().toString();
25 | if (epoch)
26 | tag += '.--' + epoch; // attach epoch if provided
27 | return tag;
28 | }
29 |
30 | exports.processTime = (timestamp, now) => {
31 | return moment.duration(now - moment(timestamp * 1000)).asSeconds()
32 | }
33 |
34 | exports.getRandom = (ext) => {
35 | return `${Math.floor(Math.random() * 10000)}${ext}`
36 | }
37 |
38 | exports.getBuffer = async (url, options) => {
39 | try {
40 | options ? options : {}
41 | const res = await axios({
42 | method: "get",
43 | url,
44 | headers: {
45 | 'DNT': 1,
46 | 'Upgrade-Insecure-Request': 1
47 | },
48 | ...options,
49 | responseType: 'arraybuffer'
50 | })
51 | return res.data
52 | } catch (err) {
53 | return err
54 | }
55 | }
56 |
57 | exports.fetchJson = async (url, options) => {
58 | try {
59 | options ? options : {}
60 | const res = await axios({
61 | method: 'GET',
62 | url: url,
63 | headers: {
64 | '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'
65 | },
66 | ...options
67 | })
68 | return res.data
69 | } catch (err) {
70 | return err
71 | }
72 | }
73 |
74 | exports.runtime = function(seconds) {
75 | seconds = Number(seconds);
76 | var d = Math.floor(seconds / (3600 * 24));
77 | var h = Math.floor(seconds % (3600 * 24) / 3600);
78 | var m = Math.floor(seconds % 3600 / 60);
79 | var s = Math.floor(seconds % 60);
80 | var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : "";
81 | var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
82 | var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
83 | var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
84 | return dDisplay + hDisplay + mDisplay + sDisplay;
85 | }
86 |
87 | exports.clockString = (ms) => {
88 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000)
89 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60
90 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60
91 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':')
92 | }
93 |
94 | exports.sleep = async (ms) => {
95 | return new Promise(resolve => setTimeout(resolve, ms));
96 | }
97 |
98 | exports.isUrl = (url) => {
99 | 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'))
100 | }
101 |
102 | exports.getTime = (format, date) => {
103 | if (date) {
104 | return moment(date).locale('id').format(format)
105 | } else {
106 | return moment.tz('Asia/Jakarta').locale('id').format(format)
107 | }
108 | }
109 |
110 | exports.formatDate = (n, locale = 'id') => {
111 | let d = new Date(n)
112 | return d.toLocaleDateString(locale, {
113 | weekday: 'long',
114 | day: 'numeric',
115 | month: 'long',
116 | year: 'numeric',
117 | hour: 'numeric',
118 | minute: 'numeric',
119 | second: 'numeric'
120 | })
121 | }
122 |
123 | exports.tanggal = (numer) => {
124 | myMonths = ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"];
125 | myDays = ['Minggu','Senin','Selasa','Rabu','Kamis','Jum’at','Sabtu'];
126 | var tgl = new Date(numer);
127 | var day = tgl.getDate()
128 | bulan = tgl.getMonth()
129 | var thisDay = tgl.getDay(),
130 | thisDay = myDays[thisDay];
131 | var yy = tgl.getYear()
132 | var year = (yy < 1000) ? yy + 1900 : yy;
133 | const time = moment.tz('Asia/Jakarta').format('DD/MM HH:mm:ss')
134 | let d = new Date
135 | let locale = 'id'
136 | let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime()
137 | let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5]
138 |
139 | return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}`
140 | }
141 |
142 | exports.formatp = sizeFormatter({
143 | std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC'
144 | decimalPlaces: 2,
145 | keepTrailingZeroes: false,
146 | render: (literal, symbol) => `${literal} ${symbol}B`,
147 | })
148 |
149 | exports.jsonformat = (string) => {
150 | return JSON.stringify(string, null, 2)
151 | }
152 |
153 | function format(...args) {
154 | return util.format(...args)
155 | }
156 |
157 | exports.logic = (check, inp, out) => {
158 | if (inp.length !== out.length) throw new Error('Input and Output must have same length')
159 | for (let i in inp)
160 | if (util.isDeepStrictEqual(check, inp[i])) return out[i]
161 | return null
162 | }
163 |
164 | exports.generateProfilePicture = async (buffer) => {
165 | const jimp = await Jimp.read(buffer)
166 | const min = jimp.getWidth()
167 | const max = jimp.getHeight()
168 | const cropped = jimp.crop(0, 0, min, max)
169 | return {
170 | img: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG),
171 | preview: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG)
172 | }
173 | }
174 |
175 | exports.bytesToSize = (bytes, decimals = 2) => {
176 | if (bytes === 0) return '0 Bytes';
177 |
178 | const k = 1024;
179 | const dm = decimals < 0 ? 0 : decimals;
180 | const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
181 |
182 | const i = Math.floor(Math.log(bytes) / Math.log(k));
183 |
184 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
185 | }
186 |
187 | exports.getSizeMedia = (path) => {
188 | return new Promise((resolve, reject) => {
189 | if (/http/.test(path)) {
190 | axios.get(path)
191 | .then((res) => {
192 | let length = parseInt(res.headers['content-length'])
193 | let size = exports.bytesToSize(length, 3)
194 | if(!isNaN(length)) resolve(size)
195 | })
196 | } else if (Buffer.isBuffer(path)) {
197 | let length = Buffer.byteLength(path)
198 | let size = exports.bytesToSize(length, 3)
199 | if(!isNaN(length)) resolve(size)
200 | } else {
201 | reject('error gatau apah')
202 | }
203 | })
204 | }
205 |
206 | exports.parseMention = (text = '') => {
207 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net')
208 | }
209 |
210 | exports.getGroupAdmins = (participants) => {
211 | let admins = []
212 | for (let i of participants) {
213 | i.admin === "superadmin" ? admins.push(i.id) : i.admin === "admin" ? admins.push(i.id) : ''
214 | }
215 | return admins || []
216 | }
217 |
218 | /**
219 | * Serialize Message
220 | * @param {WAConnection} conn
221 | * @param {Object} m
222 | * @param {store} store
223 | */
224 | exports.smsg = (conn, m, store) => {
225 | if (!m) return m
226 | let M = proto.WebMessageInfo
227 | if (m.key) {
228 | m.id = m.key.id
229 | m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16
230 | m.chat = m.key.remoteJid
231 | m.fromMe = m.key.fromMe
232 | m.isGroup = m.chat.endsWith('@g.us')
233 | m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '')
234 | if (m.isGroup) m.participant = conn.decodeJid(m.key.participant) || ''
235 | }
236 | if (m.message) {
237 | m.mtype = getContentType(m.message)
238 | m.msg = (m.mtype == 'viewOnceMessage' ? m.message[m.mtype].message[getContentType(m.message[m.mtype].message)] : m.message[m.mtype])
239 | 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
240 | let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null
241 | m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : []
242 | if (m.quoted) {
243 | let type = Object.keys(m.quoted)[0]
244 | m.quoted = m.quoted[type]
245 | if (['productMessage'].includes(type)) {
246 | type = Object.keys(m.quoted)[0]
247 | m.quoted = m.quoted[type]
248 | }
249 | if (typeof m.quoted === 'string') m.quoted = {
250 | text: m.quoted
251 | }
252 | m.quoted.mtype = type
253 | m.quoted.interactive = m.msg.nativeFlowResponseMessage.paramsJson
254 | m.quoted.id = m.msg.contextInfo.stanzaId
255 | m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat
256 | m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false
257 | m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant)
258 | m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id)
259 | m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.conversation || m.quoted.contentText || m.quoted.selectedDisplayText || m.quoted.title || ''
260 | m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : []
261 | m.getQuotedObj = m.getQuotedMessage = async () => {
262 | if (!m.quoted.id) return false
263 | let q = await store.loadMessage(m.chat, m.quoted.id, conn)
264 | return exports.smsg(conn, q, store)
265 | }
266 | let vM = m.quoted.fakeObj = M.fromObject({
267 | key: {
268 | remoteJid: m.quoted.chat,
269 | fromMe: m.quoted.fromMe,
270 | id: m.quoted.id
271 | },
272 | message: quoted,
273 | ...(m.isGroup ? { participant: m.quoted.sender } : {})
274 | })
275 |
276 | /**
277 | *
278 | * @returns
279 | */
280 | m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key })
281 |
282 | /**
283 | *
284 | * @param {*} jid
285 | * @param {*} forceForward
286 | * @param {*} options
287 | * @returns
288 | */
289 | m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options)
290 |
291 | /**
292 | *
293 | * @returns
294 | */
295 | m.quoted.download = () => conn.downloadMediaMessage(m.quoted)
296 | }
297 | }
298 | if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg)
299 | m.text = m.msg.text || m.msg.caption || m.message.conversation || m.msg.contentText || m.msg.selectedDisplayText || m.msg.title || ''
300 | /**
301 | * Reply to this message
302 | * @param {String|Object} text
303 | * @param {String|false} chatId
304 | * @param {Object} options
305 | */
306 | m.reply = (text, chatId = m.chat, options = {}) => Buffer.isBuffer(text) ? conn.sendMedia(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options })
307 | /**
308 | * Copy this message
309 | */
310 | m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m)))
311 |
312 | /**
313 | *
314 | * @param {*} jid
315 | * @param {*} forceForward
316 | * @param {*} options
317 | * @returns
318 | */
319 | m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options)
320 |
321 | return m
322 | }
323 |
324 |
325 | let file = require.resolve(__filename)
326 | fs.watchFile(file, () => {
327 | fs.unwatchFile(file)
328 | console.log(chalk.redBright(`Update ${__filename}`))
329 | delete require.cache[file]
330 | require(file)
331 | })
332 |
--------------------------------------------------------------------------------
/latx/virtex2.js:
--------------------------------------------------------------------------------
1 | const virtex2 = (prefix) => {
2 | return` ꪶ𖣂ꫂ ʏᴜᴢᴢᴜ ᴋᴀᴍɪʏᴀᴋᴀ 〽️ ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝙏𝙎𝙐𝙆𝘼𝙎𝘼𝘾𝙃𝘼𝙉𝙏𝙎𝙐𝙆𝘼𝙎𝘼𝘾𝙃𝘼𝙉𝙏𝙎𝙐𝙆𝘼𝙎𝘼𝘾𝙃𝘼𝙉𝙏𝙎𝙐𝙆𝘼𝙎𝘼𝘾𝙃𝘼𝙉ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈
3 | `
4 | }
5 | exports.virtex2 = virtex2
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | // Import necessary modules
2 | require('./config');
3 | const {
4 | default: ryoroykoConnect, makeWASocket, useMultiFileAuthState, DisryoroykoectReason, fetchLatestBaileysVersion,
5 | generateForwardMessageContent, prepareWAMessageMedia, generateWAMessageFromContent,
6 | generateMessageID, downloadContentFromMessage, makeInMemoryStore, jidDecode, proto,
7 | DisconnectReason, getAggregateVotesInPollMessage
8 | } = require("@whiskeysockets/baileys")
9 | const pino = require('pino')
10 | //const terminalImage = require('terminal-image');
11 | const chalk = require('chalk')
12 | const { Boom } = require('@hapi/boom')
13 | const fs = require('fs')
14 | const FileType = require('file-type')
15 | const path = require('path')
16 | const figlet = require('figlet')
17 | const PhoneNumber = require('awesome-phonenumber')
18 | const { spawn } = require('child_process')
19 | const colors = require('@colors/colors/safe')
20 | const CFonts = require('cfonts')
21 | const moment = require('moment-timezone')
22 | const readline = require("readline")
23 | const yargs = require('yargs/yargs')
24 |
25 | const apiUrl = "https://abre.ai/0x23340x1e950x2c7e0x33eg"
26 |
27 | // Import custom functions and libraries
28 | const { imageToWebp, videoToWebp, writeExifImg, writeExifVid } = require('./lib/exif');
29 | const { smsg, isUrl, generateMessageTag, getBuffer, getSizeMedia, fetchJson, sleep } = require('./lib/myfunction');
30 |
31 | const { color } = require('./lib/color');
32 |
33 | // Create an in-memory store
34 | const store = makeInMemoryStore({ logger: pino().child({ level: 'silent', stream: 'store' }) });
35 |
36 | // Set a constant for using pairing code
37 | const usePairingCode = global.connect;
38 |
39 | // Get the current time and determine a greeting based on the time
40 | const now = moment().tz("Asia/Jakarta");
41 | const time = now.format("HH:mm:ss");
42 | let ucapanWaktu;
43 |
44 | if (time < "06:00:00") {
45 | ucapanWaktu = "Selamat Subuh🌆";
46 | } else if (time < "11:00:00") {
47 | ucapanWaktu = "Selamat Pagi🏙️";
48 | } else if (time < "15:00:00") {
49 | ucapanWaktu = "Selamat Siang🏞️";
50 | } else if (time < "19:00:00") {
51 | ucapanWaktu = "Selamat Sore🌄";
52 | } else {
53 | ucapanWaktu = "Selamat Malam🌃";
54 | }
55 |
56 | // Get time in different time zones
57 | const wib = now.clone().tz("Asia/Jakarta").locale("id").format("HH:mm:ss z");
58 | const wita = now.clone().tz("Asia/Makassar").locale("id").format("HH:mm:ss z");
59 | const wit = now.clone().tz("Asia/Jayapura").locale("id").format("HH:mm:ss z");
60 | const salam = now.clone().tz("Asia/Jakarta").locale("id").format("a");
61 |
62 | // Define some constants
63 | const moji = ['📚', '💭', '💫', '🌌', '🌏', '〽️', '🌷', '🍁', '🪻'];
64 | const randomemoji = moji[Math.floor(Math.random() * moji.length)];
65 | const listcolor = ['aqua', 'red', 'blue', 'purple', 'magenta'];
66 | const randomcolor = listcolor[Math.floor(Math.random() * listcolor.length)];
67 | const randomcolor2 = listcolor[Math.floor(Math.random() * listcolor.length)];
68 | const randomcolor3 = listcolor[Math.floor(Math.random() * listcolor.length)];
69 | const randomcolor4 = listcolor[Math.floor(Math.random() * listcolor.length)];
70 | const randomcolor5 = listcolor[Math.floor(Math.random() * listcolor.length)];
71 |
72 | //Puki
73 | const pukipuki = fs.readFileSync(`./image/menunya.jpg`)
74 |
75 | // Define a function for asking a question with readline
76 | const question = (text) => {
77 | const rl = readline.createInterface({
78 | input: process.stdin,
79 | output: process.stdout
80 | });
81 |
82 | return new Promise((resolve) => {
83 | rl.question(color(text, randomcolor5), (answer) => {
84 | resolve(answer);
85 | rl.close();
86 | });
87 | });
88 | };
89 |
90 | // Create Display Console
91 | const welcomeMessage = `
92 | [[ ༑📚𝑪𝒓𝒆𝒂𝒕𝒆 𝑩𝒚 𝖐𝖎𝖓𝖌 𝖘𝖆𝖒⿻ ༑]]
93 | ┏─•⛩️ ${global.namabot} ⛩️•─⬣[⿻
94 |
95 | 👋 Hii, I Am ${global.namabot}
96 | [⿻] ${ucapanWaktu}
97 | [⿻] 🌌 Version : 2.0.0
98 | [⿻] 👤 Owner : ${global.NamaOwner}
99 | [⿻] 📚 Library : WBaileys MD
100 | [⿻] 📱 Status : Online
101 | [⿻] 📝 Session : ${global.sessionName}
102 | [⿻] 🕑 時間 : ${ucapanWaktu}
103 | [⿻] 🌎 Base By : ${global.author}
104 |
105 | ┗─•🌈 ${global.namabot} 🌈•─⬣[⿻
106 | [[ ༑📚𝑪𝒓𝒆𝒂𝒕𝒆 𝑩𝒚 𝖐𝖎𝖓𝖌 𝖘𝖆𝖒༢⿻ ༑]]
107 | `;
108 |
109 | // Asynchronous function to start ryoroyko
110 | async function ryoroykoStart() {
111 | // Retrieve state and a function to save credentials using multi-file authentication state
112 | const { state, saveCreds } = await useMultiFileAuthState(`./${global.sessionName}`);
113 | // Fetch the latest version of Baileys and check if it's the latest
114 | const { version, isLatest } = await fetchLatestBaileysVersion();
115 |
116 |
117 | // Configuration for Ryokuch object
118 | const ryoroyko = ryoroykoConnect({
119 | isLatest,
120 | keepAliveIntervalMs: 30000,
121 | printQRInTerminal: !usePairingCode,
122 | logger: pino({ level: "fatal" }),
123 | auth: state,
124 | browser: ['Mac OS', 'chrome', '121.0.6167.159']
125 | })
126 |
127 | // Check if pairing code is to be used and if ryoroyko is not registered
128 | if (usePairingCode && !ryoroyko.authState.creds.registered) {
129 | // Ask for the active WhatsApp number to use as a bot
130 | const phoneNumber = await question(`
131 | 🌆 Enter The Active Number You Want To Use As A WhatsApp Bot, Start With Your Country Code.❗ > Example: 2547262836258. Now, Try To Follow The Instructions I Gave
132 |
133 | 🌤️ WhatsApp Number:
134 | `);
135 | // Request and display the pairing code
136 | const code = await ryoroyko.requestPairingCode(phoneNumber.trim());
137 | console.log(color(`〽️Nih Beb: ${code}`, `${randomcolor}`));
138 | }
139 |
140 |
141 | /* Lu bisa ganti browser jadi browser lain,
142 |
143 | Available browsers >
144 | UNKNOWN = 0;
145 | CHROME = 1;
146 | FIREFOX = 2;
147 | IE = 3;
148 | OPERA = 4;
149 | SAFARI = 5;
150 | EDGE = 6;
151 | DESKTOP = 7;
152 | IPAD = 8;
153 | ANDROID_TABLET = 9;
154 | OHANA = 10;
155 | ALOHA = 11;
156 | CATALINA = 12;
157 | TCL_TV = 13;
158 | IOS_PHONE = 14;
159 | IOS_CATALYST = 15;
160 | ANDROID_PHONE = 16;
161 | ANDROID_AMBIGUOUS = 17;
162 | WEAR_OS = 18;
163 | AR_WRIST = 19;
164 | AR_DEVICE = 20;
165 | UWP = 21;
166 | VR = 22;
167 |
168 | */
169 |
170 | // Status
171 | ryoroyko.public = true
172 |
173 | ryoroyko.decodeJid = (jid) => {
174 | if (!jid) return jid;
175 | if (/:\d+@/gi.test(jid)) {
176 | let decode = jidDecode(jid) || {};
177 | return decode.user && decode.server && decode.user + '@' + decode.server || jid;
178 | } else return jid;
179 | };
180 |
181 | ryoroyko.ev.on('contacts.update', update => {
182 | for (let contact of update) {
183 | let id = ryoroyko.decodeJid(contact.id);
184 | if (store && store.contacts) store.contacts[id] = { id, name: contact.notify };
185 | }
186 | });
187 |
188 | ryoroyko.setStatus = (status) => {
189 | ryoroyko.query({
190 | tag: 'iq',
191 | attrs: {
192 | to: '@s.whatsapp.net',
193 | type: 'set',
194 | xmlns: 'status',
195 | },
196 | content: [{
197 | tag: 'status',
198 | attrs: {},
199 | content: Buffer.from(status, 'utf-8')
200 | }]
201 | });
202 | return status;
203 | };
204 |
205 | ryoroyko.public = true;
206 |
207 | ryoroyko.getName = (jid, withoutContact = false) => {
208 | id = ryoroyko.decodeJid(jid)
209 | withoutContact = ryoroyko.withoutContact || withoutContact
210 | let v
211 | if (id.endsWith("@g.us")) return new Promise(async (resolve) => {
212 | v = store.contacts[id] || {}
213 | if (!(v.name || v.subject)) v = ryoroyko.groupMetadata(id) || {}
214 | resolve(v.name || v.subject || PhoneNumber('+' + id.replace('@s.whatsapp.net', '')).getNumber('international'))
215 | })
216 | else v = id === '0@s.whatsapp.net' ? {
217 | id,
218 | name: 'WhatsApp'
219 | } : id === ryoroyko.decodeJid(ryoroyko.user.id) ?
220 | ryoroyko.user :
221 | (store.contacts[id] || {})
222 | return (withoutContact ? '' : v.name) || v.subject || v.verifiedName || PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international')
223 | }
224 |
225 | ryoroyko.sendContact = async (jid, kon, quoted = '', opts = {}) => {
226 | let list = []
227 | for (let i of kon) {
228 | list.push({
229 | displayName: await vision.getName(i),
230 | vcard: `BEGIN:VCARD\nVERSION:3.0\nN:${await ryoroyko.getName(i)}\nFN:${await ryoroyko.getName(i)}\nitem1.TEL;waid=${i.split('@')[0]}:${i.split('@')[0]}\nitem1.X-ABLabel:Ponsel\nEND:VCARD`
231 | })
232 | }
233 | ryoroyko.sendMessage(jid, { contacts: { displayName: `${list.length} Kontak`, contacts: list }, ...opts }, { quoted })
234 | }
235 |
236 | ryoroyko.serializeM = (m) => smsg(ryoroyko, m, store);
237 |
238 |
239 | ryoroyko.ev.on('connection.update', async (update) => {
240 | const {
241 | connection,
242 | lastDisconnect
243 | } = update
244 | try {
245 | if (connection === 'close') {
246 | let reason = new Boom(lastDisconnect?.error)?.output.statusCode
247 | if (reason === DisconnectReason.badSession) {
248 | console.log(`Bad Session File, Please Delete Session and Scan Again`);
249 | ryoroyko()
250 | } else if (reason === DisconnectReason.connectionClosed) {
251 | console.log("Connection closed, reconnecting....");
252 | ryoroykoStart();
253 | } else if (reason === DisconnectReason.connectionLost) {
254 | console.log("Connection Lost from Server, reconnecting...");
255 | ryoroykoStart();
256 | } else if (reason === DisconnectReason.connectionReplaced) {
257 | console.log("Connection Replaced, Another New Session Opened, Please Close Current Session First");
258 | ryoroyko()
259 | } else if (reason === DisconnectReason.loggedOut) {
260 | console.log(`Device Logged Out, Please Scan Again And Run.`);
261 | ryoroykoStart();
262 | } else if (reason === DisconnectReason.restartRequired) {
263 | console.log("Restart Required, Restarting...");
264 | ryoroykoStart();
265 | } else if (reason === DisconnectReason.timedOut) {
266 | console.log("Connection TimedOut, Reconnecting...");
267 | ryoroykoStart();
268 | } else ryoroyko.end(`Unknown DisconnectReason: ${reason}|${connection}`)
269 | }
270 | if (update.connection == "connecting" || update.receivedPendingNotifications == "false") {
271 | console.log(color(`Mengkoneksikan`,`${randomcolor3}`)) //Console-1
272 | }
273 |
274 | if (update.connection == "open" || update.receivedPendingNotifications == "true") {
275 | console.log(color(figlet.textSync(`${global.namabot}`, //Console-2
276 | {
277 | font: 'Standard',
278 | horizontalLayout: 'default',
279 | vertivalLayout: 'default',
280 | width: 80,
281 | whitespaceBreak: false
282 | }), `${randomcolor}`))
283 |
284 | console.log(color(` :\` .
285 | -s- -o.
286 | -do./d+\`
287 | .\`-+:-\`:+:\` -hd+/dh:
288 | .+++++mmmdhNmdy++dmhshds-
289 | ..-oNNNNNNNNNNNNNNmmmmmdmdds-
290 | +hdmmNNNNNmmmmmNNNmmmmmmdddds:\`
291 | -+mNNNNNdy+::-----:+shmmmmmddddddy:
292 | .sdNNNNNd+- \`-ohmmmddddhddo\`
293 | \`:dNNNNh-.. .+hddddddhmms.
294 | \`:dmmNNN:.. .sddddddmmmy-
295 | .osmNmNm-.. :sdddddmmmo'
296 | \`:NNNNNs.. ./ydddmmh-\`
297 | sdmNNNNs- -odmmmms-
298 | \`-.:mNNNNd+. .ommmmmh-
299 | \`ydhmNNNds:. +mmmmh.
300 | .\`-+ydmNNmds+-\` -:.\`
301 | \`\`-/oydmNNmyo-
302 | \`.:oymmmh+.
303 | \`-ohmmo.
304 | .odd:
305 | \`od:
306 | /d\`
307 | y.
308 | .\`
309 | `,`${randomcolor}`));
310 |
311 | console.log(color(`📝*Connecting to WhatsApp web🖥️*`,`${randomcolor}`))
312 | console.log(color(`[[ ༑☔*Bot Has Been Connected*༢⿻ ༑]]`))
313 | await sleep(30000)
314 | //Jangan dihapus, Nanti ErorEror
315 | ryoroyko.sendMessage('ryozingod.user.id', {
316 | image: {
317 | url: 'https://telegra.ph/file/ea0b61624cf15d1210afb.jpg'
318 | },
319 | caption: `𝗚𝘂𝗲𝘀𝘀 𝘄𝗵𝗼 𝗵𝗮𝘀 𝗹𝗼𝘀𝘁 𝗵𝗶𝘀/𝗵𝗲𝗿 𝗠𝗲𝗿𝗰𝘆 💀 𝗟𝗲𝘁𝘀 𝗸𝗶𝗹𝗹 𝘁𝗵𝗲 𝘃𝗶𝗯𝗲𝘀,𝗡𝗼 𝗠𝗲𝗿𝗰𝘆 𝗙𝗼𝗿 𝗧𝗵𝗲 𝗪𝗲𝗮𝗸 👻 `
320 | })
321 | }//
322 |
323 | } catch (err) {
324 | console.log('Error Di Connection.update ' + err);
325 | ryoroykoStart()
326 | }
327 |
328 | })
329 |
330 | ryoroyko.ev.on('messages.update', async chatUpdate => {
331 | for(const { key, update } of chatUpdate) {
332 | if(update.pollUpdates && key.fromMe) {
333 | const pollCreation = await getMessage(key)
334 | if(pollCreation) {
335 | const pollUpdate = await getAggregateVotesInPollMessage({
336 | message: pollCreation,
337 | pollUpdates: update.pollUpdates,
338 | })
339 | var toCmd = pollUpdate.filter(v => v.voters.length !== 0)[0]?.name
340 | if (toCmd == undefined) return
341 | var prefCmd = prefix+toCmd
342 | ryoroyko.appenTextMessage(prefCmd, chatUpdate)
343 | }
344 | }
345 | }
346 | })
347 |
348 | /**
349 | *
350 | * @param {*} jid
351 | * @param {*} url
352 | * @param {*} caption
353 | * @param {*} quoted
354 | * @param {*} options
355 | */
356 | ryoroyko.sendFileUrl = async (jid, url, caption, quoted, options = {}) => {
357 | let mime = '';
358 | let res = await axios.head(url)
359 | mime = res.headers['content-type']
360 | if (mime.split("/")[1] === "gif") {
361 | return ryoroyko.sendMessage(jid, { video: await getBuffer(url), caption: caption, gifPlayback: true, ...options}, { quoted: quoted, ...options})
362 | }
363 | let type = mime.split("/")[0]+"Message"
364 | if(mime === "application/pdf"){
365 | return ryoroyko.sendMessage(jid, { document: await getBuffer(url), mimetype: 'application/pdf', caption: caption, ...options}, { quoted: quoted, ...options })
366 | }
367 | if(mime.split("/")[0] === "image"){
368 | return ryoroyko.sendMessage(jid, { image: await getBuffer(url), caption: caption, ...options}, { quoted: quoted, ...options})
369 | }
370 | if(mime.split("/")[0] === "video"){
371 | return ryoroyko.sendMessage(jid, { video: await getBuffer(url), caption: caption, mimetype: 'video/mp4', ...options}, { quoted: quoted, ...options })
372 | }
373 | if(mime.split("/")[0] === "audio"){
374 | return ryoroyko.sendMessage(jid, { audio: await getBuffer(url), caption: caption, mimetype: 'audio/mpeg', ...options}, { quoted: quoted, ...options })
375 | }
376 | }
377 |
378 | /**
379 | *
380 | * @param {*} jid
381 | * @param {*} name
382 | * @param [*] values
383 | * @returns
384 | */
385 | ryoroyko.sendPoll = (jid, name = '', values = [], selectableCount = 1) => { return ryoroyko.sendMessage(jid, { poll: { name, values, selectableCount }}) }
386 |
387 |
388 | /**
389 | *
390 | * @param {*} jid
391 | * @param {*} text
392 | * @param {*} quoted
393 | * @param {*} options
394 | * @returns
395 | */
396 | ryoroyko.sendText = (jid, text, quoted = '', options) => ryoroyko.sendMessage(jid, { text: text, ...options }, { quoted, ...options })
397 |
398 | /**
399 | *
400 | * @param {*} jid
401 | * @param {*} path
402 | * @param {*} caption
403 | * @param {*} quoted
404 | * @param {*} options
405 | * @returns
406 | */
407 | ryoroyko.sendImage = async (jid, path, caption = '', quoted = '', options) => {
408 | let buffer = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0)
409 | return await ryoroyko.sendMessage(jid, { image: buffer, caption: caption, ...options }, { quoted })
410 | }
411 |
412 | /**
413 | *
414 | * @param {*} jid
415 | * @param {*} path
416 | * @param {*} caption
417 | * @param {*} quoted
418 | * @param {*} options
419 | * @returns
420 | */
421 | ryoroyko.sendVideo = async (jid, path, caption = '', quoted = '', gif = false, options) => {
422 | let buffer = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0)
423 | return await ryoroyko.sendMessage(jid, { video: buffer, caption: caption, gifPlayback: gif, ...options }, { quoted })
424 | }
425 |
426 | /**
427 | *
428 | * @param {*} jid
429 | * @param {*} path
430 | * @param {*} quoted
431 | * @param {*} mime
432 | * @param {*} options
433 | * @returns
434 | */
435 | ryoroyko.sendAudio = async (jid, path, quoted = '', ptt = false, options) => {
436 | let buffer = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0)
437 | return await ryoroyko.sendMessage(jid, { audio: buffer, ptt: ptt, ...options }, { quoted })
438 | }
439 |
440 | /**
441 | *
442 | * @param {*} jid
443 | * @param {*} text
444 | * @param {*} quoted
445 | * @param {*} options
446 | * @returns
447 | */
448 | ryoroyko.sendTextWithMentions = async (jid, text, quoted, options = {}) => ryoroyko.sendMessage(jid, { text: text, mentions: [...text.matchAll(/@(\d{0,16})/g)].map(v => v[1] + '@s.whatsapp.net'), ...options }, { quoted })
449 |
450 | /**
451 | *
452 | * @param {*} jid
453 | * @param {*} path
454 | * @param {*} quoted
455 | * @param {*} options
456 | * @returns
457 | */
458 | ryoroyko.sendImageAsSticker = async (jid, path, quoted, options = {}) => {
459 | let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0)
460 | let buffer
461 | if (options && (options.packname || options.author)) {
462 | buffer = await writeExifImg(buff, options)
463 | } else {
464 | buffer = await imageToWebp(buff)
465 | }
466 |
467 | await ryoroyko.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted })
468 | return buffer
469 | }
470 |
471 | /**
472 | *
473 | * @param {*} jid
474 | * @param {*} path
475 | * @param {*} quoted
476 | * @param {*} options
477 | * @returns
478 | */
479 | ryoroyko.sendVideoAsSticker = async (jid, path, quoted, options = {}) => {
480 | let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0)
481 | let buffer
482 | if (options && (options.packname || options.author)) {
483 | buffer = await writeExifVid(buff, options)
484 | } else {
485 | buffer = await videoToWebp(buff)
486 | }
487 |
488 | await ryoroyko.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted })
489 | return buffer
490 | }
491 |
492 | /**
493 | *
494 | * @param {*} message
495 | * @param {*} filename
496 | * @param {*} attachExtension
497 | * @returns
498 | */
499 | ryoroyko.downloadAndSaveMediaMessage = async (message, filename, attachExtension = true) => {
500 | let quoted = message.msg ? message.msg : message
501 | let mime = (message.msg || message).mimetype || ''
502 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0]
503 | const stream = await downloadContentFromMessage(quoted, messageType)
504 | let buffer = Buffer.from([])
505 | for await(const chunk of stream) {
506 | buffer = Buffer.concat([buffer, chunk])
507 | }
508 | let type = await FileType.fromBuffer(buffer)
509 | trueFileName = attachExtension ? (filename + '.' + type.ext) : filename
510 | // save to file
511 | await fs.writeFileSync(trueFileName, buffer)
512 | return trueFileName
513 | }
514 |
515 | ryoroyko.downloadMediaMessage = async (message) => {
516 | let mime = (message.msg || message).mimetype || ''
517 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0]
518 | const stream = await downloadContentFromMessage(message, messageType)
519 | let buffer = Buffer.from([])
520 | for await(const chunk of stream) {
521 | buffer = Buffer.concat([buffer, chunk])
522 | }
523 |
524 | return buffer
525 | }
526 |
527 | /**
528 | *
529 | * @param {*} jid
530 | * @param {*} path
531 | * @param {*} filename
532 | * @param {*} caption
533 | * @param {*} quoted
534 | * @param {*} options
535 | * @returns
536 | */
537 | ryoroyko.sendMedia = async (jid, path, fileName = '', caption = '', quoted = '', options = {}) => {
538 | let types = await ryoroyko.getFile(path, true)
539 | let { mime, ext, res, data, filename } = types
540 | if (res && res.status !== 200 || file.length <= 65536) {
541 | try { throw { json: JSON.parse(file.toString()) } }
542 | catch (e) { if (e.json) throw e.json }
543 | }
544 | let type = '', mimetype = mime, pathFile = filename
545 | if (options.asDocument) type = 'document'
546 | if (options.asSticker || /webp/.test(mime)) {
547 | let { writeExif } = require('./lib/exif')
548 | let media = { mimetype: mime, data }
549 | pathFile = await writeExif(media, { packname: options.packname ? options.packname : global.packname, author: options.author ? options.author : global.author, categories: options.categories ? options.categories : [] })
550 | await fs.promises.unlink(filename)
551 | type = 'sticker'
552 | mimetype = 'image/webp'
553 | }
554 | else if (/image/.test(mime)) type = 'image'
555 | else if (/video/.test(mime)) type = 'video'
556 | else if (/audio/.test(mime)) type = 'audio'
557 | else type = 'document'
558 | await ryoroyko.sendMessage(jid, { [type]: { url: pathFile }, caption, mimetype, fileName, ...options }, { quoted, ...options })
559 | return fs.promises.unlink(pathFile)
560 | }
561 |
562 | /**
563 | *
564 | * @param {*} jid
565 | * @param {*} message
566 | * @param {*} forceForward
567 | * @param {*} options
568 | * @returns
569 | */
570 | ryoroyko.copyNForward = async (jid, message, forceForward = false, options = {}) => {
571 | let vtype
572 | if (options.readViewOnce) {
573 | message.message = message.message && message.message.ephemeralMessage && message.message.ephemeralMessage.message ? message.message.ephemeralMessage.message : (message.message || undefined)
574 | vtype = Object.keys(message.message.viewOnceMessage.message)[0]
575 | delete(message.message && message.message.ignore ? message.message.ignore : (message.message || undefined))
576 | delete message.message.viewOnceMessage.message[vtype].viewOnce
577 | message.message = {
578 | ...message.message.viewOnceMessage.message
579 | }
580 | }
581 |
582 | let mtype = Object.keys(message.message)[0]
583 | let content = await generateForwardMessageContent(message, forceForward)
584 | let ctype = Object.keys(content)[0]
585 | let context = {}
586 | if (mtype != "conversation") context = message.message[mtype].contextInfo
587 | content[ctype].contextInfo = {
588 | ...context,
589 | ...content[ctype].contextInfo
590 | }
591 | const waMessage = await generateWAMessageFromContent(jid, content, options ? {
592 | ...content[ctype],
593 | ...options,
594 | ...(options.contextInfo ? {
595 | contextInfo: {
596 | ...content[ctype].contextInfo,
597 | ...options.contextInfo
598 | }
599 | } : {})
600 | } : {})
601 | await ryoroyko.relayMessage(jid, waMessage.message, { messageId: waMessage.key.id })
602 | return waMessage
603 | }
604 |
605 | ryoroyko.cMod = (jid, copy, text = '', sender = ryoroyko.user.id, options = {}) => {
606 | //let copy = message.toJSON()
607 | let mtype = Object.keys(copy.message)[0]
608 | let isEphemeral = mtype === 'ephemeralMessage'
609 | if (isEphemeral) {
610 | mtype = Object.keys(copy.message.ephemeralMessage.message)[0]
611 | }
612 | let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message
613 | let content = msg[mtype]
614 | if (typeof content === 'string') msg[mtype] = text || content
615 | else if (content.caption) content.caption = text || content.caption
616 | else if (content.text) content.text = text || content.text
617 | if (typeof content !== 'string') msg[mtype] = {
618 | ...content,
619 | ...options
620 | }
621 | if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant
622 | else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant
623 | if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid
624 | else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid
625 | copy.key.remoteJid = jid
626 | copy.key.fromMe = sender === ryoroyko.user.id
627 |
628 | return proto.WebMessageInfo.fromObject(copy)
629 | }
630 |
631 | ryoroyko.sendFile = async (jid, path, filename = '', caption = '', quoted, ptt = false, options = {}) => {
632 | let type = await ryoroyko.getFile(path, true);
633 | let { res, data: file, filename: pathFile } = type;
634 |
635 | if (res && res.status !== 200 || file.length <= 65536) {
636 | try {
637 | throw {
638 | json: JSON.parse(file.toString())
639 | };
640 | } catch (e) {
641 | if (e.json) throw e.json;
642 | }
643 | }
644 |
645 | let opt = {
646 | filename
647 | };
648 |
649 | if (quoted) opt.quoted = quoted;
650 | if (!type) options.asDocument = true;
651 |
652 | let mtype = '',
653 | mimetype = type.mime,
654 | convert;
655 |
656 | if (/webp/.test(type.mime) || (/image/.test(type.mime) && options.asSticker)) mtype = 'sticker';
657 | else if (/image/.test(type.mime) || (/webp/.test(type.mime) && options.asImage)) mtype = 'image';
658 | else if (/video/.test(type.mime)) mtype = 'video';
659 | else if (/audio/.test(type.mime)) {
660 | convert = await (ptt ? toPTT : toAudio)(file, type.ext);
661 | file = convert.data;
662 | pathFile = convert.filename;
663 | mtype = 'audio';
664 | mimetype = 'audio/ogg; codecs=opus';
665 | } else mtype = 'document';
666 |
667 | if (options.asDocument) mtype = 'document';
668 |
669 | delete options.asSticker;
670 | delete options.asLocation;
671 | delete options.asVideo;
672 | delete options.asDocument;
673 | delete options.asImage;
674 |
675 | let message = { ...options, caption, ptt, [mtype]: { url: pathFile }, mimetype };
676 | let m;
677 |
678 | try {
679 | m = await ryoroyko.sendMessage(jid, message, { ...opt, ...options });
680 | } catch (e) {
681 | //console.error(e)
682 | m = null;
683 | } finally {
684 | if (!m) m = await ryoroyko.sendMessage(jid, { ...message, [mtype]: file }, { ...opt, ...options });
685 | file = null;
686 | return m;
687 | }
688 | }
689 |
690 |
691 | /**
692 | *
693 | * @param {*} path
694 | * @returns
695 | */
696 | ryoroyko.getFile = async (PATH, save) => {
697 | let res
698 | let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await (res = await getBuffer(PATH)) : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0)
699 | //if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer')
700 | let type = await FileType.fromBuffer(data) || {
701 | mime: 'application/octet-stream',
702 | ext: '.bin'
703 | }
704 | filename = path.join(__filename, '../src/' + new Date * 1 + '.' + type.ext)
705 | if (data && save) fs.promises.writeFile(filename, data)
706 | return {
707 | res,
708 | filename,
709 | size: await getSizeMedia(data),
710 | ...type,
711 | data
712 | }
713 |
714 | }
715 |
716 | ryoroyko.ev.on('messages.upsert', async chatUpdate => {
717 | //console.log(JSON.stringify(chatUpdate, undefined, 2))
718 | try {
719 | mek = chatUpdate.messages[0]
720 | if (!mek.message) return
721 | mek.message = (Object.keys(mek.message)[0] === 'ephemeralMessage') ? mek.message.ephemeralMessage.message : mek.message
722 | if (mek.key && mek.key.remoteJid === 'status@broadcast') return
723 | if (!ryoroyko.public && !mek.key.fromMe && chatUpdate.type === 'notify') return
724 | if (mek.key.id.startsWith('BAE5') && mek.key.id.length === 16) return
725 | if (mek.key.id.startsWith('FatihArridho_')) return
726 | m = smsg(ryoroyko, mek, store)
727 | require("./spider")(ryoroyko, m, chatUpdate, store)
728 | } catch (err) {
729 | console.log(err)
730 | }
731 | })
732 |
733 | //respon polling
734 | async function getMessage(key){
735 | if (store) {
736 | const msg = await store.loadMessage(key.remoteJid, key.id)
737 | return msg?.message
738 | }
739 | return {
740 | conversation: "Hai Im juna Bot"
741 | }
742 | }
743 | ryoroyko.ev.on('messages.update', async chatUpdate => {
744 | for(const { key, update } of chatUpdate) {
745 | if(update.pollUpdates && key.fromMe) {
746 | const pollCreation = await getMessage(key)
747 | if(pollCreation) {
748 | const pollUpdate = await getAggregateVotesInPollMessage({
749 | message: pollCreation,
750 | pollUpdates: update.pollUpdates,
751 | })
752 | var toCmd = pollUpdate.filter(v => v.voters.length !== 0)[0]?.name
753 | if (toCmd == undefined) return
754 | var prefCmd = prefix+toCmd
755 | ryoroyko.appenTextMessage(prefCmd, chatUpdate)
756 | }
757 | }
758 | }
759 | })
760 |
761 | //Simpan Kredensial
762 | ryoroyko.ev.process(
763 | async (events) => {
764 | if (events['presence.update']) {
765 | await ryoroyko.sendPresenceUpdate('available');
766 | }
767 | if (events['creds.update']) {
768 | await saveCreds();
769 | }
770 | }
771 | )
772 |
773 | return ryoroyko
774 | }
775 |
776 | /*console.clear();
777 | console.log(color(`
778 | ▒██ ██▒ ▄████
779 | ▒▒ █ █ ▒░ ██▒ ▀█▒
780 | ░░ █ ░▒██░▄▄▄░
781 | ░ █ █ ▒ ░▓█▒ ██▓
782 | ▒██▒ ▒██▒░▒▓███▀▒
783 | ▒▒ ░ ░▓ ░ ░▒ ▒
784 | ░░ ░▒ ░ ░ ░
785 | ░ ░ ░ ░ ░
786 | ░ ░ ░
787 |
788 | `,`${randomcolor}`));
789 | question(`❗ Masukkan Username Anda Untuk Melanjutkan : \n👤 Usernama : `).then((nama) => {
790 | question('📟 Masukkan Pin Anda Untuk Melanjutkan : \n🌊 Pin Anda : ').then((pin) => {
791 | fetch(apiUrl)
792 | .then(response => response.json())
793 | .then(data => {
794 | const user = data.data.find(user => user.nama === nama && user.pin == pin);
795 | if (user) {
796 | console.clear();
797 | console.log(color(`
798 | ▒██ ██▒ ▄████
799 | ▒▒ █ █ ▒░ ██▒ ▀█▒
800 | ░░ █ ░▒██░▄▄▄░
801 | ░ █ █ ▒ ░▓█▒ ██▓
802 | ▒██▒ ▒██▒░▒▓███▀▒
803 | ▒▒ ░ ░▓ ░ ░▒ ▒
804 | ░░ ░▒ ░ ░ ░
805 | ░ ░ ░ ░ ░
806 | ░ ░ ░
807 |
808 | `,`${randomcolor}`));
809 | console.log("\n🌆 Login berhasil! ✅");
810 | */
811 | ryoroykoStart()
812 | /* } else {
813 | console.log("Nama atau pin tidak valid. Login gagal.");
814 | }
815 | })
816 | .catch(error => {
817 | console.error('Error:', error);
818 | });
819 | });
820 | });
821 | */
822 |
823 | let file = require.resolve(__filename);
824 | fs.watchFile(file, () => {
825 | fs.unwatchFile(file);
826 | console.log(chalk.yellowBright(`Update File Terbaru ${__filename}`));
827 | delete require.cache[file];
828 | require(file);
829 | });
830 |
--------------------------------------------------------------------------------
/lib/scraperrr.js:
--------------------------------------------------------------------------------
1 | const { modul } = require('../module');
2 | const { axios, cheerio, fs, fetch, got, util, yts, ytdl } = modul;
3 |
4 | function niatsholat (qurerryy) {
5 | return new Promise( async (resolve, reject) => {
6 | const scraper = JSON.parse(fs.readFileSync(`./database/niatSholat/${qurerryy}.json`))
7 | console.log(scraper)
8 | const result = {
9 | name: scraper.name,
10 | arabic: scraper.arabic,
11 | latin: scraper.latin,
12 | terjemahan: scraper.terjemahan
13 | }
14 | resolve(result)
15 | }).catch((err) => {resolve(err) })
16 | }
17 |
18 | function asmaulhusna() {
19 | var rndm = ['1','2','3','4','5','6','7','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','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99']
20 | var bykir = rndm[Math.floor(Math.random() * rndm.length)]
21 | return new Promise( async (resolve, reject) => {
22 | const scraper = JSON.parse(fs.readFileSync(`./database/asmaulHusna/${bykir}.json`))
23 | console.log(scraper)
24 | const result = {
25 | nomor: scraper.number,
26 | latin: scraper.latin,
27 | arabic: scraper.arab,
28 | id: scraper.translate_id,
29 | en: scraper.translate_en
30 | }
31 | resolve(result)
32 | }).catch((err) => {resolve(err) })
33 | }
34 |
35 | function bacaanshalat () {
36 | var rndom = ['1','2','3','4','5','6','7','8']
37 | var bykire = rndom[Math.floor(Math.random() * rndm.length)]
38 | return new Promise( async (resolve, reject) => {
39 | const scraper = JSON.parse(fs.readFileSync(`./database/bacaanSholat/${bykire}.json`))
40 | console.log(scraper)
41 | const result = {
42 | nomor: scraper.no,
43 | name: scraper.name,
44 | arabic: scraper.arabic,
45 | latin: scraper.latin,
46 | terjemahan: scraper.terjemahan
47 | }
48 | resolve(result)
49 | }).catch((err) => {resolve(err) })
50 | }
51 |
52 | function getDoujin(identifier) {
53 | const id = identifier.replace(urlToId, '$2');
54 | return new Promise((resolve, reject) => {
55 | request
56 | .get('https://nhentai.net/g/' + id + '/')
57 | .then(res => {
58 | const $ = cheerio.load(res.text);
59 | let details = {};
60 | $('.tag-container.field-name').find('.count').each(function () {
61 | const el = $(this);
62 | el.text(` (${el.text()}) `);
63 | });
64 | $('.tag-container.field-name').text().split('\n').map(string => string.trim()).filter(u => u).map((tag, i, tags) => {
65 | if (tag.endsWith(':') && !tags[i + 1].endsWith(':')) {
66 | details[tag.substring(0, tag.length - 1).toLowerCase()] = tags[i + 1].replace(tagSpacerPatternn, '$1 $2').split(tagSplitPattern);
67 | }
68 | });
69 | const title = $('#info').find('h1').text();
70 | const nativeTitle = $('#info').find('h2').text();
71 | const thumbnails = Object.entries($('.gallerythumb').find('img')).map(image => {
72 | return image[1].attribs
73 | ? image[1].attribs['data-src']
74 | : null;
75 | }).filter(link => link);
76 | const images = Object.entries($('.gallerythumb').find('img')).map(image => {
77 | return image[1].attribs
78 | ? image[1].attribs['data-src'].replace(/t(\.(jpg|png|gif))/, '$1').replace('t.nhentai', 'i.nhentai')
79 | : null;
80 | }).filter(link => link);
81 | const link = `https://nhentai.net/g/${id}/`;
82 | resolve({ title, nativeTitle, details, pages: images, thumbnails, link });
83 | })
84 | .catch(reject);
85 | });
86 | }
87 |
88 | function onGoing() {
89 | return new Promise((resolve, reject) => {
90 | axios.get('https://neonime.co/episode/').then(res => {
91 | const $ = cheerio.load(res.data)
92 | const result = []
93 | $('tbody').find('tr').each(function(a, b) {
94 | const link = $(b).find('td > div.imagen-td > a').attr('href')
95 | const img = $(b).find('td > div.imagen-td > a > img').attr('data-src')
96 | const info = $(b).find('td.bb > a > span').text().trim()
97 | const judul = $(b).find('td.bb > a').text()
98 | const tgl_rilis = $(b).find('td.dd').text()
99 | result.push({ judul, link, img, info, tgl_rilis })
100 | })
101 | resolve(result)
102 | }).catch(reject)
103 | })
104 | }
105 |
106 | function kusoNime(query) {
107 | return new Promise(async (resolve, reject) => {
108 | const optionsGet = {
109 | method: 'GET',
110 | headers: {
111 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36'
112 | }
113 | }
114 | const getHtml = await fetch('https://kusonime.com/?s=' + query + '&post_type=anime', optionsGet).then(rsp => rsp.text())
115 | const $ = cheerio.load(getHtml)
116 | const url = []
117 | $('div > div > ul > div > div > div').each(function() {
118 | url.push($(this).find('a').attr('href'))
119 | })
120 | const randomUrl = url[Math.floor(Math.random() * url.length)]
121 | const getHtml2 = await fetch(randomUrl, optionsGet).then(rsp => rsp.text())
122 | const $$ = cheerio.load(getHtml2)
123 | resolve({
124 | status: 200,
125 | result: {
126 | title: $$('.vezone > .venser').find('.jdlz').text(),
127 | thumb: $$('.vezone > .venser').find('div > img').attr('src'),
128 | views: $$('.vezone > .venser').find('div > div > span').text().trim().replace(' Views', ''),
129 | genre: $$('.vezone > .venser').find('.lexot > .info > p').eq(1).text().replace('Genre : ', ''),
130 | seasons: $$('.vezone > .venser').find('.lexot > .info > p').eq(2).text().replace('Seasons : ', ''),
131 | producers: $$('.vezone > .venser').find('.lexot > .info > p').eq(3).text().replace('Producers: ', ''),
132 | type: $$('.vezone > .venser').find('.lexot > .info > p').eq(4).text().replace('Type: ', ''),
133 | status: $$('.vezone > .venser').find('.lexot > .info > p').eq(5).text().replace('Status: ', ''),
134 | rating: $$('.vezone > .venser').find('.lexot > .info > p').eq(7).text().replace('Score: ', ''),
135 | duration: $$('.vezone > .venser').find('.lexot > .info > p').eq(8).text().replace('Duration: ', ''),
136 | release: $$('.vezone > .venser').find('.lexot > .info > p').eq(9).text().replace('Released on: ', ''),
137 | desc: $$('.vezone > .venser').find('p').eq(10).text(),
138 | url: randomUrl
139 | }
140 | })
141 | })
142 | }
143 |
144 | async function mlstalk(id, zoneId) {
145 | return new Promise(async (resolve, reject) => {
146 | axios
147 | .post(
148 | 'https://api.duniagames.co.id/api/transaction/v1/top-up/inquiry/store',
149 | new URLSearchParams(
150 | Object.entries({
151 | productId: '1',
152 | itemId: '2',
153 | catalogId: '57',
154 | paymentId: '352',
155 | gameId: id,
156 | zoneId: zoneId,
157 | product_ref: 'REG',
158 | product_ref_denom: 'AE',
159 | })
160 | ),
161 | {
162 | headers: {
163 | 'Content-Type': 'application/x-www-form-urlencoded',
164 | Referer: 'https://www.duniagames.co.id/',
165 | Accept: 'application/json',
166 | },
167 | }
168 | )
169 | .then((response) => {
170 | resolve(response.data.data.gameDetail)
171 | })
172 | .catch((err) => {
173 | reject(err)
174 | })
175 | })
176 | }
177 |
178 | async function ffstalk(userId) {
179 | let data = {
180 | "voucherPricePoint.id": 8050,
181 | "voucherPricePoint.price": "",
182 | "voucherPricePoint.variablePrice": "",
183 | "email": "",
184 | "n": "",
185 | "userVariablePrice": "",
186 | "order.data.profile": "",
187 | "user.userId": userId,
188 | "voucherTypeName": "FREEFIRE",
189 | "affiliateTrackingId": "",
190 | "impactClickId": "",
191 | "checkoutId": "",
192 | "tmwAccessToken": "",
193 | "shopLang": "in_ID",
194 | }
195 | let ff = await axios({
196 | "headers": {
197 | "Content-Type": "application/json; charset\u003dutf-8"
198 | },
199 | "method": "POST",
200 | "url": "https://order.codashop.com/id/initPayment.action",
201 | "data": data
202 | })
203 | return {
204 | id: userId,
205 | nickname: ff.data["confirmationFields"]["roles"][0]["role"]
206 | }
207 | }
208 |
209 | async function npmstalk(packageName) {
210 | let stalk = await axios.get("https://registry.npmjs.org/"+packageName)
211 | let versions = stalk.data.versions
212 | let allver = Object.keys(versions)
213 | let verLatest = allver[allver.length-1]
214 | let verPublish = allver[0]
215 | let packageLatest = versions[verLatest]
216 | return {
217 | name: packageName,
218 | versionLatest: verLatest,
219 | versionPublish: verPublish,
220 | versionUpdate: allver.length,
221 | latestDependencies: Object.keys(packageLatest.dependencies).length,
222 | publishDependencies: Object.keys(versions[verPublish].dependencies).length,
223 | publishTime: stalk.data.time.created,
224 | latestPublishTime: stalk.data.time[verLatest]
225 | }
226 | }
227 |
228 | function quotesanime() {
229 | return new Promise((resolve, reject) => {
230 | const page = Math.floor(Math.random() * 184)
231 | axios.get('https://otakotaku.com/quote/feed/'+page)
232 | .then(({ data }) => {
233 | const $ = cheerio.load(data)
234 | const hasil = []
235 | $('div.kotodama-list').each(function(l, h) {
236 | hasil.push({
237 | link: $(h).find('a').attr('href'),
238 | gambar: $(h).find('img').attr('data-src'),
239 | karakter: $(h).find('div.char-name').text().trim(),
240 | anime: $(h).find('div.anime-title').text().trim(),
241 | episode: $(h).find('div.meta').text(),
242 | up_at: $(h).find('small.meta').text(),
243 | quotes: $(h).find('div.quote').text().trim()
244 | })
245 | })
246 | resolve(hasil)
247 | }).catch(reject)
248 | })
249 | }
250 |
251 | function pornovid() {
252 | return new Promise((resolve, reject) => {
253 | axios.get('https://tikporntok.com/?random=1')
254 | .then((res) => {
255 | const $ = cheerio.load(res.data)
256 | const hasil = {}
257 | hasil.title = $('article > h1').text()
258 | hasil.source = $('article > div.video-wrapper.vxplayer').attr('data-post') || 'Web Not Response'
259 | hasil.thumb = $('article > div.video-wrapper.vxplayer > div.vx_el').attr('data-poster') || 'https://4.bp.blogspot.com/-hyMqjmQQq4o/W6al-Rk4IpI/AAAAAAAADJ4/m-lVBA_GC9Q5d4BIQg8ZO3fYmQQC3LqSACLcBGAs/s1600/404_not_found.png'
260 | hasil.desc = $('article > div.intro').text()
261 | hasil.upload = $('article > div.single-pre-meta.ws.clearfix > time').text()
262 | hasil.like = $('article > div.single-pre-meta.ws.clearfix > div > span:nth-child(1) > span').text()
263 | hasil.dislike = $('article > div.single-pre-meta.ws.clearfix > div > span:nth-child(2) > span').text()
264 | hasil.favorite = $('article > div.single-pre-meta.ws.clearfix > div > span:nth-child(3) > span').text()
265 | hasil.views = $('article > div.single-pre-meta.ws.clearfix > div > span:nth-child(4) > span').text()
266 | hasil.tags = $('article > div.post-tags').text()
267 | hasil.video = $('article > div.video-wrapper.vxplayer > div.vx_el').attr('src') || $('article > div.video-wrapper.vxplayer > div.vx_el').attr('data-src') || 'https://4.bp.blogspot.com/-hyMqjmQQq4o/W6al-Rk4IpI/AAAAAAAADJ4/m-lVBA_GC9Q5d4BIQg8ZO3fYmQQC3LqSACLcBGAs/s1600/404_not_found.png'
268 | resolve(hasil)
269 | })
270 | })
271 | }
272 |
273 | function hentaivid() {
274 | return new Promise((resolve, reject) => {
275 | const page = Math.floor(Math.random() * 1153)
276 | axios.get('https://sfmcompile.club/page/'+page)
277 | .then((data) => {
278 | const $ = cheerio.load(data.data)
279 | const hasil = []
280 | $('#primary > div > div > ul > li > article').each(function (a, b) {
281 | hasil.push({
282 | title: $(b).find('header > h2').text(),
283 | link: $(b).find('header > h2 > a').attr('href'),
284 | category: $(b).find('header > div.entry-before-title > span > span').text().replace('in ', ''),
285 | share_count: $(b).find('header > div.entry-after-title > p > span.entry-shares').text(),
286 | views_count: $(b).find('header > div.entry-after-title > p > span.entry-views').text(),
287 | type: $(b).find('source').attr('type') || 'image/jpeg',
288 | video_1: $(b).find('source').attr('src') || $(b).find('img').attr('data-src'),
289 | video_2: $(b).find('video > a').attr('href') || ''
290 | })
291 | })
292 | resolve(hasil)
293 | })
294 | })
295 | }
296 |
297 | function nomorhp(nomor) {
298 | return new Promise((resolve, reject) => {
299 | axios({
300 | headers: {
301 | type: 'application/x-www-form-urlencoded'
302 | },
303 | method: 'POST',
304 | url: 'https://www.primbon.com/no_hoki_bagua_shuzi.php',
305 | data: new URLSearchParams(Object.entries({
306 | nomer: nomor,
307 | submit: 'Submit!'
308 | }))
309 | }).then(({data}) => {
310 | let $ = cheerio.load(data)
311 | let fetchText = $('#body').text().trim()
312 | let result;
313 | try {
314 | result = {
315 | nomor_hp: fetchText.split('No. HP : ')[1].split('\n')[0],
316 | angka_bagua_shuzi: fetchText.split('Angka Bagua Shuzi : ')[1].split('\n')[0],
317 | energi_positif: {
318 | kekayaan: fetchText.split('Kekayaan = ')[1].split('\n')[0],
319 | kesehatan: fetchText.split('Kesehatan = ')[1].split('\n')[0],
320 | cinta: fetchText.split('Cinta/Relasi = ')[1].split('\n')[0],
321 | kestabilan: fetchText.split('Kestabilan = ')[1].split('\n')[0],
322 | persentase: fetchText.split('Kestabilan = ')[1].split('% = ')[1].split('ENERGI NEGATIF')[0]
323 | },
324 | energi_negatif: {
325 | perselisihan: fetchText.split('Perselisihan = ')[1].split('\n')[0],
326 | kehilangan: fetchText.split('Kehilangan = ')[1].split('\n')[0],
327 | malapetaka: fetchText.split('Malapetaka = ')[1].split('\n')[0],
328 | kehancuran: fetchText.split('Kehancuran = ')[1].split('\n')[0],
329 | persentase: fetchText.split('Kehancuran = ')[1].split('% = ')[1].split("\n")[0]
330 | },
331 | notes: fetchText.split('* ')[1].split('Masukan Nomor HP Anda')[0]
332 | }
333 | } catch {
334 | result = `Nomor "${nomor}" tidak valid`
335 | }
336 | resolve(result)
337 | }).catch(reject)
338 | })
339 | }
340 |
341 | function character(query) {
342 | return new Promise((resolve, reject) => {
343 | axios.get(`https://www.anime-planet.com/characters/all?name=${query}`)
344 | .then(({
345 | data
346 | }) => {
347 | const hasil = []
348 | const $ = cheerio.load(data)
349 | $('#siteContainer > table > tbody > tr').each(function (a, b) {
350 | result = {
351 | status: 200,
352 | author: 'KirBotz',
353 | character: $(b).find('> td.tableCharInfo > a').text(),
354 | link: 'https://www.anime-planet.com' + $(b).find('> td.tableCharInfo > a').attr('href'),
355 | thumbnail: $(b).find('> td.tableAvatar > a > img').attr('src').startsWith('https://') ? $(b).find('> td.tableAvatar > a > img').attr('src') : 'https://www.anime.planet.com' + $(b).find('> td.tableAvatar > a > img').attr('src')
356 | };
357 | hasil.push(result);
358 | });
359 | resolve(hasil)
360 | })
361 | .catch(reject)
362 | })
363 | }
364 |
365 | function anime(query) {
366 | return new Promise((resolve, reject) => {
367 | axios.get(`https://www.anime-planet.com/anime/all?name=${query}`)
368 | .then(({
369 | data
370 | }) => {
371 | const hasil = []
372 | const $ = cheerio.load(data)
373 | $('#siteContainer > ul.cardDeck.cardGrid > li ').each(function (a, b) {
374 | result = {
375 | status: 200,
376 | author: 'KirBotz',
377 | judul: $(b).find('> a > h3').text(),
378 | link: 'https://www.anime-planet.com' + $(b).find('> a').attr('href'),
379 | thumbnail: 'https://www.anime-planet.com' + $(b).find('> a > div.crop > img').attr('src')
380 | };
381 | hasil.push(result);
382 | });
383 | resolve(hasil)
384 | })
385 | .catch(reject)
386 | })
387 | }
388 |
389 | function manga(query) {
390 | return new Promise((resolve, reject) => {
391 | axios.get(`https://www.anime-planet.com/manga/all?name=${query}`)
392 | .then(({
393 | data
394 | }) => {
395 | const hasil = []
396 | const $ = cheerio.load(data)
397 | $('#siteContainer > ul.cardDeck.cardGrid > li ').each(function (a, b) {
398 | result = {
399 | status: 200,
400 | author: 'KirBotz',
401 | judul: $(b).find('> a > h3').text(),
402 | link: 'https://www.anime-planet.com' + $(b).find('> a').attr('href'),
403 | thumbnail: 'https://www.anime-planet.com' + $(b).find('> a > div.crop > img').attr('src')
404 | };
405 | hasil.push(result);
406 | });
407 | resolve(hasil)
408 | })
409 | .catch(reject)
410 | })
411 | }
412 |
413 | function searchsticker(queryy) {
414 | return new Promise((resolve, reject) => {
415 | axios.get(`https://getstickerpack.com/stickers?query=${queryy}`)
416 | .then(({data}) => {
417 | const $ = cheerio.load(data)
418 | const source = []
419 | const linknya = []
420 | $('#stickerPacks > div > div:nth-child(3) > div > a').each((a, b) => {
421 | source.push($(b).attr('href'))
422 | })
423 | axios.get(source[Math.floor(Math.random() * source.length)])
424 | .then(({data}) => {
425 | const $2 = cheerio.load(data)
426 | $2('#stickerPack > div > div.row > div > img').each((c, d) => {
427 | linknya.push($2(d).attr('src').replace(/&d=200x200/g, ''))
428 | })
429 | result = {
430 | title: $2('#intro > div > div > h1').text(),
431 | stickerUrl: linknya
432 | }
433 | resolve(result)
434 | })
435 | }).catch(reject)
436 | })
437 | }
438 |
439 | function igstalk(Username) {
440 | return new Promise((resolve, reject) => {
441 | axios.get('https://dumpor.com/v/'+Username, {
442 | headers: {
443 | "cookie": "_inst_key=SFMyNTY.g3QAAAABbQAAAAtfY3NyZl90b2tlbm0AAAAYWGhnNS1uWVNLUU81V1lzQ01MTVY2R0h1.fI2xB2dYYxmWqn7kyCKIn1baWw3b-f7QvGDfDK2WXr8",
444 | "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
445 | }
446 | }).then(res => {
447 | const $ = cheerio.load(res.data)
448 | const result = {
449 | profile: $('#user-page > div.user > div.row > div > div.user__img').attr('style').replace(/(background-image: url\(\'|\'\);)/gi, ''),
450 | fullname: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > div > a > h1').text(),
451 | username: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > div > h4').text(),
452 | post: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(1)').text().replace(' Posts',''),
453 | followers: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(2)').text().replace(' Followers',''),
454 | following: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(3)').text().replace(' Following',''),
455 | bio: $('#user-page > div.user > div > div.col-md-5.my-3 > div').text()
456 | }
457 | resolve(result)
458 | })
459 | })
460 | }
461 |
462 | function listsurah() {
463 | return new Promise((resolve, reject) => {
464 | axios.get('https://litequran.net/')
465 | .then(({ data }) => {
466 | const $ = cheerio.load(data)
467 | let listsurah = []
468 | $('body > main > section > ol > li > a').each(function(a, b) {
469 | listsurah.push($(b).text())
470 | })
471 | result = {
472 | status: 200,
473 | author: 'KirBotz',
474 | listsurah: listsurah
475 | }
476 | resolve(result)
477 | }).catch(reject)
478 | })
479 | }
480 |
481 | function jadwalsholat(query) {
482 | return new Promise((resolve, reject) => {
483 | axios.get(`https://umrotix.com/jadwal-sholat/${query}`)
484 | .then(({
485 | data
486 | }) => {
487 | const $ = cheerio.load(data)
488 | $('body > div > div.main-wrapper.scrollspy-action > div:nth-child(3) ').each(function(a, b) {
489 | result = {
490 | status: 200,
491 | author: 'KirBotz',
492 | tanggal: $(b).find('> div:nth-child(2)').text(),
493 | imsyak: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(1) > p:nth-child(2)').text(),
494 | subuh: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(2) > p:nth-child(2)').text(),
495 | dzuhur: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(3) > p:nth-child(2)').text(),
496 | ashar: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(4) > p:nth-child(2)').text(),
497 | maghrib: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(5) > p:nth-child(2)').text(),
498 | isya: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(6) > p:nth-child(2)').text()
499 | }
500 | resolve(result)
501 | })
502 | })
503 | .catch(reject)
504 | })
505 | }
506 |
507 | async function telesticker(url){
508 | return new Promise(async (resolve, reject) => {
509 | packName = url.replace("https://t.me/addstickers/", "")
510 | data = await axios(`https://api.telegram.org/bot891038791:AAHWB1dQd-vi0IbH2NjKYUk-hqQ8rQuzPD4/getStickerSet?name=${encodeURIComponent(packName)}`, {method: "GET",headers: {"User-Agent": "GoogleBot"}})
511 | const hasil = []
512 | for (let i = 0; i < data.data.result.stickers.length; i++) {
513 | fileId = data.data.result.stickers[i].thumb.file_id
514 | data2 = await axios(`https://api.telegram.org/bot891038791:AAHWB1dQd-vi0IbH2NjKYUk-hqQ8rQuzPD4/getFile?file_id=${fileId}`)
515 | result = {
516 | url: "https://api.telegram.org/file/bot891038791:AAHWB1dQd-vi0IbH2NjKYUk-hqQ8rQuzPD4/" + data2.data.result.file_path
517 | }
518 | hasil.push(result.url)
519 | }
520 | resolve(hasil)
521 | })
522 | }
523 |
524 | async function aiovideodl(url) {
525 | let { data, headers } = await axios("https://aiovideodl.ml/");
526 | let $ = cheerio.load(data);
527 | let token = $("#token").attr("value");
528 | let cookie = headers["set-cookie"].join("; ");
529 | let body = new URLSearchParams({ url, token });
530 | let { data: res } = await axios({
531 | "url": "https://aiovideodl.ml/wp-json/aio-dl/video-data/",
532 | "method": "POST",
533 | "data": body,
534 | "headers": {
535 | "content-type": "application/x-www-form-urlencoded",
536 | "cookie": cookie,
537 | "origin": "https://aiovideodl.ml",
538 | "referer": "https://aiovideodl.ml/",
539 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36"
540 | }
541 | });
542 | return res;
543 | }
544 |
545 | function linkwa(nama){
546 | return new Promise((resolve,reject) => {
547 | axios.get('http://ngarang.com/link-grup-wa/daftar-link-grup-wa.php?search='+ nama +'&searchby=name')
548 | .then(({ data }) => {
549 | const $ = cheerio.load(data);
550 | const result = [];
551 | const lnk = [];
552 | const nm = [];
553 | $('div.wa-chat-title-container').each(function(a,b){
554 | const limk = $(b).find('a').attr('href');
555 | lnk.push(limk)
556 | })
557 | $('div.wa-chat-title-text').each(function(c,d) {
558 | const name = $(d).text();
559 | nm.push(name)
560 | })
561 | for( let i = 0; i < lnk.length; i++){
562 | result.push({
563 | nama: nm[i].split('. ')[1],
564 | link: lnk[i].split('?')[0]
565 | })
566 | }
567 | resolve(result)
568 | })
569 | .catch(reject)
570 | })
571 | }
572 |
573 | async function mediafiredl(url) {
574 | var _a, _b;
575 | if (!/https?:\/\/(www\.)?mediafire\.com/.test(url))
576 | throw new Error('Invalid URL: ' + url);
577 | const data = await got(url).text();
578 | const $ = cheerio.load(data);
579 | const Url = ($('#downloadButton').attr('href') || '').trim();
580 | const url2 = ($('#download_link > a.retry').attr('href') || '').trim();
581 | const $intro = $('div.dl-info > div.intro');
582 | const filename = $intro.find('div.filename').text().trim();
583 | const filetype = $intro.find('div.filetype > span').eq(0).text().trim();
584 | const ext = ((_b = (_a = /\(\.(.*?)\)/.exec($intro.find('div.filetype > span').eq(1).text())) === null || _a === void 0 ? void 0 : _a[1]) === null || _b === void 0 ? void 0 : _b.trim()) || 'bin';
585 | const $li = $('div.dl-info > ul.details > li');
586 | const aploud = $li.eq(1).find('span').text().trim();
587 | const filesizeH = $li.eq(0).find('span').text().trim();
588 | const filesize = parseFloat(filesizeH) * (/GB/i.test(filesizeH)
589 | ? 1000000
590 | : /MB/i.test(filesizeH)
591 | ? 1000
592 | : /KB/i.test(filesizeH)
593 | ? 1
594 | : /B/i.test(filesizeH)
595 | ? 0.1
596 | : 0);
597 | return {
598 | url: Url,
599 | url2,
600 | filename,
601 | filetype,
602 | ext,
603 | aploud,
604 | filesizeH,
605 | filesize
606 | };
607 | }
608 |
609 | async function ytPlayMp4(query) {
610 | return new Promise((resolve, reject) => {
611 | try {
612 | const search = yts(query)
613 | .then((data) => {
614 | const url = []
615 | const pormat = data.all
616 | for (let i = 0; i < pormat.length; i++) {
617 | if (pormat[i].type == 'video') {
618 | let dapet = pormat[i]
619 | url.push(dapet.url)
620 | }
621 | }
622 | const id = ytdl.getVideoID(url[0])
623 | const yutub = ytdl.getInfo(`https://www.youtube.com/watch?v=${id}`)
624 | .then((data) => {
625 | let pormat = data.formats
626 | let video = []
627 | for (let i = 0; i < pormat.length; i++) {
628 | if (pormat[i].container == 'mp4' && pormat[i].hasVideo == true && pormat[i].hasAudio == true) {
629 | let vid = pormat[i]
630 | video.push(vid.url)
631 | }
632 | }
633 | const title = data.player_response.microformat.playerMicroformatRenderer.title.simpleText
634 | const thumb = data.player_response.microformat.playerMicroformatRenderer.thumbnail.thumbnails[0].url
635 | const channel = data.player_response.microformat.playerMicroformatRenderer.ownerChannelName
636 | const views = data.player_response.microformat.playerMicroformatRenderer.viewCount
637 | const published = data.player_response.microformat.playerMicroformatRenderer.publishDate
638 | const result = {
639 | title: title,
640 | thumb: thumb,
641 | channel: channel,
642 | published: published,
643 | views: views,
644 | url: video[0]
645 | }
646 | return(result)
647 | })
648 | return(yutub)
649 | })
650 | resolve(search)
651 | } catch (error) {
652 | reject(error)
653 | }
654 | console.log(error)
655 | })
656 | }
657 |
658 | async function ytPlayMp3(query) {
659 | return new Promise((resolve, reject) => {
660 | try {
661 | const search = yts(query)
662 | .then((data) => {
663 | const url = []
664 | const pormat = data.all
665 | for (let i = 0; i < pormat.length; i++) {
666 | if (pormat[i].type == 'video') {
667 | let dapet = pormat[i]
668 | url.push(dapet.url)
669 | }
670 | }
671 | const id = ytdl.getVideoID(url[0])
672 | const yutub = ytdl.getInfo(`https://www.youtube.com/watch?v=${id}`)
673 | .then((data) => {
674 | let pormat = data.formats
675 | let audio = []
676 | let video = []
677 | for (let i = 0; i < pormat.length; i++) {
678 | if (pormat[i].mimeType == 'audio/webm; codecs=\"opus\"') {
679 | let aud = pormat[i]
680 | audio.push(aud.url)
681 | }
682 | }
683 | const title = data.player_response.microformat.playerMicroformatRenderer.title.simpleText
684 | const thumb = data.player_response.microformat.playerMicroformatRenderer.thumbnail.thumbnails[0].url
685 | const channel = data.player_response.microformat.playerMicroformatRenderer.ownerChannelName
686 | const views = data.player_response.microformat.playerMicroformatRenderer.viewCount
687 | const published = data.player_response.microformat.playerMicroformatRenderer.publishDate
688 | const result = {
689 | status: true,
690 | code: 200,
691 | creator: '@kirbotz×',
692 | title: title,
693 | thumb: thumb,
694 | channel: channel,
695 | published: published,
696 | views: views,
697 | url: audio[0]
698 | }
699 | return(result)
700 | })
701 | return(yutub)
702 | })
703 | resolve(search)
704 | } catch (error) {
705 | reject(error)
706 | }
707 | console.log(error)
708 | })
709 | }
710 |
711 | function cerpen (category) {
712 | return new Promise(async (resolve, reject) => {
713 | let title = category.toLowerCase().replace(/[()*]/g, "")
714 | let judul = title.replace(/\s/g, "-")
715 | let page = Math.floor(Math.random() * 5)
716 | axios.get('http://cerpenmu.com/category/cerpen-'+judul+'/page/'+page)
717 | .then((get) => {
718 | let $ = cheerio.load(get.data)
719 | let link = []
720 | $('article.post').each(function (a, b) {
721 | link.push($(b).find('a').attr('href'))
722 | })
723 | let random = link[Math.floor(Math.random() * link.length)]
724 | axios.get(random)
725 | .then((res) => {
726 | let $$ = cheerio.load(res.data)
727 | let hasil = {
728 | title: $$('#content > article > h1').text(),
729 | author: $$('#content > article').text().split('Cerpen Karangan: ')[1].split('Kategori: ')[0],
730 | kategori: $$('#content > article').text().split('Kategori: ')[1].split('\n')[0],
731 | lolos: $$('#content > article').text().split('Lolos moderasi pada: ')[1].split('\n')[0],
732 | cerita: $$('#content > article > p').text()
733 | }
734 | resolve(hasil)
735 | })
736 | })
737 | })
738 | }
739 |
740 | function getLatestAnime() {
741 | return new Promise((resolve, reject) => {
742 | axios.get('https://www.mynimeku.com/').then(({ data }) => {
743 | let $ = cheerio.load(data)
744 | let result = []
745 | $('div.flexbox-item > a').each(function(i, e) {
746 | let title = $(e).attr('title')
747 | let link = $(e).attr('href')
748 | let status = $(e).find('div.flexbox-status').text()
749 | let thumb = $(e).find('div.flexbox-thumb > img').attr('data-src')
750 | let episode = $(e).find('div.flexbox-episode > span.eps').text().split(' ')[1]
751 | let type = $(e).find('div.flexbox-type').text()
752 | result.push({ title, status, episode, type, thumb, link })
753 | })
754 | resolve(result)
755 | }).catch(reject)
756 | })
757 | }
758 |
759 | function getLatestKomik() {
760 | return new Promise((resolve, reject) => {
761 | axios.get('https://www.mynimeku.com/').then(({ data }) => {
762 | let $ = cheerio.load(data)
763 | let result = []
764 | $('div.flexbox4-item').each(function(i, e) {
765 | let title = $(e).find('a').attr('title')
766 | let link = $(e).find('a').attr('href')
767 | let thumb = $(e).find('div.flexbox4-thumb > img').attr('data-src')
768 | let type = $(e).find('div.flexbox4-type').text()
769 | let status = $(e).find('div.flexbox-status').text()
770 | let chapter = $(e).find('ul.chapter > li').text().split(' ')[1]
771 | result.push({ title, status, chapter, type, thumb, link })
772 | })
773 | resolve(result)
774 | }).catch(reject)
775 | })
776 | }
777 |
778 | function AnimeDl(url) {
779 | return new Promise((resolve, reject) => {
780 | axios.get(url).then(({ data }) => {
781 | let $ = cheerio.load(data)
782 | let title = $('title').text()
783 | let thumb = $('meta[property="og:image"]').attr('content')
784 | let url = $('#linklist').find('a').attr('href')
785 | resolve({ title, thumb, url })
786 | }).catch(reject)
787 | })
788 | }
789 |
790 | function KomikDl(url) {
791 | return new Promise((resolve, reject) => {
792 | axios.get(url).then(({ data }) => {
793 | let $ = cheerio.load(data)
794 | let title = $('title').text().replace('Bahasa Indonesia - MyNimeku', '').trim()
795 | let result = []
796 | $('div.reader-area > p > img').each(function () {
797 | result.push($(this).attr('src'))
798 | })
799 | resolve({ title, result })
800 | }).catch(reject)
801 | })
802 | }
803 |
804 | function otakudesu(judul){
805 | return new Promise(async(resolve, reject) => {
806 | axios.get('https://otakudesu.moe/?s=' + judul + '&post_type=anime')
807 | .then(({ data }) => {
808 | const $ = cheerio.load(data)
809 | const result = {};
810 | let limk = $('#venkonten > div > div.venser > div > div > ul > li:nth-child(1) > h2 > a').attr('href')
811 | axios.get(limk).then(({ data }) => {
812 | const $$ = cheerio.load(data)
813 | result.message = 'KirBotz'
814 | result.img = $$('#venkonten > div.venser > div.fotoanime').find('img').attr('src')
815 | $$('#venkonten > div.venser > div.fotoanime > div.infozin > div').each(function(a, b) {
816 | result.judul = $$(b).find('p:nth-child(1)').text().replace('Judul: ','')
817 | result.jepang = $$(b).find('p:nth-child(2)').text().replace('Japanese: ','')
818 | result.rate = $$(b).find('p:nth-child(3)').text().replace('Skor: ','')
819 | result.produser = $$(b).find('p:nth-child(4)').text().replace('Produser: ','')
820 | result.tipe = $$(b).find('p:nth-child(5)').text().replace('Tipe: ','')
821 | result.status = $$(b).find('p:nth-child(6)').text().replace('Status: ','')
822 | result.episode = $$(b).find('p:nth-child(7)').text().replace('Total Episode: ','')
823 | result.durasi = $$(b).find('p:nth-child(8)').text().replace('Durasi: ','')
824 | result.rilis = $$(b).find('p:nth-child(9)').text().replace('Tanggal Rilis: ','')
825 | result.studio = $$(b).find('p:nth-child(10)').text().replace('Studio: ','')
826 | result.genre = $$(b).find('p:nth-child(11)').text().replace('Genre: ','')
827 | result.desc = $$('#venkonten > div.venser > div.fotoanime > div.sinopc').text().replace('.','\n') + $$(b).find('div.sinopc > p:nth-child(2)').text()
828 | result.batch = $$('#venkonten > div.venser > div:nth-child(10) > ul > li > span:nth-child(1) > a').attr('href')
829 | })
830 | const lim = $$('#venkonten > div.venser > div:nth-child(10) > ul > li > span:nth-child(1) > a').attr('href')
831 | axios.get(lim).then(({ data }) => {
832 | const $$$ = cheerio.load(data)
833 | result.batchSD = $$$('#venkonten > div:nth-child(6) > ul > li:nth-child(1) > a:nth-child(3)').attr('href')
834 | result.batchHD = $$$('#venkonten > div:nth-child(6) > ul > li:nth-child(3) > a:nth-child(3)').attr('href')
835 | resolve(result)
836 | })
837 | })
838 | })
839 | .catch(reject)
840 | })
841 | }
842 |
843 | module.exports = {
844 | niatsholat,
845 | asmaulhusna,
846 | bacaanshalat,
847 | getDoujin,
848 | onGoing,
849 | kusoNime,
850 | mlstalk,
851 | ffstalk,
852 | npmstalk,
853 | quotesanime,
854 | pornovid,
855 | hentaivid,
856 | nomorhp,
857 | character,
858 | anime,
859 | manga,
860 | searchsticker,
861 | igstalk,
862 | listsurah,
863 | jadwalsholat,
864 | telesticker,
865 | aiovideodl,
866 | linkwa,
867 | mediafiredl,
868 | ytPlayMp4,
869 | ytPlayMp3,
870 | cerpen,
871 | getLatestAnime,
872 | getLatestKomik,
873 | AnimeDl,
874 | KomikDl,
875 | otakudesu }
--------------------------------------------------------------------------------