Skip to content

Commit

Permalink
feat: 新版挂件-新增CSDN适配器
Browse files Browse the repository at this point in the history
  • Loading branch information
terwer committed Jul 30, 2023
1 parent 3591d1c commit 4bbc435
Show file tree
Hide file tree
Showing 10 changed files with 199 additions and 8 deletions.
6 changes: 6 additions & 0 deletions src/adaptors/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import { useWordpressApi } from "~/src/adaptors/api/wordpress/useWordpressApi.ts
import { useTypechoApi } from "~/src/adaptors/api/typecho/useTypechoApi.ts"
import { useYuqueApi } from "~/src/adaptors/api/yuque/useYuqueApi.ts"
import { useZhihuWeb } from "~/src/adaptors/web/zhihu/useZhihuWeb.ts"
import { useCsdnWeb } from "~/src/adaptors/web/csdn/useCsdnWeb.ts"

/**
* 适配器统一入口
Expand Down Expand Up @@ -77,6 +78,11 @@ class Adaptors {
blogAdaptor = webApi
break
}
case SubPlatformType.Custom_CSDN: {
const { webApi } = await useCsdnWeb(key, newCfg)
blogAdaptor = webApi
break
}
default: {
break
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
* or visit www.terwer.space if you need additional information or have any
* questions.
*/
import { WebApi, WebConfig } from "zhi-blog-api"
import { ElectronCookie, WebApi, WebConfig } from "zhi-blog-api"
import { SiyuanKernelApi } from "zhi-siyuan-api"
import { CommonFetchClient } from "zhi-fetch-middleware"
import { AppInstance } from "~/src/appInstance.ts"
Expand Down Expand Up @@ -70,6 +70,10 @@ export class WebAuthApi extends WebApi {
this.cfg = cfg
}

public async buildCookie(cookies: ElectronCookie[]): Promise<string> {
return cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join(";")
}

// ================
// private methods
// ================
Expand Down
55 changes: 55 additions & 0 deletions src/adaptors/web/csdn/adaptor/csdnWebAdaptor.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright (c) 2023, Terwer . All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Terwer designates this
* particular file as subject to the "Classpath" exception as provided
* by Terwer in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Terwer, Shenzhen, Guangdong, China, youweics@163.com
* or visit www.terwer.space if you need additional information or have any
* questions.
*/

import { WebAuthApi } from "~/src/adaptors/web/base/web/WebAuthApi.ts"

/**
* 知乎网页授权适配器
*
* @see [wechatsync csdn adaptor](https://github.com/wechatsync/Wechatsync/blob/master/packages/@wechatsync/drivers/src/CSDN.js)
* @author terwer
* @version 0.9.0
* @since 0.9.0
*/
class CsdnWebAdaptor extends WebAuthApi {
public async getMetaData(): Promise<any> {
const res = await this.proxyFetch("https://bizapi.csdn.net/blog-console-api/v1/user/info")
const flag = !!res.data.csdnid
this.logger.info(`get csdn metadata finished, flag => ${flag}`)
return {
flag: flag,
uid: res.data.csdnid,
title: res.data.username,
avatar: res.data.avatarurl,
type: "csdn",
displayName: "CSDN",
supportTypes: ["markdown", "html"],
home: "https://mp.csdn.net/",
icon: "https://g.csdnimg.cn/static/logo/favicon32.ico",
}
}
}

export { CsdnWebAdaptor }
31 changes: 31 additions & 0 deletions src/adaptors/web/csdn/config/csdnConfig.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright (c) 2023, Terwer . All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Terwer designates this
* particular file as subject to the "Classpath" exception as provided
* by Terwer in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Terwer, Shenzhen, Guangdong, China, youweics@163.com
* or visit www.terwer.space if you need additional information or have any
* questions.
*/

import { CommonWebConfig } from "~/src/adaptors/web/base/web/config/CommonWebConfig.ts"

/**
* CSDN配置
*/
export class CsdnConfig extends CommonWebConfig {}
1 change: 1 addition & 0 deletions src/adaptors/web/csdn/docs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# CsdnWebAdaptor
85 changes: 85 additions & 0 deletions src/adaptors/web/csdn/useCsdnWeb.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* Copyright (c) 2023, Terwer . All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Terwer designates this
* particular file as subject to the "Classpath" exception as provided
* by Terwer in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Terwer, Shenzhen, Guangdong, China, youweics@163.com
* or visit www.terwer.space if you need additional information or have any
* questions.
*/

