yz-yuki-plugin 2.0.4-5 → 2.0.4-7
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.
- package/README.md +8 -4
- package/lib/components/dynamic/Account.js +1 -2
- package/lib/components/dynamic/Content.js +1 -2
- package/lib/components/dynamic/Footer.js +1 -2
- package/lib/components/dynamic/ForwardContent.js +1 -2
- package/lib/models/bilibili/bilibili.task.d.ts +18 -1
- package/lib/models/bilibili/bilibili.task.js +16 -6
- package/lib/models/bilibili/bilibili.ticket.js +1 -0
- package/lib/models/bilibili/bilibili.wbi.js +1 -0
- package/lib/models/weibo/weibo.task.d.ts +18 -1
- package/lib/models/weibo/weibo.task.js +16 -6
- package/package.json +1 -1
- package/public/output.css +1 -1
package/README.md
CHANGED
|
@@ -153,8 +153,8 @@ https://m.weibo.cn/u/7643376782 # 7643376782 为崩坏星穹铁道博主uid
|
|
|
153
153
|
| --------- | ----------- | ------------ |
|
|
154
154
|
||||
|
|
155
155
|
| **B站功能** | ------------------------- | ---------- |
|
|
156
|
-
| 添加B站推送 | 检测up的B站动态进行推送,权限:Master
|
|
157
|
-
| 取消B站推送 | 删除对应up的B站对应类型的动态推送,权限:Master
|
|
156
|
+
| 添加B站推送 | 检测up的B站动态进行推送,权限:Master。可选分类:直播、视频、图文、文章、转发,不加分类则默认全部 | `#订阅B站推送uid` `#订阅B站推送 图文 uid` |
|
|
157
|
+
| 取消B站推送 | 删除对应up的B站对应类型的动态推送,权限:Master。可选分类:直播、视频、图文、文章、转发,不加分类则默认全部 | `#取消B站推送uid` `#取消B站推送 图文 uid` |
|
|
158
158
|
| 查看B站订阅列表 | 查看本Bot所有的B站订阅列表,权限:Bot的Master | `#B站全部订阅列表` |
|
|
159
159
|
| 查看本群/私聊B站订阅列表 | 查看 本群/私聊 添加的B站订阅列表 | `#B站订阅列表` |
|
|
160
160
|
| 手动推送B站订阅 | 手动触发定时推送任务,权限:Bot的Master | `#执行B站任务` |
|
|
@@ -169,8 +169,8 @@ https://m.weibo.cn/u/7643376782 # 7643376782 为崩坏星穹铁道博主uid
|
|
|
169
169
|
| 刷新B站临时ck | 重新获取并刷新redis缓存的未绑定自己的B站ck而自动获取的 临时B站cookie | `#刷新B站临时ck` |
|
|
170
170
|
||||
|
|
171
171
|
| **微博功能** | ------------------------- | ---------- |
|
|
172
|
-
| 添加微博推送 | 检测博主的微博动态进行推送,权限:Master
|
|
173
|
-
| 取消微博推送 | 删除对应博主的微博对应类型的动态推送,权限:Master
|
|
172
|
+
| 添加微博推送 | 检测博主的微博动态进行推送,权限:Master。可选分类:视频、图文、文章、转发,不加分类则默认全部 | `#订阅微博推送uid` `#订阅微博推送 图文 uid` |
|
|
173
|
+
| 取消微博推送 | 删除对应博主的微博对应类型的动态推送,权限:Master。可选分类:视频、图文、文章、转发,不加分类则默认全部 | `#取消微博推送uid` `#取消微博推送 图文 uid` |
|
|
174
174
|
| 查看微博订阅列表 | 查看本Bot所有的微博订阅列表,权限:Bot的Master | `#微博全部订阅列表` |
|
|
175
175
|
| 查看本群/私聊微博订阅列表 | 查看 本群/私聊 添加的微博订阅列表 | `#微博订阅列表` |
|
|
176
176
|
| 手动推送微博订阅 | 手动触发定时推送任务,权限:Bot的Master | `#执行微博任务` |
|
|
@@ -196,6 +196,10 @@ https://m.weibo.cn/u/7643376782 # 7643376782 为崩坏星穹铁道博主uid
|
|
|
196
196
|
|
|
197
197
|
有意见或者建议也欢迎提交 [Issues](https://github.com/snowtafir/yuki-plugin/issues) 和 [Pull requests](https://github.com/snowtafir/yuki-plugin/pulls)。
|
|
198
198
|
|
|
199
|
+
> [!TIP]
|
|
200
|
+
> 1. main、main3分支为编译分支,请勿直接在该分支上进行开发,请使用dev、dev3、npm分支进行同步开发,并提交Pull requests。
|
|
201
|
+
> 2. 提交PR后由管理员审核,审核成功并合并后会自动进行github actions编译,最终提交编译好的代码到main、main3分支以及发布到npm。
|
|
202
|
+
|
|
199
203
|
# 🌟 六、license/声明
|
|
200
204
|
- this project is inspired by [trss-xianxin-plugin](https://github.com/snowtafir/xianxin-plugin)
|
|
201
205
|
- 基于 `MIT` 协议开源,但有如下额外限制:
|
|
@@ -34,6 +34,5 @@ const Footer = ({ data }) => {
|
|
|
34
34
|
React.createElement("span", { className: "italic" }, yukiPluginVersion))),
|
|
35
35
|
React.createElement("img", { src: data.urlImgData, alt: "\u4E8C\u7EF4\u7801", className: "qr-code" }))));
|
|
36
36
|
};
|
|
37
|
-
var Footer$1 = Footer;
|
|
38
37
|
|
|
39
|
-
export { Footer
|
|
38
|
+
export { Footer as default };
|
|
@@ -13,6 +13,5 @@ const ForwardContent = ({ data }) => (React.createElement(React.Fragment, null,
|
|
|
13
13
|
React.createElement("div", { className: "orig-container", id: "orig-container" },
|
|
14
14
|
React.createElement(Account, { data: data }),
|
|
15
15
|
React.createElement(Content, { data: data })))));
|
|
16
|
-
var ForwardContent$1 = ForwardContent;
|
|
17
16
|
|
|
18
|
-
export { ForwardContent
|
|
17
|
+
export { ForwardContent as default };
|
|
@@ -16,7 +16,24 @@ export declare class BiliTask {
|
|
|
16
16
|
* @param dynamicList 动态列表
|
|
17
17
|
* @param lastLiveStatus 最后直播状态
|
|
18
18
|
*/
|
|
19
|
-
processBiliData(biliPushData:
|
|
19
|
+
processBiliData(biliPushData: {
|
|
20
|
+
group?: {
|
|
21
|
+
[chatId: string]: {
|
|
22
|
+
bot_id: string;
|
|
23
|
+
uid: string;
|
|
24
|
+
name: string;
|
|
25
|
+
type: string[];
|
|
26
|
+
}[];
|
|
27
|
+
};
|
|
28
|
+
private?: {
|
|
29
|
+
[chatId: string]: {
|
|
30
|
+
bot_id: string;
|
|
31
|
+
uid: string;
|
|
32
|
+
name: string;
|
|
33
|
+
type: string[];
|
|
34
|
+
}[];
|
|
35
|
+
};
|
|
36
|
+
}, uidMap: Map<any, Map<string, any>>, dynamicList: any, lastLiveStatus: any): Promise<void>;
|
|
20
37
|
/**
|
|
21
38
|
* 推送动态消息
|
|
22
39
|
* @param uidMap uid 映射
|
|
@@ -26,7 +26,7 @@ class BiliTask {
|
|
|
26
26
|
else if (resjson.code === -352) {
|
|
27
27
|
await postGateway(cookie);
|
|
28
28
|
if (count < 3) {
|
|
29
|
-
await
|
|
29
|
+
await this.randomDelay(2000, 8000); // 随机延时2-8秒
|
|
30
30
|
await this.hendleEventDynamicData(uid, count + 1);
|
|
31
31
|
logger.error(`获取 ${uid} 动态,Gateway count:${String(count)}`);
|
|
32
32
|
}
|
|
@@ -58,18 +58,27 @@ class BiliTask {
|
|
|
58
58
|
* @param lastLiveStatus 最后直播状态
|
|
59
59
|
*/
|
|
60
60
|
async processBiliData(biliPushData, uidMap, dynamicList, lastLiveStatus) {
|
|
61
|
+
const requestedDataOfUids = new Map(); // 存放已请求的 uid 映射
|
|
61
62
|
for (let chatType in biliPushData) { // 遍历 group 和 private
|
|
62
63
|
if (!uidMap.has(chatType)) {
|
|
63
64
|
uidMap.set(chatType, new Map());
|
|
64
65
|
}
|
|
65
66
|
const chatTypeMap = uidMap.get(chatType); // 建立当前 chatType (group 或 private) 的 uid 映射
|
|
66
67
|
for (let chatId in biliPushData[chatType]) {
|
|
67
|
-
const subUpsOfChat = biliPushData[chatType][chatId] || [];
|
|
68
|
+
const subUpsOfChat = Array.prototype.slice.call(biliPushData[chatType][chatId] || []);
|
|
68
69
|
for (let subInfoOfup of subUpsOfChat) {
|
|
69
70
|
if (!lastLiveStatus[subInfoOfup.uid]) {
|
|
70
71
|
lastLiveStatus[subInfoOfup.uid] = 0;
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
+
let resp;
|
|
74
|
+
// 检查是否已经请求过该 uid
|
|
75
|
+
if (requestedDataOfUids.has(subInfoOfup.uid)) {
|
|
76
|
+
resp = requestedDataOfUids.get(subInfoOfup.uid); // 从已请求的映射中获取响应数据
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
resp = await this.hendleEventDynamicData(subInfoOfup.uid);
|
|
80
|
+
requestedDataOfUids.set(subInfoOfup.uid, resp); // 将响应数据存储到映射中
|
|
81
|
+
}
|
|
73
82
|
if (resp) {
|
|
74
83
|
if (resp.code === 0) {
|
|
75
84
|
const dynamicData = resp.data?.items || [];
|
|
@@ -92,10 +101,11 @@ class BiliTask {
|
|
|
92
101
|
const bot_id = subInfoOfup.bot_id || [];
|
|
93
102
|
const { name, type } = subInfoOfup;
|
|
94
103
|
chatTypeMap.set(subInfoOfup.uid, { chatIds, bot_id, upName: name, type });
|
|
95
|
-
await
|
|
104
|
+
await this.randomDelay(1000, 4000); // 随机延时1-4秒
|
|
96
105
|
}
|
|
97
106
|
}
|
|
98
107
|
}
|
|
108
|
+
requestedDataOfUids.clear(); // 清空已请求的映射
|
|
99
109
|
}
|
|
100
110
|
/**
|
|
101
111
|
* 推送动态消息
|
|
@@ -137,7 +147,7 @@ class BiliTask {
|
|
|
137
147
|
if (type && type.length && !type.includes(pushDynamicData.type))
|
|
138
148
|
continue; // 如果禁用了某类型的动态推送,跳过当前循环
|
|
139
149
|
await this.sendDynamic(chatId, bot_id, upName, pushDynamicData, biliConfigData, chatType); // 发送动态消息
|
|
140
|
-
await
|
|
150
|
+
await this.randomDelay(1000, 2000); // 随机延时1-2秒
|
|
141
151
|
}
|
|
142
152
|
}
|
|
143
153
|
}
|
|
@@ -190,7 +200,7 @@ class BiliTask {
|
|
|
190
200
|
for (let i = 0; i < imgs.length; i++) {
|
|
191
201
|
const image = imgs[i];
|
|
192
202
|
await this.sendMessage(chatId, bot_id, chatType, Segment.image(image));
|
|
193
|
-
await
|
|
203
|
+
await this.randomDelay(1000, 2000); // 随机延时1-2秒
|
|
194
204
|
}
|
|
195
205
|
await new Promise((resolve) => setTimeout(resolve, 1000)); // 休眠1秒
|
|
196
206
|
}
|
|
@@ -14,7 +14,24 @@ export declare class WeiboTask {
|
|
|
14
14
|
* @param uidMap uid 映射
|
|
15
15
|
* @param dynamicList 动态列表
|
|
16
16
|
*/
|
|
17
|
-
processWeiboData(weiboPushData:
|
|
17
|
+
processWeiboData(weiboPushData: {
|
|
18
|
+
group?: {
|
|
19
|
+
[chatId: string]: {
|
|
20
|
+
bot_id: string;
|
|
21
|
+
uid: string;
|
|
22
|
+
name: string;
|
|
23
|
+
type: string[];
|
|
24
|
+
}[];
|
|
25
|
+
};
|
|
26
|
+
private?: {
|
|
27
|
+
[chatId: string]: {
|
|
28
|
+
bot_id: string;
|
|
29
|
+
uid: string;
|
|
30
|
+
name: string;
|
|
31
|
+
type: string[];
|
|
32
|
+
}[];
|
|
33
|
+
};
|
|
34
|
+
}, uidMap: Map<any, Map<string, any>>, dynamicList: any): Promise<void>;
|
|
18
35
|
/**
|
|
19
36
|
* 推送动态消息
|
|
20
37
|
* @param uidMap uid 映射
|
|
@@ -32,15 +32,24 @@ class WeiboTask {
|
|
|
32
32
|
* @param dynamicList 动态列表
|
|
33
33
|
*/
|
|
34
34
|
async processWeiboData(weiboPushData, uidMap, dynamicList) {
|
|
35
|
+
const requestedDataOfUids = new Map(); // 存放已请求的 uid 映射
|
|
35
36
|
for (let chatType in weiboPushData) { // 遍历 group 和 private
|
|
36
37
|
if (!uidMap.has(chatType)) {
|
|
37
38
|
uidMap.set(chatType, new Map());
|
|
38
39
|
}
|
|
39
40
|
const chatTypeMap = uidMap.get(chatType); // 建立当前 chatType (group 或 private) 的 uid 映射
|
|
40
41
|
for (let chatId in weiboPushData[chatType]) {
|
|
41
|
-
const subUpsOfChat = weiboPushData[chatType][chatId] || [];
|
|
42
|
+
const subUpsOfChat = Array.prototype.slice.call(weiboPushData[chatType][chatId] || []);
|
|
42
43
|
for (let subInfoOfup of subUpsOfChat) {
|
|
43
|
-
|
|
44
|
+
let resp;
|
|
45
|
+
// 检查是否已经请求过该 uid
|
|
46
|
+
if (requestedDataOfUids.has(subInfoOfup.uid)) {
|
|
47
|
+
resp = requestedDataOfUids.get(subInfoOfup.uid); // 从已请求的映射中获取响应数据
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
resp = await await new WeiboGetWebData().getBloggerDynamicList(subInfoOfup.uid); // 获取指定 uid 的动态列表
|
|
51
|
+
requestedDataOfUids.set(subInfoOfup.uid, resp); // 将响应数据存储到映射中
|
|
52
|
+
}
|
|
44
53
|
if (resp) {
|
|
45
54
|
const dynamicData = resp || [];
|
|
46
55
|
dynamicList[subInfoOfup.uid] = dynamicData;
|
|
@@ -53,6 +62,7 @@ class WeiboTask {
|
|
|
53
62
|
}
|
|
54
63
|
}
|
|
55
64
|
}
|
|
65
|
+
requestedDataOfUids.clear(); // 清空已请求的映射
|
|
56
66
|
}
|
|
57
67
|
/**
|
|
58
68
|
* 推送动态消息
|
|
@@ -95,7 +105,7 @@ class WeiboTask {
|
|
|
95
105
|
if (type && type.length && !type.includes(pushDynamicData.type))
|
|
96
106
|
continue; // 如果禁用了某类型的动态推送,跳过当前循环
|
|
97
107
|
await this.sendDynamic(chatId, bot_id, upName, pushDynamicData, weiboConfigData, chatType); // 发送动态消息
|
|
98
|
-
await this.randomDelay(
|
|
108
|
+
await this.randomDelay(1000, 2000); // 随机延时1-2秒
|
|
99
109
|
}
|
|
100
110
|
}
|
|
101
111
|
}
|
|
@@ -156,9 +166,9 @@ class WeiboTask {
|
|
|
156
166
|
for (let i = 0; i < imgs.length; i++) {
|
|
157
167
|
const image = imgs[i];
|
|
158
168
|
await this.sendMessage(chatId, bot_id, chatType, Segment.image(image));
|
|
159
|
-
await this.randomDelay(
|
|
169
|
+
await this.randomDelay(1000, 2000); // 随机延时1-2秒
|
|
160
170
|
}
|
|
161
|
-
await
|
|
171
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
162
172
|
}
|
|
163
173
|
else {
|
|
164
174
|
const dynamicMsg = await WeiboQuery.formatTextDynamicData(upName, pushDynamicData, false, weiboConfigData); //构建文字动态消息
|
|
@@ -173,7 +183,7 @@ class WeiboTask {
|
|
|
173
183
|
}
|
|
174
184
|
}
|
|
175
185
|
await this.sendMessage(chatId, bot_id, chatType, dynamicMsg);
|
|
176
|
-
await
|
|
186
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
177
187
|
}
|
|
178
188
|
}
|
|
179
189
|
/**
|
package/package.json
CHANGED
package/public/output.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.
|
|
1
|
+
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.m-auto{margin:auto}.mb-3{margin-bottom:.75rem}.ml-7{margin-left:1.75rem}.mt-3{margin-top:.75rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-72{height:18rem}.max-h-96{max-height:24rem}.w-32{width:8rem}.w-72{width:18rem}.w-96{width:24rem}.p-1{padding:.25rem}.p-5{padding:1.25rem}.text-center{text-align:center}.text-lg{font-size:1.125rem;line-height:1.75rem}.italic{font-style:italic}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}
|