1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00
This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-09-12 08:07:14 +08:00
parent 7fdd6bd314
commit 780ff3decc
13 changed files with 32 additions and 134 deletions

View File

@ -162,6 +162,7 @@ var cli = {
MAKE: "make", EXEC: "exec", DONE: "done", COST: "cost", FROM: "from", CLEAR: "clear",
LINUX: "linux", DARWIN: "darwin", WINDOWS: "windows",
RUN: "run",
RUNTIME: "runtime",
PWD: "pwd",
}
var log = {

View File

@ -40,7 +40,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
if (can.base.isUndefined(msg[ice.MSG_DAEMON])) { can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(sub)-1)
if (sub._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], sub._daemon)) }
} if (!can.misc.CookieSessid(can) && can.user.info.sessid) { msg.Option(ice.MSG_SESSID, can.user.info.sessid) }
msg.OptionDefault(ice.MSG_THEME, can.getHeader(chat.THEME))
msg.OptionDefault(ice.MSG_LANGUAGE, can.user.info.language), msg.OptionDefault(ice.MSG_THEME, can.getHeader(chat.THEME))
can.base.isIn(sub.ConfIndex(), "qrcode", "cli.qrcode") && can.page.exportValue(sub, msg)
can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds}))
var names = msg.Option(chat._NAMES)||panel._names||((can.Conf("iceberg")||Volcanos.meta.iceberg)+"/chat/"+panel._name+"/")
@ -79,7 +79,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
},
})
Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) { return }
can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, cli.DAEMON)||name||""}, function(event, msg, cmd, arg, cb) {
return can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, cli.DAEMON)||name||""}, function(event, msg, cmd, arg, cb) {
var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)]||can; can.base.isFunc(sub.ondaemon[cmd])?
can.core.CallFunc(sub.ondaemon[cmd], {can: can, msg: msg, sub: sub, cmd: cmd, arg: arg, cb: cb}):
can.onengine._search({}, can, msg, can, [chat._SEARCH, cmd].concat(arg), cb)
@ -306,7 +306,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
can.run(can.request(event, value), [ctx.ACTION, item.name])
}}
}))
can.page.Append(can, target, [{type: html.INPUT, data: {type: html.BUTTON}, name: "more", value: can.user.trans(can, "more"), onclick: function(event) {
can.page.Append(can, target, [{type: html.INPUT, data: {type: html.BUTTON}, name: "more", value: can.user.trans(can, "more"), className: can.page.buttonStyle(can, "more"), onclick: function(event) {
can.user.carte(event, can, {}, can.core.List(list.slice(limit-1), function(item) { return item.name }), function(event, button) {
can.run(can.request(event, value), [ctx.ACTION, button])
})

View File

@ -24,6 +24,7 @@ body {
--plugin-bg-color:var(--legend-bg-color);
--plugin-fg-color:var(--body-fg-color);
--th-bg-color:var(--plugin-bg-color);
--th-fg-color:var(--plugin-fg-color);
--td-hover-bg-color:var(--hover-bg-color);
--tr-hover-bg-color:var(--hover-bg-color);
--float-bg-color:var(--plugin-bg-color);
@ -50,7 +51,7 @@ input[name=limit] { width:60px; }
input[name=offend] { width:80px; }
input[name=id] { width:60px; }
input[name=url] { width:320px; }
input[name=cmd] { background-color:var(--code-bg-color); color:var(--code-fg-color); width:100%; }
input[type=text][name=cmd] { background-color:var(--code-bg-color); color:var(--code-fg-color); width:100%; }
table.content.full { width:100%; }
table.content thead { position:sticky; top:2px; }
table.content tr.offline { color:var(--disable-fg-color); }

View File

@ -353,8 +353,8 @@ Volcanos("page", {
return action
},
buttonStyle: function(can, name) {
return can.base.isIn(name, mdb.CREATE, mdb.INSERT, cli.RESTART, cli.START, cli.BUILD, cli.RUN, web.OPEN)? "notice":
can.base.isIn(name, mdb.REMOVE, mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, "drop", cli.STOP)? "danger": ""
return can.base.isIn(name, mdb.CREATE, mdb.INSERT, cli.RESTART, cli.START, cli.BUILD, cli.RUN, web.OPEN, "startall", "clone")? "notice":
can.base.isIn(name, mdb.REMOVE, mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, "drop", cli.STOP, "stopall")? "danger": ""
},
exportValue: function(can, msg) {
const styles = getComputedStyle(document.body); can.core.List(["--plugin-bg-color", "--plugin-fg-color"].concat(can.core.List(arguments).slice(2)), function(key) { msg.Option(key, styles.getPropertyValue(key)) })

View File

@ -242,13 +242,13 @@ Volcanos("user", {
{type: html.TD, list: [{type: html.INPUT, name: name, data: {type: type||html.TEXT}}]},
]} }
var _sso = can.core.Item(sso, function(key, value) {
return {view: "sso", list: [{img: can.misc.Resource(can, value.icon)}, {text: key}], onclick: function() { can.user.jumps(value.url) }}
return value.url && {view: "sso", list: [{img: can.misc.Resource(can, value.icon)}, {text: key}], onclick: function() { can.user.jumps(value.url) }}
})
can.misc.CookieSessid(can, "")
var ui = can.onappend.tabview(can, {
"扫码授权": function(target) { var socket = can.misc.WSS(can, {type: aaa.LOGIN}, function(cmd, arg) {
if (cmd == cli.PWD) { var _cmd = " space login "+arg[0]; return can.page.Modify(can, target, arg[2]), can.page.Append(can, target, [
{text: "<br/>或命令授权: "+_cmd, title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }},
{text: "<br/>或命令授权: "}, {text: [_cmd, "", html.ITEM], title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }},
].concat(_sso)), can.onmotion.delay(can, function() { layout() }, 10) }
if (cmd == ice.MSG_SESSID) { can.onmotion.delay(can, function() { socket.close() })
if (!can.misc.CookieSessid(can, arg[0])) { can.user.info.sessid = arg[0] }

View File

@ -1,6 +1,6 @@
(function() { var NTIP = "ntip", NLOG = "nlog", NCMD = "ncmd", NKEY = "nkey"
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, can.core.Item(can.misc.localStorage(can)).length)
can.ondaemon._init(can); if (can.user.mod.isCmd) { return } can.Conf("version", can.base.trimPrefix(window._version, "?_v="))
can._wss = can.ondaemon._init(can); if (can.user.mod.isCmd) { return } can.Conf("version", can.base.trimPrefix(window._version, "?_v="))
can.onimport._title(can, msg, target), can.onimport._command(can, msg, target)
can.onimport._state(can, msg, target), can.onimport._toast(can, msg, target)
},
@ -35,6 +35,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
ontoast: function(can, msg) { can.core.CallFunc(can.onimport.ntip, {can: can, msg: msg}) },
onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) },
onlayout: function(can, layout) { can.onmotion.toggle(can, can._target, !layout || layout == html.TABS) },
onunload: function(can) { can._wss.close() },
onaction_cmd: function(can) { can.onappend.style(can, html.HIDE) },
oncommand_focus: function(can) { can.page.Select(can, can._output, ["div.cmd", html.INPUT], function(target) { can.onmotion.focus(can, target) }) },
ondebugs: function(can, msg) { can.runAction(msg, msg.Option(ctx.ACTION), [msg.Option(ctx.INDEX)], function(_msg) {

View File

@ -1,24 +0,0 @@
fieldset.web.chat.caculator>div.output>div.display {
text-align:right;
height:80px;
width:100%;
font-size:50px;
}
fieldset.web.chat.caculator>div.output>table {
width:100%;
}
fieldset.web.chat.caculator>div.output>table td {
text-align:center;
height:80px;
width:80px;
}
fieldset.web.chat.caculator>div.output>table tr:first-child td {
background-color:#46504d; color:white;
}
fieldset.web.chat.caculator>div.output>table td:last-child {
background-color:#fb9f0d !important; color:white;
}
fieldset.web.chat.caculator>div.output>table td:hover {
background-color:var(--hover-bg-color) !important;
cursor:pointer;
}

View File

@ -1,57 +0,0 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
var list = [
["AC", "+/-", "%", "/"],
["7", "8", "9", "*"],
["4", "5", "6", "-"],
["1", "2", "3", "+"],
["0", "00", ".", "="],
]
can.ui.display = can.page.Append(can, can._output, [{view: "display", inner: "0"}])._target
var table = can.page.Append(can, can._output, [{type: html.TABLE}])._target
can.page.Append(can, table, can.core.List(list, function(list) {
return {type: html.TR, list: can.core.List(list, function(item) {
return {type: html.TD, inner: item, onclick: function(event) {
var cb = can.ondetail[item]; cb? cb(event, can, item): (
can.ui.display.innerHTML = can.base.trimPrefix(can.ui.display.innerHTML + item, "0")
)
}}
}) }
}))
},
_show: function(can) {
},
}, [""])
Volcanos(chat.ONACTION, {
onkeydown: function(event, can) {
switch (event.key) {
case "=":
can.ondetail[event.key](evnt, can, event.key)
case "Shift":
case "Backspace":
break
default:
can.ui.display.innerHTML += event.key
}
},
})
Volcanos(chat.ONDETAIL, {
"AC": function(event, can, button) {
can.ui.display.innerHTML = "0"
},
"=": function(event, can, button) {
var list = []
can.core.List(can.core.Split(can.ui.display.innerHTML, "", "+-*/%"), function(item) {
switch (item) {
case "+":
case "-":
case "*":
case "/":
case "%":
default: list.push(item)
}
})
},
"+/-": function(event, can, button) {
},
})

View File

@ -1,4 +0,0 @@
fieldset.web.chat.clock>div.output>svg g.number text { font-family:sans-serif; font-size:48px; }
fieldset.web.chat.clock>div.output>svg g.hour line { stroke-width:8px; }
fieldset.web.chat.clock>div.output>svg g.minute line { stroke-width:4px; }
fieldset.web.chat.clock>div.output>svg g.second line { stroke-width:2px; stroke:red; }

View File

@ -1,21 +0,0 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.page.requireDraw(can, function() {
can.onmotion.hidden(can, can._status), can.base.isFunc(cb) && cb(msg)
can.onmotion.hidden(can, can._action), can.onimport._show(can)
}) },
_show: function(can) { can.svg.Value("dominant-baseline", "middle")
can.onmotion.clear(can, can.svg), can.svg.Val(html.HEIGHT, can.ConfHeight()), can.svg.Val(html.WIDTH, can.ConfWidth())
var x = can.ConfWidth()/2, y = can.ConfHeight()/2, r = can.base.Max(can.ConfHeight(), can.ConfWidth())/2-80, c = {x: x, y: y}
function pos(r, angle) { angle -= 90; return {x: x + r * Math.cos(angle * Math.PI / 180), y: y + r * Math.sin(angle * Math.PI / 180)} }
function line(g, c, p) { return can.onimport.draw(can, {shape: svg.LINE, points: [c, p]}, g) }
function group(name) { return can.onimport.group(can, name) }
var number = group("number"), second = group("second"), minute = group("minute"), hour = group("hour")
for (var i = 1; i <= 12; i++) { var p = pos(r, 360/12*i); can.onimport.draw(can, {shape: svg.TEXT, points: [p], style: {inner: i+""}}, number) }
can.core.Timer({internal: 100}, function(){ var t = new Date()
can.onmotion.clear(can, second), can.onmotion.clear(can, minute), can.onmotion.clear(can, hour)
line(hour, c, pos(r*0.6, t.getHours()%12*360/12+t.getMinutes()*30/60))
line(minute, c, pos(r*0.8, t.getMinutes()*360/60))
line(second, c, pos(r, t.getSeconds()*360/60))
})
},
}, [""])

View File

@ -7,7 +7,7 @@ const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "selectLine"
const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select"
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0])
can.Mode(msg.Option("mode")||can.Mode()), can.Option(nfs.FILE) == " " && can.Option(nfs.FILE, "")
if (can.Mode() == ice.MSG_RESULT) { msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE) }
if (can.Mode() == ice.MSG_RESULT) { msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE), can.sup.Mode(chat.SIMPLE) }
can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.endWith(p, "-dict/")) { return }
if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) }
}), can.onmotion.clear(can), can.onappend.style(can, code.INNER), can.sup.onimport._process = function(_can, msg) {
@ -21,23 +21,21 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display, can.onmotion.hidden(can, can.ui.plug)
can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display)
if (can.Conf(ctx.STYLE) == html.OUTPUT) { can.onmotion.hidden(can, can.ui.project), can.page.style(can, can.ui.content, html.HEIGHT, "") }
var args = can.misc.SearchHash(can), tabs = can.onexport.session(can, RECOVER_TABS), tool = can.onexport.session(can, RECOVER_TOOL)
switch (can.Mode()) {
case chat.SIMPLE: // no break
case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break
case chat.CMD:
can.onappend.style(can, html.OUTPUT)
case chat.CMD: can.onappend.style(can, html.OUTPUT)
can.onexport.session(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project)
if (can.onexport.session(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) }
can.onengine.listen(can, chat.ONUNLOAD, function() { can.onexport.recover(can) })
msg.Option(ice.MSG_TOOLKIT, "[]")
tool = tool||can.base.Obj(msg.Option(ice.MSG_TOOLKIT)), msg.Option(ice.MSG_TOOLKIT, "[]")
case chat.FULL: // no break
default: can.user.isMobile && can.onmotion.hidden(can, can.ui.project), can.onimport.project(can, paths), can.onimport._tabs(can)
} var args = can.misc.SearchHash(can), tabs = can.onexport.session(can, RECOVER_TABS), tool = can.onexport.session(can, RECOVER_TOOL)
}
can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (!can.isCmdMode()) { return }
if (tabs) {
can.core.Next(tabs, function(item, next) { can.onimport.tabview(can, item[0], item[1], item[2], function() {
can.onmotion.delay(can, next)
}) }, function() {
can.core.Next(tabs, function(item, next) { can.onimport.tabview(can, item[0], item[1], item[2], function() { can.onmotion.delay(can, next) }) }, function() {
args.length > 0 && can.onimport.tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1])
})
} else {
@ -247,7 +245,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
return can.onmotion.toggle(can, target, false), can.onimport.layout(can), can.user.toastFailure(can, "nothing to display")
} return can.onmotion.toggle(can, target, true), can.onmotion.delay(can, function() { can.onimport.layout(can), can.user.toastSuccess(can) })
},
toolkit: function(can, meta, cb) { var key = [meta.index].concat(meta.args).join(","), sub = can.db.toolkit[key]; if (sub) { sub.select(); return }
toolkit: function(can, meta, cb) { can.base.isString(meta) && (meta = {index: meta})
var key = [meta.index].concat(meta.args).join(","), sub = can.db.toolkit[key]; if (sub) { sub.select(); return }
can.onimport.tool(can, [meta], function(sub) { can.db.toolkit[key] = sub
sub.onaction._close = function() { delete(can.db.toolkit[key]), can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend) }
sub.onexport.record = function(sub, value, key, data) { if (!data.file) { return }
@ -256,7 +255,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
}, meta.index != ice.CAN_PLUGIN && (sub._legend._list = {index: meta.index, args: meta.args}), can.user.isWebview && can.onexport.recover(can), cb && cb(sub)
}, can.ui.plug.parentNode, can.ui.plug), can.page.isDisplay(can.ui.plug) || can.onmotion.toggle(can, can.ui.plug, true) && can.onimport.layout(can)
},
layout: function(can) { if (can.isSimpleMode() || can.Conf(ctx.STYLE) == html.OUTPUT) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) } if (can.isCmdMode()) { can.ConfHeight(can.page.height()) }
layout: function(can) {
if (can.isSimpleMode()) { can.page.style(can, can._output, html.MAX_HEIGHT, "") }
if (can.isSimpleMode() || can.Conf(ctx.STYLE) == html.OUTPUT) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) } if (can.isCmdMode()) { can.ConfHeight(can.page.height()) }
var content = can.ui.content; if (content._root) { can.ui.content = content._root } can.ui.size = {profile: can._msg.Option(html.WIDTH), display: can._msg.Option(html.HEIGHT)}
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) { can.ui.content = content, can.onlayout.layout(can, height, width)
var sub = can.ui.profile._plugin; sub && can.page.isDisplay(can.ui.profile) && sub.onimport && sub.onimport.size(sub, can.ui.profile.offsetHeight, can.ui.profile.offsetWidth-1, true)

View File

@ -12,7 +12,7 @@ fieldset.word>div.output iframe { height:480px; width:100%; }
fieldset.word>div.output svg.story[data-index] text { cursor:pointer; }
fieldset.word>div.output input.story[type=button] { font-family:system-ui; font-weight:bold; padding:20px 40px; margin:10px; height:64px; box-shadow:var(--box-shadow); }
fieldset.word>div.output fieldset.web.code.inner.output div.output td.line { border-right:var(--box-border); }
fieldset.word>div.output fieldset.story:not(.full) { margin:20px 0; }
fieldset.word>div.output>fieldset.story:not(.full) { margin:20px 0; }
fieldset.word>div.output ul { margin:20px 40px; }
fieldset.word>div.output fieldset.story:not(.float):not(.full)>form.option>div.icon.delete { display:none; }

View File

@ -180,27 +180,27 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
}))._target },
tool: function(can, list, cb, target, status) { target = target||can._output, status = status||can._status
can.core.List(list.reverse(), function(meta) { can.base.isString(meta) && (meta = {index: meta}), meta.mode = html.FLOAT
can.onimport.plug(can, meta, function(sub) { can.onmotion.hidden(can, sub._target), sub._legend._target = sub._target, sub._legend._meta = {index: meta.index}
can.onimport.plug(can, meta, function(sub) {
sub.onexport.output = function() { var width = can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0)
can.page.style(can, can._output, html.MAX_HEIGHT, "", html.HEIGHT, "", html.WIDTH, "", html.MAX_WIDTH, "")
sub.onimport.size(sub, can.ConfHeight()/2, can.base.Min(sub._target.offsetWidth, width/2, width/(can.base.isIn(sub.ConfIndex(), code.COMPILE, cli.RUNTIME)? 1: 2)), true)
}
can.onmotion.hidden(can, sub._target), sub._legend._target = sub._target, sub._legend._meta = {index: meta.index}
can.page.Append(can, sub._legend,[{text: [can.page.unicode.remove, "", mdb.REMOVE], onclick: function(event) {
can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend), can.onexport.tool(can), can.onkeymap.prevent(event)
}}])
status.appendChild(sub._legend), sub._legend.oncontextmenu = sub._legend.onclick, sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) {
if (can.page.SelectOne(can, status, nfs.PT+html.SELECT, function(target) { can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return }
// sub.onimport.size(sub, can.ConfHeight()/2, can.base.Min((can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0))/2, sub._target.offsetWidth))
can.onmotion.select(can, status, html.LEGEND, sub._legend), can.onmotion.toggle(can, sub._target, true)
can.onmotion.select(can, target, "fieldset.plug", sub._target)
if (sub._delay_init || meta.msg) { sub._delay_init = false, meta.msg = false, sub.Update() }
}) }, sub._delay_init = true, sub.onaction.close = function() { sub.select() }, sub.select = function(show) {
}) }, sub._delay_init = true, sub.select = function(show) {
if (show && can.page.ClassList.has(can, sub._legend, html.SELECT)) { return sub }
return sub._legend.click(), sub
}
sub.onexport.output = function() { var width = can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0)
can.page.style(can, can._output, html.MAX_HEIGHT, "", html.HEIGHT, "", html.WIDTH, "", html.MAX_WIDTH, "")
sub.onimport.size(sub, can.ConfHeight()/2, can.base.Min(sub._target.offsetWidth, width/2, width), true)
}
sub.hidden = function() { can.onmotion.hidden(can, sub._target), can.page.ClassList.del(can, sub._legend, html.SELECT) }
sub.onaction._close = function() { can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend), can.onexport.tool(can) }
can.base.isFunc(cb) && cb(sub), can.onexport.tool(can)
sub.onaction.close = function() { sub.select() }, can.base.isFunc(cb) && cb(sub), can.onexport.tool(can)
}, target)
})
},