import { CsdnConfig } from "~/src/adaptors/web/csdn/config/csdnConfig.ts"
import { createAppLogger } from "~/src/utils/appLogger.ts"
import { AppInstance } from "~/src/appInstance.ts"
import { useSettingStore } from "~/src/stores/useSettingStore.ts"
import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common"
import { Utils } from "~/src/utils/utils.ts"
import { getDynPostidKey } from "~/src/components/set/publish/platform/dynamicConfig.ts"
import { CsdnWebAdaptor } from "~/src/adaptors/web/csdn/adaptor/csdnWebAdaptor.ts"

/**
* 用于获取CsdnWeb的API的自定义Hook
*/
const useCsdnWeb = async (key?: string, newCfg?: CsdnConfig) => {
// 创建应用日志记录器
const logger = createAppLogger("use-csdn-web")

// 记录开始使用Csdn WebAuth
logger.info("Start using Csdn WebAuth...")

// 创建应用实例
const appInstance = new AppInstance()
let cfg: CsdnConfig
if (newCfg) {
logger.info("Initialize with the latest newCfg passed in...")
cfg = newCfg
} else {
// 从配置中获取数据
const { getSetting } = useSettingStore()
const setting = await getSetting()
cfg = JsonUtil.safeParse<CsdnConfig>(setting[key], {} as CsdnConfig)
// 如果配置为空,则使用默认的环境变量值,并记录日志
if (ObjectUtil.isEmptyObject(cfg)) {
// 从环境变量获取Csdn的cookie
const csdnCookie = Utils.emptyOrDefault(process.env.VITE_CSDN_AUTH_TOKEN, "")
cfg = new CsdnConfig(csdnCookie)
logger.debug("Configuration is empty, using default environment variables.")
} else {
logger.info("Using configuration from settings...")
}
const middlewareUrl = Utils.emptyOrDefault(
process.env.VITE_MIDDLEWARE_URL,
"https://api.terwer.space/api/middleware"
)
if (StrUtil.isEmptyString(cfg.middlewareUrl)) {
cfg.middlewareUrl = middlewareUrl
}
// 初始化posidKey
if (StrUtil.isEmptyString(cfg.posidKey)) {
// 默认值
cfg.posidKey = getDynPostidKey(key)
}
}

const webApi = new CsdnWebAdaptor(appInstance, cfg)
return {
webApi,
}
}

export { useCsdnWeb }
8 changes: 2 additions & 6 deletions src/adaptors/web/zhihu/adaptor/zhihuWebAdaptor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@
* questions.
*/

import { ElectronCookie } from "zhi-blog-api"
import { WebAuthApi } from "~/src/adaptors/web/zhihu/base/WebAuthApi.ts"
import { WebAuthApi } from "~/src/adaptors/web/base/web/WebAuthApi.ts"

