Kekik 1.5.5__tar.gz → 1.5.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Kekik might be problematic. Click here for more details.
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/Sifreleme/AESManager.py +1 -15
- kekik-1.5.7/Kekik/Sifreleme/CryptoJS.py +87 -0
- kekik-1.5.7/Kekik/Sifreleme/HexCodec.py +19 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/Sifreleme/NaysHash.py +1 -17
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/Sifreleme/Packer.py +1 -12
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/Sifreleme/StringCodec.py +1 -19
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/cli.py +1 -1
- kekik-1.5.7/Kekik.egg-info/PKG-INFO +385 -0
- kekik-1.5.7/PKG-INFO +385 -0
- kekik-1.5.7/README.md +356 -0
- {kekik-1.5.5 → kekik-1.5.7}/setup.py +1 -1
- kekik-1.5.5/Kekik/Sifreleme/CryptoJS.py +0 -98
- kekik-1.5.5/Kekik/Sifreleme/HexCodec.py +0 -27
- kekik-1.5.5/Kekik.egg-info/PKG-INFO +0 -276
- kekik-1.5.5/PKG-INFO +0 -276
- kekik-1.5.5/README.md +0 -247
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/BIST.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/Domain2IP.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/Nesne.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/Sifreleme/__init__.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/__init__.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/csv2dict.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/dict2csv.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/dict2json.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/dosya2set.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/dosya_indir.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/hwid_kontrol.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/kisi_ver/__init__.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/kisi_ver/biyografiler.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/kisi_ver/isimler.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/kisi_ver/soyisimler.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/link_islemleri.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/list2html.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/liste_fetis.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/mail_gonder.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/okunabilir_byte.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/proxy_ver.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/qr_ver.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/ses_fetis.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/slugify.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/terminal_baslik.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/txt_fetis.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/unicode_tr.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik/zaman_donustur.py +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik.egg-info/SOURCES.txt +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik.egg-info/dependency_links.txt +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik.egg-info/entry_points.txt +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik.egg-info/requires.txt +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/Kekik.egg-info/top_level.txt +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/LICENSE +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/MANIFEST.in +0 -0
- {kekik-1.5.5 → kekik-1.5.7}/setup.cfg +0 -0
|
@@ -63,18 +63,4 @@ class AESManager:
|
|
|
63
63
|
cipher = AES.new(key, AES.MODE_CBC, iv)
|
|
64
64
|
decrypted = unpad(cipher.decrypt(b64decode(data["ct"])), AES.block_size)
|
|
65
65
|
|
|
66
|
-
return decrypted.decode("utf-8")
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
# veri = r'''
|
|
71
|
-
# $(document).ready(function() {
|
|
72
|
-
# bePlayer('S3JScTBsNzMyYlFSMHg4NG5vQXNjUT09', '{"ct":"SjkWeIotWbL6TmnwyhkeLy6wAWvEG1pz8R0g+IsLN6P1vo9WvXuiqqDal5g6FXW3Td+Q+1DIGQAt3sNxydOAr4p3uFxxpVPUwIMwLWzw+5m0ED0tno1KU0\/rCXRwq6ATvmrIqSr+qb95hY0wjm3gfjPsxDn4vJ1fcdiRwrfC38MjfKyJFN3\/n\/xLvNT4vgQJTYTEmNOzFZgEIhsSRFiW1\/8nQCaS\/8Xkw0ySUqLvzSMsVf2SSgXyESxyksn3+kz9KqEI+mQpJFUcLSBz8VKXly+tEcYGpTQChzceyudkZcEGvppKheBAarEQ6e3eR9d04gQcFpEaV+QmHODvI1Ql\/pJ1FSAh9F5ZDtF00XDSLZbIEt00PWRkgfc3kxuNQzcC1C6BULNdoGwHbvo5W6uUsMwxG+sn+EH7B7jWtyhx5VHKpIfkyrjC10+K\/hG29bkS3YNSTaDxJnTa3jj1usbwwMX0A7wApIlce4rEVgWpO5y1ZuiJ+tEE3kH1InUzT1jfY4Y0KrZ5X+p2nrQhJrDOxfDy\/GhaidNmmpfuzF6Iniko6sCGa0QRbhVB8ZbrC9qFB\/sk47ZOP1IHPY\/jCh4BTFMDCy1Qx1\/PbVLZzNLHju\/cLYRzS0vJp5aqkwg\/QNCo1q5HrxXL32lMLNOcWPRDqyZaMpiYP+LzJPVndLsqGlfKJWETuKonEqc4r4M0Eu\/bTji\/S7zQ7bvEPuT3PyIRWXDffuNSX6+nqWFD8LM\/iNyc1cC3bMi+p0TR3YZu1MlIvxjYPK0lYtDvd+vaYgCotFm0lLsqg5cuw3pGb8jnEfM1VzEqDcBvBTkRKrxIao\/WWdvGf1MCmTsr+nVH0sT8PTrh6XcoG7hV\/+y8XCsEj2LKWtDtfK+RxSztteXYUUUI9NVtCvjlW\/b8+h6u+B\/CNLtrwoDQzKhTVZ1rZbe\/TP+HR7SkMXYqyAX3qqiyi9s+TrcqkxdbAHzkjr0q2DshtUeipcL5HVrdxL28iXqtYMT\/ytsRCQHpnswNGqW+D47VAYtDl4VafSaNGUMPfu6nq4k0\/FrxtYkts4lE9YUkueQHip8eOFO8dxTp8O7+Civt88C45wEjBHqaiN+n6wm1+3xUy2hKX0PD4gvlPuUeoHDbm\/HLUlPYmGw5cCEAskuJRXdW+gnFB6XzVIKrF7OUtd2yLqSLhnWcSFkMJoPDuIezn1D60pMi8LlJKb1HXwbPRRcqh00\/bFNdmodGpwybcaeegvRaCJbDqd6fmQUxG1ir9o5O8st2\/oJ9\/HivYvxi\/sicZYNzFtuZFGC\/ubPK5Ld9RsJb\/RQ9rkTZzhkBnmM=","iv":"2fedfd8ae68165490f274b521d5a3291","s":"74a525e8e5746772"}');
|
|
73
|
-
# });
|
|
74
|
-
# '''
|
|
75
|
-
|
|
76
|
-
# be_player = re.search(r"bePlayer\('([^']+)',\s*'(\{[^\}]+\})'\);", veri).groups()
|
|
77
|
-
# be_player_pass = be_player[0]
|
|
78
|
-
# be_player_data = be_player[1]
|
|
79
|
-
|
|
80
|
-
# print(json.loads(AESManager.decrypt(be_player_data, be_player_pass).replace("\\", "")))
|
|
66
|
+
return decrypted.decode("utf-8")
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from Crypto.Cipher import AES
|
|
4
|
+
from Crypto.Random import get_random_bytes
|
|
5
|
+
import hashlib, base64
|
|
6
|
+
|
|
7
|
+
class CryptoJS:
|
|
8
|
+
"""
|
|
9
|
+
Paroladan türetilmiş anahtar ile AES/CBC/PKCS7Padding şifreleme ve şifre çözme işlemleri için bir sınıf.
|
|
10
|
+
CryptoJS AES yöntemine uygundur.
|
|
11
|
+
! » https://gist.github.com/thackerronak/554c985c3001b16810af5fc0eb5c358f
|
|
12
|
+
"""
|
|
13
|
+
KEY_SIZE = 32
|
|
14
|
+
IV_SIZE = 16
|
|
15
|
+
HASH_CIPHER = "AES/CBC/PKCS7Padding"
|
|
16
|
+
AES_MODE = AES.MODE_CBC
|
|
17
|
+
KDF_DIGEST = "md5"
|
|
18
|
+
APPEND = b"Salted__"
|
|
19
|
+
|
|
20
|
+
@staticmethod
|
|
21
|
+
def evp_kdf(password, salt, key_size=32, iv_size=16, iterations=1, hash_algorithm="md5"):
|
|
22
|
+
"""Paroladan Anahtar ve IV oluşturmak için bir KDF fonksiyonu."""
|
|
23
|
+
target_key_size = key_size + iv_size
|
|
24
|
+
derived_bytes = b""
|
|
25
|
+
block = None
|
|
26
|
+
|
|
27
|
+
while len(derived_bytes) < target_key_size:
|
|
28
|
+
hasher = hashlib.new(hash_algorithm)
|
|
29
|
+
if block:
|
|
30
|
+
hasher.update(block)
|
|
31
|
+
|
|
32
|
+
hasher.update(password)
|
|
33
|
+
hasher.update(salt)
|
|
34
|
+
block = hasher.digest()
|
|
35
|
+
|
|
36
|
+
for _ in range(1, iterations):
|
|
37
|
+
block = hashlib.new(hash_algorithm, block).digest()
|
|
38
|
+
|
|
39
|
+
derived_bytes += block
|
|
40
|
+
|
|
41
|
+
return derived_bytes[:key_size], derived_bytes[key_size:key_size + iv_size]
|
|
42
|
+
|
|
43
|
+
@staticmethod
|
|
44
|
+
def encrypt(password, plain_text):
|
|
45
|
+
"""Verilen metni AES/CBC/PKCS7Padding şifreleme yöntemi ile şifreler."""
|
|
46
|
+
salt = CryptoJS.generate_salt(8)
|
|
47
|
+
key, iv = CryptoJS.evp_kdf(password.encode("utf-8"), salt, key_size=CryptoJS.KEY_SIZE, iv_size=CryptoJS.IV_SIZE)
|
|
48
|
+
|
|
49
|
+
cipher = AES.new(key, CryptoJS.AES_MODE, iv)
|
|
50
|
+
cipher_text = cipher.encrypt(CryptoJS._pad(plain_text.encode("utf-8")))
|
|
51
|
+
|
|
52
|
+
# Create CryptoJS-like encrypted output
|
|
53
|
+
encrypted_data = CryptoJS.APPEND + salt + cipher_text
|
|
54
|
+
|
|
55
|
+
return base64.b64encode(encrypted_data).decode("utf-8")
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
def decrypt(password, cipher_text):
|
|
59
|
+
"""Verilen şifreli metni AES/CBC/PKCS7Padding şifreleme yöntemi ile çözer."""
|
|
60
|
+
ct_bytes = base64.b64decode(cipher_text)
|
|
61
|
+
salt = ct_bytes[8:16]
|
|
62
|
+
cipher_text_bytes = ct_bytes[16:]
|
|
63
|
+
|
|
64
|
+
key, iv = CryptoJS.evp_kdf(password.encode("utf-8"), salt, key_size=CryptoJS.KEY_SIZE, iv_size=CryptoJS.IV_SIZE)
|
|
65
|
+
|
|
66
|
+
cipher = AES.new(key, CryptoJS.AES_MODE, iv)
|
|
67
|
+
plain_text = cipher.decrypt(cipher_text_bytes)
|
|
68
|
+
|
|
69
|
+
return CryptoJS._unpad(plain_text).decode("utf-8")
|
|
70
|
+
|
|
71
|
+
@staticmethod
|
|
72
|
+
def _pad(s):
|
|
73
|
+
"""Veriyi AES blok boyutuna göre doldurur (PKCS7)."""
|
|
74
|
+
block_size = AES.block_size
|
|
75
|
+
padding = block_size - len(s) % block_size
|
|
76
|
+
|
|
77
|
+
return s + bytes([padding] * padding)
|
|
78
|
+
|
|
79
|
+
@staticmethod
|
|
80
|
+
def _unpad(s):
|
|
81
|
+
"""Dolguyu kaldırır (PKCS7)."""
|
|
82
|
+
return s[:-ord(s[-1:])]
|
|
83
|
+
|
|
84
|
+
@staticmethod
|
|
85
|
+
def generate_salt(length):
|
|
86
|
+
"""Belirtilen uzunlukta rastgele bir tuz oluşturur."""
|
|
87
|
+
return get_random_bytes(length)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
class HexCodec:
|
|
4
|
+
@staticmethod
|
|
5
|
+
def encode(utf8_string: str) -> str:
|
|
6
|
+
"""UTF-8 stringini kaçış dizileriyle birlikte hex stringine dönüştürür."""
|
|
7
|
+
byte_data = utf8_string.encode("utf-8")
|
|
8
|
+
hex_string = byte_data.hex()
|
|
9
|
+
escaped_hex = "\\x".join(hex_string[i:i+2] for i in range(0, len(hex_string), 2))
|
|
10
|
+
|
|
11
|
+
return f"\\x{escaped_hex}"
|
|
12
|
+
|
|
13
|
+
@staticmethod
|
|
14
|
+
def decode(escaped_hex: str) -> str:
|
|
15
|
+
"""Kaçış dizileri içeren bir hex stringini UTF-8 formatındaki stringe dönüştürür."""
|
|
16
|
+
hex_string = escaped_hex.replace("\\x", "")
|
|
17
|
+
byte_data = bytes.fromhex(hex_string)
|
|
18
|
+
|
|
19
|
+
return byte_data.decode("utf-8")
|
|
@@ -47,20 +47,4 @@ class NaysHash:
|
|
|
47
47
|
# API isteği için "xtoken" oluştur
|
|
48
48
|
return self.generate_hash_with_hmac256(
|
|
49
49
|
f"{endpoint}{dumps(payload, ensure_ascii=False, sort_keys=False)}{timestamp}".replace(" ", "")
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
# print(NaysHash().generate_xtoken(
|
|
55
|
-
# timestamp = 1695076755128,
|
|
56
|
-
# endpoint = "/customer-citizen-info-v3",
|
|
57
|
-
# payload = {
|
|
58
|
-
# "birthDay" : 31,
|
|
59
|
-
# "birthMonth" : 1,
|
|
60
|
-
# "birthYear" : 1990,
|
|
61
|
-
# "citizenId" : "11111111111",
|
|
62
|
-
# "customerName" : "merhaba",
|
|
63
|
-
# "customerSurname" : "dünya",
|
|
64
|
-
# "explicitConsentSigned" : True
|
|
65
|
-
# },
|
|
66
|
-
# ))
|
|
50
|
+
)
|
|
@@ -59,15 +59,4 @@ class Packer:
|
|
|
59
59
|
# Bu işlev, simgeleri ve sıkıştırılmış metni yeniden oluşturmak için bir yol sağlar.
|
|
60
60
|
# Ancak bu, belirli bir algoritma veya sıkıştırma tekniğine bağlıdır.
|
|
61
61
|
# Gerçekleştirilmesi zor olabilir çünkü P.A.C.K.E.R.'ın spesifik sıkıştırma mantığını takip etmek gerekir.
|
|
62
|
-
raise NotImplementedError("Packing function is not implemented.")
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
# veri = r'''
|
|
66
|
-
# qualityLabels: {"1661":"720p","814":"480p","524":"360p"},
|
|
67
|
-
# };
|
|
68
|
-
# eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1d(17(p,a,c,k,e,d){e=17(c){18(c<a?\'\':e(1D(c/a)))+((c=c%a)>1w?1c.1C(c+29):c.1B(1z))};1a(!\'\'.19(/^/,1c)){1b(c--){d[e(c)]=k[c]||e(c)}k=[17(e){18 d[e]}];e=17(){18\'\\\\w+\'};c=1};1b(c--){1a(k[c]){p=p.19(1y 1x(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c])}}18 p}(\'G.H=[{"16":M,"D":"\\\\w\\\\2\\\\2\\\\5\\\\y\\\\N\\\\e\\\\e\\\\i\\\\l\\\\x\\\\a\\\\6\\\\P\\\\f\\\\h\\\\y\\\\5\\\\Q\\\\2\\\\x\\\\d\\\\L\\\\9\\\\9\\\\e\\\\1\\\\l\\\\e\\\\8\\\\2\\\\m\\\\4\\\\8\\\\k\\\\b\\\\s\\\\J\\\\k\\\\n\\\\p\\\\v\\\\3\\\\q\\\\A\\\\c\\\\r\\\\3\\\\d\\\\1\\\\d\\\\j\\\\4\\\\E\\\\2\\\\5\\\\7\\\\1\\\\8\\\\j\\\\1\\\\d\\\\1\\\\t\\\\q\\\\b\\\\K\\\\4\\\\s\\\\t\\\\O\\\\b\\\\6\\\\F\\\\W\\\\q\\\\n\\\\V\\\\3\\\\6\\\\6\\\\z\\\\f\\\\c\\\\I\\\\4\\\\1\\\\c\\\\C\\\\6\\\\3\\\\o\\\\w\\\\l\\\\9\\\\r\\\\m\\\\b\\\\a\\\\m\\\\u\\\\B\\\\p\\\\k\\\\5\\\\9\\\\7\\\\v\\\\z\\\\A\\\\B\\\\7\\\\C\\\\u\\\\E\\\\Y\\\\2\\\\L\\\\K\\\\J\\\\7\\\\g\\\\8\\\\3\\\\a\\\\i\\\\5\\\\g\\\\g\\\\h\\\\15\\\\h\\\\i\\\\1\\\\F\\\\j\\\\a\\\\2\\\\1\\\\I\\\\f\\\\o\\\\14\\\\c\\\\n\\\\p\\\\o\\\\3\\\\13\\\\12\\\\4","11":"0","10":"Z","X":"U"}];T S=R(G.H[0].D);\',1F,1G,\'|1H|1I|1J|1u|1L|1E|1v|1p|1t|1f|1g|1h|1i|1N|1j|1k|1e|1m|1n|1o|1l|1q|1r|1s|1M|1K|1O|1P|2e|2f|2g|2h|2i|2m|2j|2k|2l|2c|2n|2o|2p|2q|2r|2s|2t|2u|2d|2b|1Z|28|1Q|1R|1S|1T|1U|1V|1W|1X|2a|1Y|20|21|22|23|24|25|26|27\'.1A(\'|\'),0,{}))',62,155,'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||function|return|replace|if|while|String|eval|x65|x69|x5a|x47|x62|x67|x46|x32|x64|x30|x51|x4e|x4f|x41|x38|x7a|x31|x57|35|RegExp|new|36|split|toString|fromCharCode|parseInt|x6d|62|69|x66|x74|x6c|x58|x70|x6b|x2f|x33|x6a|x61|x6f|getLocation|mu|var|none|x37|x71|x4d|x3a|hls|type|label|x72|x76|x52|x6e|default|x77||preload|true|x42|x75|x50|x63|x78|x68|x2e|x4b|x45|x4c|x73|file|x79|x48|jwSetup|sources|x59|x44|x55'.split('|'),0,{}));
|
|
69
|
-
# var played = 0;
|
|
70
|
-
# '''
|
|
71
|
-
|
|
72
|
-
# eval_jwSetup = re.compile(r'\};\s*(eval\(function[\s\S]*?)var played = \d+;').findall(veri)[0]
|
|
73
|
-
# print(Packer.unpack(Packer.unpack(eval_jwSetup)))
|
|
62
|
+
raise NotImplementedError("Packing function is not implemented.")
|
|
@@ -37,22 +37,4 @@ class StringCodec:
|
|
|
37
37
|
@staticmethod
|
|
38
38
|
def encode(plain_text: str) -> str:
|
|
39
39
|
"""Önce Base64 kodlar, ardından ROT13 uygular."""
|
|
40
|
-
return StringCodec.rtt(StringCodec.btoa(plain_text))
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
# veri = r'''
|
|
45
|
-
# var scx = {"fastly":{"tt":"RmFzdGx5","sx":{"p":[],"t":["nUE0pUZ6Yl92nJEgo3u5YzAioF9zoP92ZKtjMGMuAGRlBN=="]},"order":4}};
|
|
46
|
-
# '''
|
|
47
|
-
|
|
48
|
-
# scx_data = json.loads(re.findall(r'scx = (.*?);', veri)[0])
|
|
49
|
-
|
|
50
|
-
# link_list = []
|
|
51
|
-
# for key in list(scx_data.keys()):
|
|
52
|
-
# t = scx_data[key]["sx"]["t"]
|
|
53
|
-
# if isinstance(t, list):
|
|
54
|
-
# link_list.append({key: StringCodec.decode(elem) for elem in t})
|
|
55
|
-
# if isinstance(t, dict):
|
|
56
|
-
# link_list.append({k: StringCodec.decode(v) for k, v in t.items()})
|
|
57
|
-
|
|
58
|
-
# print(link_list)
|
|
40
|
+
return StringCodec.rtt(StringCodec.btoa(plain_text))
|