1.Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序
2.[源码和文档分享]基于Libpcap实现的发包发包局域网嗅探抓包发包解析工具
3.python setuptool包介绍
4.易语言X64安卓手游封包教程(C++/模拟器)
5.appå¼åå¤å
è´¹ç¨è¦å¤å°?
6.五分钟学会发布React组件到NPM包
Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序
在CentOS上使用linuxdeployqt打包发布Qt程序,这一过程与Ubuntu或麒麟系统有相似之处,源码但也存在系统兼容性问题。开源文章详细介绍了CentOS8.2和CentOS7.5的工具发布流程,并强调了使用linuxdeployqt的发包发包好处。该工具能将应用程序所需的源码通达信最强cci指标源码资源(如库、图形和插件)复制到一个包中,开源使其成为自包含的工具程序,可以作为AppDir或AppImage分发,发包发包也可以放入交叉分发包中。源码为了确保在不同系统上的开源一致性,linuxdeployqt特别适用于Qt应用程序的工具部署。
使用linuxdeployqt需要访问其源代码下载地址。发包发包对于CentOS系统,源码文章提供了详细的开源编译步骤。首先,需要下载源码并解压。接着,修改源码,移除版本检查部分,以避免潜在的兼容性问题。确保系统中安装了CMake,这对于构建linuxdeployqt至关重要。在CentOS8.2中,CMake通常是预装的,而在CentOS7.5中,可能需要卸载系统自带的较旧版本,并使用源码安装较新版本,以确保正确编译。
为了支持Qt的依赖环境,步骤包括指定Qt库的快递订单源码路径,以及使用cmake-gui来配置依赖。这确保了linuxdeployqt能正确识别并打包Qt相关的库,避免运行时错误。配置完成后,通过生成generate文件和执行make命令完成编译。随后,将linuxdeployqt安装到系统目录,并进行测试以确认其正确性。
打包Qt程序时,确保应用可执行文件和一个空目录准备就绪。使用环境变量设置,特别是通过source env.sh引入QT_DIR到系统路径中,确保打包过程能正确识别和使用Qt库。打包命令使用linuxdeployqt 可执行程序 -appimage,这一步骤将程序及其依赖库打包成一个独立的可执行文件。测试表明,使用此方法打包的Qt程序能在不同CentOS版本上成功运行,无需额外的库加载。
为了验证这一过程在不同环境中的可靠性,文章介绍了在全新CentOS8.2系统上进行测试的过程。通过对比发现,使用linuxdeployqt -appimage打包的Qt程序能有效解决依赖库问题,确保程序在不同操作系统环境下均可正常运行。
[源码和文档分享]基于Libpcap实现的局域网嗅探抓包发包解析工具
完成一个基于Libpcap的网络数据包解析软件,其设计目的是构建一个易于使用、界面美观的网络监控工具。该软件主要功能包括局域网数据包捕获、分析、图形化显示及统计分析等。具体功能如下:
1. 数据包捕获:利用Libpcap,精英彩源码软件能够扫描并选取不同类型的网卡(如WiFi/以太)进行局域网数据包监听与捕获。用户可选择混杂模式或非混杂模式,混杂模式下,软件接收并分析整个局域网的数据包。
2. 数据包分析:捕获的数据包被分类整理并提取内容进行分析。软件解析数据包版本、头长度、服务类型、总长度、标识、分段标志、分段偏移值、生存时间、上层协议类型、校验和、源IP地址及目的IP地址等信息,以规范形式展示。对于HTTP、ARP等特定协议,能深入解析内容。
3. 图形化显示:通过表格组件,直观展示数据包信息,用户可方便查看并交换数据以获取更深层内容。
4. 统计分析:软件对一段时期内捕获的数据包进行统计,按类型(IPv4/IPv6)和协议(TCP/UDP/ARP等)分类,以饼图直观表示;对于TCP、UDP、ICMP数据包,统计最大、最小、源码资本 陈平均生存期和数据包大小,以直方图显示。
5. 数据包清空:提供功能清除所有已捕获的数据包。
6. Ping功能:实现与目标主机的连通性测试。
7. TraceRoute功能:了解从本机到互联网另一端主机的路径。
8. ARP-Attack功能:在局域网内实现ARP攻击,测试并断开指定IP地址主机的网络连接。通过欺骗目标主机的网关地址,使ARP缓存表错误,导致无法正常发送数据包。若将欺骗的MAC地址设置为自己的MAC地址,则截获目标机器发送的数据包。
详细参考文档和源码下载地址:write-bug.com/article/1...
python setuptool包介绍
Python的setuptools是一个关键工具,专为构建和分发Python包而设计。它整合了一系列强大功能,用于管理和定义包的元数据、依赖关系以及构建选项,还能生成易于安装的包。以下是setuptools的基本应用步骤:安装:使用pip简单快捷,只需在命令行输入`pip install setuptools`。
配置:创建核心的setup.py文件,替换`your_package_name`为你的包名,描述你的包功能,将依赖项列表如['dependency1', 'dependency2']替换为实际的依赖。`setup()`函数可添加作者和许可证等额外信息。
构建:
生成wheel文件(可分发的二进制包):在项目根目录下,执行`python setup.py bdist_wheel`,会在dist目录下生成一个`--py3-none-any.whl`文件。
创建源码分发包(tar.gz文件):若需要源码包,运行`python setup.py sdist`,江疏影源码dist目录下会生成一个`.tar.gz`文件。
通过setuptools,开发者可以高效地管理和构建自己的Python包,确保它们在不同环境中正确安装和运行。
易语言X安卓手游封包教程(C++/模拟器)
本教程专注于计算机协议安全技术研究,仅提供学习资料和工具,禁止用于非法目的。教程采用针对X游戏程序及安卓模拟器的独特技术方案,无需代理、驱动,操作简便,支持多框架,提供部分源码,确保学员获取高质量资源。课程以易语言为核心,同时支持其他编程语言的学习者,每节课时长约分钟。以下为教程大纲:
第一部分:基础原理(小白入门)
1. 封包协议TCP、UDP介绍
2. 代理框架搭建与WPE工具使用
3. 查尔斯全局代理软件数据拦截
4. 远程hook发送代码实操
5. 发送包中控台代码编写
6. 套接字、IP端口与发送功能
7. 封包筛选与工具完善
8. 远程hook与dll代理拦截
第二部分:X远程hook实操
1. X远程hook工具与封包数据分析
2. 配置远程Xhook框架与代码编写
3. X注入安卓发包NPC对话测试
4. 发送与接收包HOOK筛选数据
5. NPC对话包分析与代码封装
6. X安卓模拟器注入源码call函数
7. 易语言写滤镜修改发包功能
8. 替换包与免恢复构造发包
第三部分:封包数据分析与实战
1. 字符编码分析与封包广告
2. 商人封包组包代码
3. 某X网游地图传送数据
4. 人物传送组包实战
5. 某仙日常副本任务分析
6. 自动过副本与材料刷取
7. 封包修改人物名字
8. 接收包识别游戏数据
9. 某网游修改名字组包编写
第四部分:加密解密
1. 封包加密解密基础
2. 全图玩家与NPC信息代码
3. 人物批量加人、加好友代码
4. 常规运算与加密分析
5. base加密解密与密匙实例
第五部分:多开框架讲解
1. 拦截模块与源码
2. X远线程多开发包测试
3. 模拟器多开消息发包框架
4. C语言写模拟器发包插件
第六部分:C++模拟器独控多开
1. C++框架与环境搭建
2. 框架、游戏端界面与C++源码
3. MFC拦截与发送独控
4. 安卓模拟器UDP和TCP全开独控
第七部分:新封包框架
1. 封包两个版本与模块框架实例
2. recv和send拦截原理与实例
第八部分:易语言新封包框架多开+多开图色
1. 手游封包多开功能实现
2. 手游大漠图色模拟配合封包框架
第九部分:热门手游抢拍项目实战
1. 拍卖行抢拍原理与思路
2. 接收包获取抢拍物品信息
3. 物品种类分析与代码编写
4. 抢拍物品信息中控界面
5. 自动刷新与价格设置
附录:提供加密工具、开发作品例子、X注入dll框架与网游实例分析,确保学习者全面掌握所需技能。
appå¼åå¤å è´¹ç¨è¦å¤å°?
appå¼åå¤å è´¹ç¨è¦å¤å°å¦ä»ï¼ä¸å°ä¼ä¸é½æ³æ¥æå±äºèªå·±ä¼ä¸æ产åçææºAPPï¼ä½å ¶ä¸æå°æ°ä¼ä¸ä¸»çé®é¢å°±æ¯ï¼å¼åä¸æ¬¾ææºAPPå°åºéè¦å¤å°é±ï¼
ç®åç¹æ¥è¯´ï¼è¦è§ææºAPPçéæ±åè´¨éèè¨ï¼ä»·ä½ä¸è¬å¨å åå°åå ä¸å·¦å³ï¼æ´é«ç«¯çä»·æ ¼æ´é«ã
ä»å¤©ï¼æ们就æ¥è¯¦ç»åæä¸ä¸è¿ä¸ªé®é¢ï¼è¯·ç»§ç»å¾ä¸çå§ãã
ä¸ãAPPå¼å款å¼å为åºå®æ¬¾åå®å¶æ¬¾ï¼ä¸¤è çä»·æ ¼åä¸ç¸å
åºå®æ¬¾ï¼æ¯æç´æ¥å¥ç¨å·²æçãç°æçAPPåºå®æ¨¡æ¿ï¼æ¥ä»·æ¯åºå®çï¼æéè¦çåè½ä¹æ¯åºå®çï¼ç¼ºç¹å°±æ¯å®¢æ·æ¿ä¸å°æºä»£ç ï¼ä¹ä¸è½æ ¹æ®ä¼ä¸éæ±è¿è¡å®å¶ï¼ç±äºæºä»£ç æ¯å°è£ çï¼å¦æä¼ä¸ä»¥åæ³è¿è¡åè½å级æç³»ç»ç»´æ¤çè¯ï¼ä¹ä¸è½å¤å®ç°ï¼åªè½éæ°å¼åä¸ä¸ªæ°ç软件ã
åºå®æ¬¾çAPPå¼åæ¶é´çï¼çº¦2~3æ¥çæ¶é´å³å¯å®æï¼è´¹ç¨å¤§çº¦å¨å åå°å ä¸ä¹é´ã
å®å¶æ¬¾ï¼å®å¶æ¬¾æ¯æAPPçåè½å ¨é¨éæ°å¼åï¼è¿ç¨æ¯è¾ç¹çï¼éè¦ç¾å·¥ãçåãAPPå¼åï¼åå°/客æ·ç«¯/ææºç«¯ï¼ãåå°ç¨åºåçå·¥ç§ååå®æï¼å¤§åçãåè½å¤æçAPPçè³éè¦æ°å人çå¢éã
ç±äºAPPçåè½å设计é½æ¯å®å¶çï¼å æ¤ä»·æ ¼ä¼é«äºãå®å¶æ¬¾çå¼åæ¶é´ä¸å¼åä»·æ ¼æ¯ææ£æ¯çï¼å¼åæ¶é´é¿ï¼å¤§çº¦å¨ä¸¤ä¸ä¸ªæçè³ä¸å®çå¨æéæè½å®æï¼èè´¹ç¨å¤§æ¦å¨å ä¸çè³åå ä¸å·¦å³ã
å æ¤ï¼æ³è¦ç¥éå¼åä¸æ¬¾ææºAPPéè¦è±è´¹å¤å°é±ï¼ä¼ä¸ä¸»é¦å å¿ é¡»æAPPç详ç»éæ±ååè½åç¥APPå¼åå ¬å¸ï¼å¼åå ¬å¸æè½æ¥åºä¸ä¸ªåççä»·æ ¼ã
äºãææºAPPå¹³å°ä¸åï¼å¶ä½ææ¬ä¹ä¸ä¸æ ·
ç°å¨å¸é¢ä¸æµè¡çææºAPPå¶ä½å¹³å°ä¸»è¦æ两ç§ä¸è¬å æ¬ä¸¤ç§ç³»ç»ï¼å®åç³»ç»ï¼Androidï¼åè¹æç³»ç»ï¼IOSï¼ã
ä¸è¬æ¥è¯´ï¼å¶ä½è¹æç³»ç»çææºAPP软件费ç¨è¦æ¯å®åå¹³å°çè´µä¸äºï¼å 为è¹æå ¬å¸å¯¹è¹æå¹³å°çå°éæ§åææºAPPå¼åè¯è¨Objective-Cçé¾åº¦ï¼é½è®©APPå¼åè å 大äºè¹æç³»ç»ææºAPPå¼åçé¾åº¦ã
ä¸ãAPPå¶ä½ææ¬å å«åä¸äººåçå·¥èµ
é常æ åµä¸ï¼å¼åä¸æ¬¾APPéè¦äº§åç»çã客æ·ç«¯å·¥ç¨å¸ãå端工ç¨å¸åUI设计å¸åä¸åï¼è¿å·²ç»æ¯å¶ä½ææºAPPåºç¨è½¯ä»¶æ¯è¾ç²¾ç®çé ç½®äºï¼æ以è¿äºåä¸äººåçå·¥èµä¹æ¯å å«å¨APPå¶ä½ææ¬å½ä¸çãè¿äºå·¥ä½äººåçæèªå èµ·æ¥å¯è½é½ä¼è¶ è¿4ã5ä¸å ã
åãAPPå¼åå ¬å¸çæå¨å°
éè¦æ³¨æçæ¯ï¼åæ ·å®åçAPPå¼åå ¬å¸ï¼å¨ä¸åçåå¸ä¹ä¼å¯¼è´APPçææ¬è´¹ç¨é«ä¸äºï¼å¦å¨å京ãæ·±å³åä¸æµ·çå°çå¼åå ¬å¸å¼åææ¬è´¹ç¨å°±ä¼æ¯è¾é«ï¼å 为å½å°å¼å人åçèªèµåå ¶ä»æ¯åºç¸å¯¹æ´é«ã
五分钟学会发布React组件到NPM包
前言
最近在做的项目需要实现一个可拖拽、可设置大小、并且在指定范围内才可以移动的需求,在翻了一些组件后,发现需要三样都满足,并且能满足项目定制化需要的插件几乎没有~,于是自己动手实现了该插件,整体效果如下:
在写完之后,突然想到可以放到NPM库中,以后维护该组件更加方便版本管理,于是趁五一长假,终于将包发布上去了~
文档地址
NPM包地址
GitHub主页在发布NPM时踩了一些坑,比如脚手架打包后TS提示消失、比如NPM的官方源换成了HTTPS让发包失败等等因素导致整个过程非常不顺。
为了避免自己未来继续踩同样的坑,或许同时还能够帮助别人节省一点时间,于是才有了这篇博客。
如果你希望未来想用React+TypeScript完成一个组件库并发布到NPM
如果你想了解我在发布时踩了哪些坑
那么这篇博客适合你,阅读时长大约五分钟。
下面是正题。
脚手架工具采用React+TypeScript实现的组件需要借助打包工具将代码打包好才能够被引入,我在查了一些资料后发现有以下三款工具:
TSDX
create-react-library
dumi
这三款工具都预设好了打包工具,比如dumi用的webpack、tsdx用的parcel,而且也基本实现了0配置,我们只需要根据官方文档就可以很快地完成组件编写、用例测试、打包等环节。
其中create-react-library已经很少维护了,所以我没试过它。
tsdx和dumi带给我的体验差不太多,而且发布最重要的其实是写文档,两款工具都有对应的文档工具,tsdx内置的是storybook,我写的第一个组件库就是用的它,但是实在太难配插件了~
tsdx的问题一开始我用的tsdx,但是发现几个问题:
问题一:
我的组件在测试用例时,无法触发ts的提示,然后我发现它打包后的声明文件中需要将:
import?react?from?'react'修改成:
import?*?as?react?from?'react我的组件才能够有类型提示。
问题二:
tsdx中修改组件源代码后,需要手动再次打包,然后删掉example文件夹内的node_modules文件以及.parcel_cache文件夹生成新的dist目录,才会有效果。换言之它的watch模式貌似有问题?
dumi的问题于是我试了一下dumi,dumi写文档的方式对我而言要比tsdx的storybook方便,不过它也有一点缺陷:
即使用了官方推荐的ts-in-markdown插件,在写组件demo时,也是没有api智能提示的,只能提示有没有语法错误之类的。
这个缺陷就使得写demo时没有办法知道当别人用你的组件时,有没有代码自动提示。(自动提示props真的很重要啊!!)
不过最终我找到了解决这个问题的方法,方法在本地测试组件。
我最终选择dumi从结果来说使用dumi打包完的组件还是有类型提示的,不需要我手动改dist目录。
我的组件文档首页目前是这样的:
基本满足了我的需求,所以下面讲讲如何使用dumi的发布过程。
一些微不足道的经验如何使用dumi这里就不多说,看官方文档就好,我在这里讲一下我遇到的问题以及解决方法:
当组件的props类型与外部引入的组件的props类型合并后,写API时会默认将所有props的api都展示出来。
这一点我们需要在.umirc.ts中配置apiParser:
apiParser:?{ ?propFilter:?{ //?是否忽略从?node_modules?继承的属性,默认值为?falseskipNodeModules:?true,//?需要忽略的属性名列表,默认为空数组skipPropsWithName:?[],//?是否忽略没有文档说明的属性,默认值为?falseskipPropsWithoutDoc:?false,?},},当配置publicPath或base后,如果logo和favicon用的本地,一定要在前面加上publicPath或base的路径。
favicon:?'/react-drag-resizable/lightbulb.png',logo:?'/react-drag-resizable/lightbulb.png',base:?'/react-drag-resizable/',publicPath:?'/react-drag-resizable/',否则部署后logo和favicon的会引入失败。(这点在开发环境下发现不了)
dumi官方给的github-pages-action自动部署的yml文件有问题官方给的yml文件是这样写的:
name:?github?pageson:push:branches:
master#defaultbranch这里有问题,需要改成main
main#这才是正确的
jobs:deploy:runs-on:ubuntu-.steps:
uses:actions/checkout@v2
run:npminstall
run:npmrundocs:build
name:Deployuses:peaceiris/actions-gh-pages@v3with:github_token:${ { secrets.GITHUB_TOKEN}}publish_dir:./docs-dist
官方给的自定义导航、分组和标题写法有问题
官方写法如下:
---title:?自定义页面名称nav:?path:?/自定义导航路由?title:?自定义导航名称?order:?控制导航顺序,数字越小越靠前,默认以路径长度和字典序排序group:?path:?/自定义分组路由,注意,分组路由?=?导航路由?+?自己?title:?自定义分组名称?order:?控制分组顺序,数字越小越靠前,默认以路径长度和字典序排序---有效的写法:
---title:?自定义页面名称nav:path:?/自定义导航路由title:?自定义导航名称order:?控制导航顺序,数字越小越靠前,默认以路径长度和字典序排序group:path:?/自定义分组路由,注意,分组路由?=?导航路由?+?自己title:?自定义分组名称order:?控制分组顺序,数字越小越靠前,默认以路径长度和字典序排序---看出差别了吗??
已经将必要的模块导出,但写docs时引入该模块依然报错比如我已经在src/index.ts中导出组件内的类型声明和导出组件了:
export?type?{ ?RectProps,?DragResizableBoxProps?}?from?'./react-drag-resizable';export{ defaultasDragResizableBox}from'./react-drag-resizable';
但是在写?doc?时,正常引入`RectProps`,还是报错了。![image.png](-i-k3u1fbpfcp/7dad4e3efa5ccb9fd~tplv-k3u1fbpfcp-watermark.image?)执行`npm?run?build`打包出一个?dist?文件夹,然后重启?vscode?解决。#?使用github-actions自动化部署我们可以使用?github-actions?自动化将?dumi?的组件文档部署到?github-pages?中,实现步骤如下:1.?在?github?建一个代码仓库2.?到github?的个人主页申请一个?token![image.png](-i-k3u1fbpfcp/3ccdb4d9bfbff0cbecb4de~tplv-k3u1fbpfcp-watermark.image?)3.?选择token?的?note和过期时间![image.png](-i-k3u1fbpfcp/c5a3afeaebcbc3c3~tplv-k3u1fbpfcp-watermark.image?)![image.png](-i-k3u1fbpfcp/1ba1dae0f4ebfdcccdd~tplv-k3u1fbpfcp-watermark.image?)4.?权限选择![image.png](-i-k3u1fbpfcp/e0cecc1cba5aecc8f7a1~tplv-k3u1fbpfcp-watermark.image?)5.?最后生成?token,将token?复制到你的个人仓库的?`setting/secrets`?中![image.png](-i-k3u1fbpfcp/a7eee9ddeda8~tplv-k3u1fbpfcp-watermark.image?)我在这里使用的是?`ACCESS_TOKEN`,也可以自己写,不过这里的名字需要跟后面的?yml?文件保持一致。6.?在你的项目根目录中创建目录和?yml?文件.github└──workflows└──gh-pages.yml
yml文件中这样写```ymlname:?github?pageson:?push:branches:?-?main?#?default?branchjobs:?deploy:runs-on:?ubuntu-.steps:?-?uses:?actions/checkout@v2?-?run:?npm?install?-?run:?npm?run?docs:build?-?name:?Deployuses:?peaceiris/actions-gh-pages@v3with:?github_token:?${ { ?secrets.ACCESS_TOKEN?}}?publish_dir:?./docs-dist注意最后的secrets.ACCESS_TOKEN里面的ACCESS_TOKEN就是你在github仓库中设置的token名字。
在项目的package.json中配置homepage字段
import?*?as?react?from?'react1将代码推送到远程仓库,actions会自动下载依赖并打包
最后打开你配置的homepage就可以看到部署好的文档,我的文档地址是这样的
/中注册一个账号
package.json中配置一些内容
import?*?as?react?from?'react4上面的配置是我收集到的,如果不是非常特殊的情况,我们只需要将name、description、author、version、keywords、homepage、repository修改成自己的就可以了,其他可以不动。
修改README一个NPM包,好的README能够快速让用户知道这个包能够干什么,如何使用等。
这里有一个github高star的项目,教人怎么写README,并提供了模板。
地址在这:standard-readme中文
同时我们可能还需要徽章,这里有一个徽章生成的工具网站,可以根据NPM或者github来生成徽章,我们只需要拷贝到README就可以生成徽章
徽章生成:https://shields.io/
在README中的徽章生成示例代码:
import?*?as?react?from?'react5会变成这样:
我们只需要拷贝代码,并将生成的链接覆盖掉这串代码上的链接就行
在项目中输入命令行发布登陆npm,并根据提示输入注册时的username、password,email
import?*?as?react?from?'react6npm镜像源,记得还原为官方,官方的源已经换成了https协议了
import?*?as?react?from?'react7设置完了也可以再看一眼
import?*?as?react?from?'react8执行npm打包,此时会出来dist文件
import?*?as?react?from?'react9一般来说我们只需要将dist传到npm就行了,不需要传源码,这时候你可能需要再看一眼package.json中的files字段是不是设置正确了
apiParser:?{ ?propFilter:?{ //?是否忽略从?node_modules?继承的属性,默认值为?falseskipNodeModules:?true,//?需要忽略的属性名列表,默认为空数组skipPropsWithName:?[],//?是否忽略没有文档说明的属性,默认值为?falseskipPropsWithoutDoc:?false,?},},0发包
apiParser:?{ ?propFilter:?{ //?是否忽略从?node_modules?继承的属性,默认值为?falseskipNodeModules:?true,//?需要忽略的属性名列表,默认为空数组skipPropsWithName:?[],//?是否忽略没有文档说明的属性,默认值为?falseskipPropsWithoutDoc:?false,?},},1后面更新包的代码时,需要同步更新包的版本,这个字段在package.json中
apiParser:?{ ?propFilter:?{ //?是否忽略从?node_modules?继承的属性,默认值为?falseskipNodeModules:?true,//?需要忽略的属性名列表,默认为空数组skipPropsWithName:?[],//?是否忽略没有文档说明的属性,默认值为?falseskipPropsWithoutDoc:?false,?},},2每次都需要跟上一次不一样,否则会发包失败。
同时发包时,也可以修改其他package.json的内容,但不要改name噢。
最后推广一下本人长期维护的github博客
1.从学习到总结,记录前端重要知识点,涉及Javascript深入、HTTP协议、数据结构和算法、浏览器原理、ES6、前端技巧等内容。
2.在README中有目录可对应查找相关知识点。
如果对您有帮助,欢迎star、follow。
完结,撒花ヽ(°▽°)ノ?
参考#是时候搭建你们团队的UI组件库了
#GitHubActions入门教程-阮一峰
#使用TypeScript+React发布组件到Npm
2024-12-22 16:02
2024-12-22 15:53
2024-12-22 15:04
2024-12-22 14:01
2024-12-22 13:33
2024-12-22 13:26