/**
* 知乎网页授权适配器
*
* @see [wechatsync zhihu adaptor](https://github.com/wechatsync/Wechatsync/blob/master/packages/%40wechatsync/drivers/src/zhihu.js)
* @author terwer
* @version 0.9.0
* @since 0.9.0
Expand All @@ -47,10 +47,6 @@ class ZhihuWebAdaptor extends WebAuthApi {
// this.logger = createAppLogger("zhihu-web-adaptor")
// }

public async buildCookie(cookies: ElectronCookie[]): Promise<string> {
return cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join(";")
}

public async getMetaData(): Promise<any> {
const res = await this.proxyFetch(
"https://www.zhihu.com/api/v4/me?include=account_status%2Cis_bind_phone%2Cis_force_renamed%2Cemail%2Crenamed_fullname"
Expand Down
2 changes: 1 addition & 1 deletion src/components/set/publish/platform/dynamicConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ export enum SubPlatformType {

// Custom
Custom_Zhihu = "Zhihu",
Custom_CSDN = "CSDN",
Custom_CSDN = "Csdn",

NONE = "none",
}
Expand Down
12 changes: 12 additions & 0 deletions src/utils/import/pre.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,5 +99,17 @@ export const pre = {
domain: "zhihu.com",
isEnabled: false,
},
// CSDN 目前有CA验证
// {
// platformType: PlatformType.Custom,
// subPlatformType: SubPlatformType.Custom_CSDN,
// platformKey: "custom_Csdn",
// platformName: "CSDN",
// platformIcon: svgIcons.iconIFCSDN,
// authMode: AuthMode.WEBSITE,
// authUrl: "https://passport.csdn.net/login",
// domain: "csdn.net",
// isEnabled: false,
// },
],
}
1 change: 1 addition & 0 deletions src/utils/svgIcons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export const svgIcons = {
iconIFVue: `<svg t="1684170497745" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10726" width="16" height="16"><path d="M512 504L764.8 68.8h-134.4L512 275.2 393.6 70.4h-134.4L512 504zM819.2 70.4L512 600 204.8 68.8H0l512 886.4L1024 70.4H819.2z" p-id="10727"></path></svg>`,
iconIFNuxt: `<svg t="1689995630285" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2710" width="16" height="16"><path d="M841.557333 864.938667l0.981334-1.92a31.573333 31.573333 0 0 0 2.261333-4.992l0.085333-0.213334a49.493333 49.493333 0 0 0 2.304-25.898666l0.042667 0.298666a76.586667 76.586667 0 0 0-10.026667-26.581333l0.213334 0.341333-226.858667-399.061333-34.645333-60.586667-34.432 60.586667-226.730667 399.061333a78.933333 78.933333 0 0 0-8.704 25.770667l-0.042667 0.469333a53.632 53.632 0 0 0 3.413334 30.421334l-0.128-0.341334a34.517333 34.517333 0 0 0 2.133333 4.352l-0.085333-0.170666c6.826667 11.733333 21.333333 25.685333 53.333333 25.685333h422.314667c6.698667 0 39.466667-1.365333 54.613333-27.178667z m-265.685333-397.482667l207.317333 364.714667H368.64z m437.290667 338.517333L713.813333 278.613333c-3.072-5.546667-20.352-33.578667-50.432-33.578666-13.525333 0-32.938667 5.76-48.725333 33.493333l-38.698667 67.84 34.432 60.586667 53.333334-94.378667 296.149333 519.68h-112.64a50.645333 50.645333 0 0 1-2.474667 25.941333l0.128-0.341333a32.938667 32.938667 0 0 1-2.432 5.376l0.085334-0.170667-0.981334 1.92c-15.146667 25.813333-47.872 27.178667-54.272 27.178667h176.170667c6.485333 0 39.125333-1.365333 54.272-27.178667 6.698667-11.733333 11.52-31.445333-4.565333-58.965333zM311.637333 866.432a42.197333 42.197333 0 0 1-1.92-3.925333l-0.085333-0.256a52.394667 52.394667 0 0 1-3.584-30.378667l-0.042667 0.298667H64.042667L423.68 199.338667l118.058667 207.530666 34.218666-60.586666-102.912-181.290667c-2.858667-5.205333-20.266667-33.152-50.218666-33.152-13.525333 0-32.938667 5.845333-48.725334 33.578667L9.813333 805.930667c-3.072 5.546667-18.133333 34.645333-3.2 60.458666 6.826667 11.733333 21.333333 25.685333 53.333334 25.685334h305.109333c-31.786667 0-46.506667-13.738667-53.333333-25.685334z" p-id="2711"></path></svg>`,
iconIFZhihu: `<svg t="1689993036802" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2449" width="16" height="16"><path d="M564.7 230.1V803h60l25.2 71.4L756.3 803h131.5V230.1H564.7z m247.7 497h-59.9l-75.1 50.4-17.8-50.4h-18V308.3h170.7v418.8zM526.1 486.9H393.3c2.1-44.9 4.3-104.3 6.6-172.9h130.9l-0.1-8.1c0-0.6-0.2-14.7-2.3-29.1-2.1-15-6.6-34.9-21-34.9H287.8c4.4-20.6 15.7-69.7 29.4-93.8l6.4-11.2-12.9-0.7c-0.8 0-19.6-0.9-41.4 10.6-35.7 19-51.7 56.4-58.7 84.4-18.4 73.1-44.6 123.9-55.7 145.6-3.3 6.4-5.3 10.2-6.2 12.8-1.8 4.9-0.8 9.8 2.8 13 10.5 9.5 38.2-2.9 38.5-3 0.6-0.3 1.3-0.6 2.2-1 13.9-6.3 55.1-25 69.8-84.5h56.7c0.7 32.2 3.1 138.4 2.9 172.9h-141l-2.1 1.5c-23.1 16.9-30.5 63.2-30.8 65.2l-1.4 9.2h167c-12.3 78.3-26.5 113.4-34 127.4-3.7 7-7.3 14-10.7 20.8-21.3 42.2-43.4 85.8-126.3 153.6-3.6 2.8-7 8-4.8 13.7 2.4 6.3 9.3 9.1 24.6 9.1 5.4 0 11.8-0.3 19.4-1 49.9-4.4 100.8-18 135.1-87.6 17-35.1 31.7-71.7 43.9-108.9L497 850l5-12c0.8-1.9 19-46.3 5.1-95.9l-0.5-1.8-108.1-123-22 16.6c6.4-26.1 10.6-49.9 12.5-71.1h158.7v-8c0-40.1-18.5-63.9-19.2-64.9l-2.4-3z" p-id="2450"></path></svg>`,
iconIFCSDN: `<svg t="1690721786570" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3120" width="16" height="16"><path d="M512 0c282.784 0 512 229.216 512 512s-229.216 512-512 512S0 794.784 0 512 229.216 0 512 0z m189.952 752l11.2-108.224c-31.904 9.536-100.928 16.128-147.712 16.128-134.464 0-205.728-47.296-195.328-146.304 11.584-110.688 113.152-145.696 232.64-145.696 54.784 0 122.432 8.8 151.296 18.336L768 272.704C724.544 262.24 678.272 256 599.584 256c-203.2 0-388.704 94.88-406.4 263.488C178.336 660.96 303.584 768 535.616 768c80.672 0 138.464-6.432 166.336-16z" p-id="3121"></path></svg>`,
iconIFYuque: `<svg t="1684169305378" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5780" width="16" height="16"><path d="M903.542857 350.4c-11.314286-45.028571 11.314286-116.8 83.885714-142.171429l-77.6-4.114285s-29.371429-102.857143-164.114285-112c-134.628571-9.257143-222.742857-3.428571-222.857143-3.428572 0.114286 0 99.885714 63.542857 59.885714 176.8-29.257143 60-75.2 109.257143-124.342857 165.371429-1.485714 1.485714-2.857143 2.971429-4 4.228571C291.885714 618.285714 36.571429 909.714286 36.571429 909.714286c281.028571 73.6 469.371429-7.2 580.8-104.114286 23.428571-0.228571 41.028571-0.342857 52.914285-0.342857 155.2 0 286.4-134.4 281.028572-283.885714-3.657143-102.742857-36.457143-125.942857-47.771429-170.971429z m-233.257143 381.714286c-12.114286 0-29.942857 0.114286-53.485714 0.342857l-26.971429 0.228571-20.342857 17.714286c-53.828571 46.857143-119.314286 81.714286-195.885714 100.114286-60 14.4-125.714286 18.514286-197.371429 10.971428 20.571429-23.428571 41.714286-47.542857 63.314286-72.114285 105.142857-119.542857 198.628571-225.714286 270.742857-306.857143l1.6-1.6 1.485715-1.714286c4.685714-5.257143 23.542857-26.628571 28.228571-32.114286 11.085714-12.685714 19.771429-22.742857 28-32.685714 35.085714-41.942857 59.657143-77.485714 78.857143-116.8l1.828571-3.771429 1.371429-3.885714c15.657143-44.342857 17.6-87.885714 7.085714-128.914286 25.714286 0.8 53.142857 2.171429 81.942857 4.114286 38.057143 2.628571 63.428571 14.742857 81.257143 33.371429 6.628571 6.857143 11.657143 14.285714 15.314286 21.371428 1.142857 2.285714 1.942857 4.114286 2.628571 5.714286l5.714286 20.228571c-17.942857 39.428571-22.742857 83.771429-13.028571 122.514286 3.428571 13.485714 7.885714 25.6 14.057142 39.314286 2.4 5.371429 10.857143 22.971429 12.571429 26.628571 11.771429 25.942857 17.6 49.142857 19.085714 89.942857 3.771429 108.114286-94.514286 207.885714-208 207.885715z" p-id="5781"></path></svg>`,
iconIFCnblogs: `<svg t="1684168925817" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4454" width="16" height="16"><path d="M851.404 172.596c-187.462-187.461-491.346-187.461-678.808 0-187.461 187.462-187.461 491.346 0 678.808 187.462 187.461 491.346 187.461 678.808 0 187.461-187.462 187.461-491.346 0-678.808zM387.33 728.087a47.084 47.084 0 1 1-66.633-66.502 47.084 47.084 0 0 1 66.633 66.502z m205.527 1.397a38.75 38.75 0 0 1-76.625-11.52h-0.044a6.545 6.545 0 0 0-0.044 0.305v-0.349c0.306-2.618 2.051-20.727-2.967-44.99a174.24 174.24 0 0 0-48.567-89.28 172.102 172.102 0 0 0-88.8-48.305 156.698 156.698 0 0 0-42.458-2.923 38.662 38.662 0 0 1-35.39-65.324 38.618 38.618 0 0 1 21.12-10.822v-0.218c4.452-0.742 111.142-16.45 200.335 72.742 89.018 89.018 74.182 196.145 73.44 200.727z m175.2 7.592a38.75 38.75 0 0 1-65.673 21.382 39.49 39.49 0 0 1-11.65-33.73c0.087-0.35 5.105-37.484-5.062-88.975-13.31-67.375-45.295-126.895-94.953-176.902-50.007-49.702-109.527-81.644-176.945-94.953-51.491-10.167-88.582-5.193-89.019-5.149h0.219-0.044a39.927 39.927 0 0 1-44.684-32.902 38.836 38.836 0 0 1 32.204-44.378c1.92-0.305 47.869-7.33 111.273 4.364a411.753 411.753 0 0 1 106.254 34.952 425.76 425.76 0 0 1 114.633 82.255l0.916 0.96 0.96 0.873a425.89 425.89 0 0 1 82.255 114.72c16.407 33.6 28.145 69.294 34.996 106.21 11.651 63.404 4.67 109.353 4.32 111.273z" p-id="4455"></path></svg>`,
iconIFTypecho: `<svg t="1684170671485" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12354" width="16" height="16"><path d="M942.933333 132.266667l-168.533333-10.666667v64l164.266667 10.666667c8.533333 0 12.8 4.266667 14.933333 6.4 2.133333 2.133333 6.4 8.533333 4.266667 14.933333l-46.933334 718.933333c0 10.666667-10.666667 19.2-21.333333 19.2h-2.133333l-115.2-8.533333c-4.266667 21.333333-23.466667 36.266667-46.933334 36.266667H362.666667l522.666666 34.133333h6.4c44.8 0 81.066667-34.133333 85.333334-78.933333L1024 219.733333c2.133333-44.8-34.133333-85.333333-81.066667-87.466666z" p-id="12355"></path><path d="M727.466667 74.666667c6.4 0 10.666667 4.266667 10.666666 10.666666v853.333334c0 6.4-4.266667 10.666667-10.666666 10.666666h-640c-6.4 0-10.666667-4.266667-10.666667-10.666666V85.333333c0-6.4 4.266667-10.666667 10.666667-10.666666h640m0-74.666667h-640c-46.933333 0-85.333333 38.4-85.333334 85.333333v853.333334c0 46.933333 38.4 85.333333 85.333334 85.333333h640c46.933333 0 85.333333-38.4 85.333333-85.333333V85.333333c0-46.933333-38.4-85.333333-85.333333-85.333333z" p-id="12356"></path><path d="M522.666667 518.4H177.066667c-21.333333 0-36.266667-17.066667-36.266667-36.266667 0-21.333333 17.066667-36.266667 36.266667-36.266666h345.6c21.333333 0 36.266667 17.066667 36.266666 36.266666 0 19.2-17.066667 36.266667-36.266666 36.266667z" p-id="12357"></path><path d="M424.533333 686.933333H177.066667c-21.333333 0-38.4 17.066667-38.4 38.4s17.066667 38.4 38.4 38.4h247.466666c21.333333 0 38.4-17.066667 38.4-38.4s-17.066667-38.4-38.4-38.4z" p-id="12358"></path></svg>`,
Expand Down

0 comments on commit 4bbc435

Please sign in to comment.