mirror of
https://shylinux.com/x/icebergs
synced 2025-07-03 13:01:19 +08:00
add some
This commit is contained in:
parent
7c3af575c7
commit
1102c28672
@ -79,7 +79,7 @@ func UserInfo(m *ice.Message, name ice.Any, key, meta string) (value string) {
|
||||
func UserRole(m *ice.Message, username ice.Any) (role string) {
|
||||
if username == "" {
|
||||
return VOID
|
||||
} else if role = VOID; username == ice.Info.Username {
|
||||
} else if role = VOID; username == ice.Info.UserName {
|
||||
return ROOT
|
||||
} else {
|
||||
return UserInfo(m, username, USERROLE, ice.MSG_USERROLE)
|
||||
@ -99,13 +99,13 @@ func UserEmail(m *ice.Message, username ice.Any) (nick string) {
|
||||
}
|
||||
func UserRoot(m *ice.Message, arg ...string) *ice.Message {
|
||||
userrole := kit.Select(TECH, arg, 0)
|
||||
username := kit.Select(ice.Info.Username, arg, 1)
|
||||
username := kit.Select(ice.Info.UserName, arg, 1)
|
||||
usernick := kit.Select(UserNick(m, username), arg, 2)
|
||||
language := kit.Select(UserLang(m, username), arg, 3)
|
||||
userzone := kit.Select(ice.OPS, arg, 4)
|
||||
email := kit.Select(UserEmail(m, username), arg, 5)
|
||||
if len(arg) > 0 {
|
||||
kit.If(username != ROOT, func() { ice.Info.Username = username })
|
||||
kit.If(username != ROOT, func() { ice.Info.UserName = username })
|
||||
m.Cmd(USER, mdb.CREATE, userrole, username, usernick, language, userzone, email)
|
||||
}
|
||||
return SessAuth(m, kit.Dict(USERROLE, userrole, USERNAME, username, USERNICK, usernick))
|
||||
|
@ -37,15 +37,15 @@ func _runtime_init(m *ice.Message) {
|
||||
if name, e := os.Hostname(); e == nil && name != "" {
|
||||
m.Conf(RUNTIME, kit.Keys(BOOT, HOSTNAME), name)
|
||||
}
|
||||
ice.Info.Username = m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME))
|
||||
ice.Info.Hostname = m.Conf(RUNTIME, kit.Keys(BOOT, HOSTNAME))
|
||||
ice.Info.Pathname = m.Conf(RUNTIME, kit.Keys(BOOT, PATHNAME))
|
||||
kit.HashSeed = append(kit.HashSeed, ice.Info.Username)
|
||||
kit.HashSeed = append(kit.HashSeed, ice.Info.Hostname)
|
||||
kit.HashSeed = append(kit.HashSeed, ice.Info.Pathname)
|
||||
ice.Info.UserName = m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME))
|
||||
ice.Info.HostName = m.Conf(RUNTIME, kit.Keys(BOOT, HOSTNAME))
|
||||
ice.Info.PathName = m.Conf(RUNTIME, kit.Keys(BOOT, PATHNAME))
|
||||
kit.HashSeed = append(kit.HashSeed, ice.Info.UserName)
|
||||
kit.HashSeed = append(kit.HashSeed, ice.Info.HostName)
|
||||
kit.HashSeed = append(kit.HashSeed, ice.Info.PathName)
|
||||
aaa.UserRoot(ice.Pulse, aaa.TECH, ice.Info.Make.Author, "", "", ice.DEV, ice.Info.Make.Email)
|
||||
aaa.UserRoot(ice.Pulse, aaa.TECH, ice.Info.Make.Username, "", "", ice.DEV, ice.Info.Make.Email)
|
||||
aaa.UserRoot(ice.Pulse, aaa.ROOT, ice.Info.Username)
|
||||
aaa.UserRoot(ice.Pulse, aaa.ROOT, ice.Info.UserName)
|
||||
aaa.UserRoot(ice.Pulse, aaa.ROOT, aaa.ROOT)
|
||||
ice.Info.Time = m.Time()
|
||||
m.Conf(RUNTIME, kit.Keys(BOOT, mdb.TIME), ice.Info.Time)
|
||||
@ -193,9 +193,9 @@ func init() {
|
||||
HOSTINFO: {Hand: func(m *ice.Message, arg ...string) { _runtime_hostinfo(m) }},
|
||||
HOSTNAME: {Hand: func(m *ice.Message, arg ...string) {
|
||||
if len(arg) > 0 {
|
||||
ice.Info.Hostname = mdb.Conf(m, RUNTIME, kit.Keys(NODE, mdb.NAME), mdb.Conf(m, RUNTIME, kit.Keys(BOOT, HOSTNAME), arg[0]))
|
||||
ice.Info.HostName = mdb.Conf(m, RUNTIME, kit.Keys(NODE, mdb.NAME), mdb.Conf(m, RUNTIME, kit.Keys(BOOT, HOSTNAME), arg[0]))
|
||||
}
|
||||
m.Echo(ice.Info.Hostname)
|
||||
m.Echo(ice.Info.HostName)
|
||||
}},
|
||||
MAXPROCS: {Hand: func(m *ice.Message, arg ...string) {
|
||||
kit.If(len(arg) > 0, func() { runtime.GOMAXPROCS(kit.Int(mdb.Conf(m, RUNTIME, kit.Keys(HOST, MAXPROCS), arg[0]))) })
|
||||
|
@ -130,7 +130,7 @@ func _dream_start(m *ice.Message, name string) {
|
||||
defer m.Options(cli.CMD_DIR, "", cli.CMD_ENV, "", cli.CMD_OUTPUT, "")
|
||||
m.Options(cli.CMD_DIR, kit.Path(p), cli.CMD_ENV, kit.EnvList(kit.Simple(m.OptionSimple(ice.TCP_DOMAIN),
|
||||
cli.CTX_OPS, HostPort(m, tcp.LOCALHOST, m.Cmdv(SERVE, tcp.PORT)), cli.CTX_LOG, ice.VAR_LOG_BOOT_LOG,
|
||||
cli.CTX_ROOT, kit.Path(""), cli.PATH, cli.BinPath(p, ""), cli.USER, ice.Info.Username,
|
||||
cli.CTX_ROOT, kit.Path(""), cli.PATH, cli.BinPath(p, ""), cli.USER, ice.Info.UserName,
|
||||
)...), cli.CMD_OUTPUT, path.Join(p, ice.VAR_LOG_BOOT_LOG), mdb.CACHE_CLEAR_ONEXIT, ice.TRUE)
|
||||
kit.If(m.Option(nfs.BINARY) == "" && !cli.SystemFindGo(m), func(p string) { m.Option(nfs.BINARY, S(name)) })
|
||||
kit.If(m.Option(nfs.BINARY), func(p string) { _dream_binary(m, p) })
|
||||
@ -313,7 +313,7 @@ func init() {
|
||||
if m.Option(mdb.NAME) != "" {
|
||||
return
|
||||
}
|
||||
defer ToastProcess(m, PUBLISH, ice.Info.Pathname)()
|
||||
defer ToastProcess(m, PUBLISH, ice.Info.PathName)()
|
||||
m.Cmd(AUTOGEN, BINPACK)
|
||||
kit.For(list, func(goos string) {
|
||||
list := []string{cli.AMD64}
|
||||
|
@ -175,7 +175,10 @@ func RenderPodCmd(m *ice.Message, pod, cmd string, arg ...ice.Any) {
|
||||
m.OptionDefault(mdb.ICONS, m.Resource(kit.Select(ice.Info.NodeIcon, msg.Option(ice.MSG_NODEICON), msg.Append(mdb.ICONS))))
|
||||
serve := strings.Split(UserHost(m), "://")[1]
|
||||
pod = kit.Select(pod, msg.Option(ice.MSG_NODENAME), m.Option(ice.MSG_USERPOD) != "")
|
||||
m.OptionDefault(TITLE, kit.Select(cmd, msg.Append(mdb.HELP), !m.IsEnglish())+" "+kit.Select(serve, pod))
|
||||
m.OptionDefault(TITLE,
|
||||
// kit.Select(cmd, msg.Append(mdb.HELP), !m.IsEnglish())+" "+kit.Select(serve, pod),
|
||||
kit.Select(serve, pod)+" "+kit.Select(cmd, msg.Append(mdb.HELP), !m.IsEnglish()),
|
||||
)
|
||||
RenderCmds(m, kit.Dict(msg.AppendSimple(), ctx.ARGS, kit.Simple(arg), ctx.DISPLAY, m.Option(ice.MSG_DISPLAY)))
|
||||
}
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ func init() {
|
||||
case nfs.PATH:
|
||||
m.Push(key, kit.Path(""))
|
||||
case tcp.HOSTNAME:
|
||||
m.Push(key, ice.Info.Hostname)
|
||||
m.Push(key, ice.Info.HostName)
|
||||
default:
|
||||
m.Push(key, "")
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ func _serve_start(m *ice.Message) {
|
||||
m.Go(func() {
|
||||
m.Cmd(SPIDE, ice.OPS, _serve_address(m)+nfs.PS+ice.EXIT, ice.Maps{CLIENT_TIMEOUT: cli.TIME_30ms, ice.LOG_DISABLE: ice.TRUE})
|
||||
}).Sleep(cli.TIME_1s)
|
||||
cli.NodeInfo(m, kit.Select(kit.Split(ice.Info.Hostname, nfs.PT)[0], m.Option(tcp.NODENAME)), SERVER, mdb.Config(m, mdb.ICONS))
|
||||
cli.NodeInfo(m, kit.Select(kit.Split(ice.Info.HostName, nfs.PT)[0], m.Option(tcp.NODENAME)), SERVER, mdb.Config(m, mdb.ICONS))
|
||||
kit.If(ice.HasVar(), func() { m.Cmd(nfs.SAVE, ice.VAR_LOG_ICE_PORT, m.Option(tcp.PORT)) })
|
||||
kit.For(kit.Split(m.Option(ice.DEV)), func(dev string) {
|
||||
if strings.HasPrefix(dev, HTTP) {
|
||||
|
@ -94,7 +94,7 @@ func _space_fork(m *ice.Message) {
|
||||
safe := false
|
||||
if m.Option(ice.MSG_USERNAME, ""); kit.IsIn(m.Option(mdb.TYPE), WORKER, PORTAL) {
|
||||
if tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) {
|
||||
aaa.SessAuth(m, kit.Dict(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME, ice.Info.Username)).AppendSimple()))
|
||||
aaa.SessAuth(m, kit.Dict(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME, ice.Info.UserName)).AppendSimple()))
|
||||
}
|
||||
} else if m.Option(TOKEN) != "" {
|
||||
if msg := m.Cmd(TOKEN, m.Option(TOKEN)); msg.Append(mdb.TIME) > m.Time() && kit.IsIn(msg.Append(mdb.TYPE), SERVER, SPIDE) {
|
||||
@ -367,7 +367,7 @@ func init() {
|
||||
"s": {Help: "空间", Actions: ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) { m.Cmdy(CHAT_POD, arg) }},
|
||||
SPACE: {Name: "space name cmds auto", Help: "空间站", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
cli.NodeInfo(m, ice.Info.Pathname, WORKER)
|
||||
cli.NodeInfo(m, ice.Info.PathName, WORKER)
|
||||
aaa.White(m, SPACE, ice.MAIN)
|
||||
if kit.IsIn(ice.Info.NodeIcon, "src/main.ico", "") {
|
||||
nfs.Exists(m, "src/main.ico", func(p string) { ice.Info.NodeIcon = p })
|
||||
@ -376,7 +376,7 @@ func init() {
|
||||
}
|
||||
}},
|
||||
mdb.ICONS: {Hand: func(m *ice.Message, arg ...string) {
|
||||
cli.NodeInfo(m, ice.Info.Pathname, WORKER, arg[0])
|
||||
cli.NodeInfo(m, ice.Info.PathName, WORKER, arg[0])
|
||||
m.Cmd(SERVE, m.ActionKey(), arg)
|
||||
}},
|
||||
ice.MAIN: {Name: "main index", Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
|
||||
@ -394,7 +394,7 @@ func init() {
|
||||
m.Push(mdb.ICONS, ice.Info.NodeIcon)
|
||||
m.Push(nfs.MODULE, ice.Info.Make.Module)
|
||||
m.Push(nfs.VERSION, ice.Info.Make.Versions())
|
||||
m.Push(nfs.PATHNAME, ice.Info.Pathname)
|
||||
m.Push(nfs.PATHNAME, ice.Info.PathName)
|
||||
m.Push(tcp.HOSTPORT, HostPort(m, m.Cmd(tcp.HOST).Append(aaa.IP), m.Cmd(SERVER).Append(tcp.PORT)))
|
||||
m.Push(ORIGIN, m.Option(ice.MSG_USERHOST))
|
||||
}},
|
||||
|
@ -24,7 +24,7 @@ func init() {
|
||||
PushStats(m, "", "", "", "令牌总数", TOKEN)
|
||||
PushStats(m, "", "", "", "注册总数", aaa.APPLY)
|
||||
PushStats(m, "", "", "", "邀请总数", aaa.OFFER)
|
||||
if ice.Info.Username == ice.Info.Make.Username {
|
||||
if ice.Info.UserName == ice.Info.Make.Username {
|
||||
PushStats(m, "", m.Cmd(aaa.USER).Length()-1, "", "用户总数", aaa.USER)
|
||||
} else {
|
||||
PushStats(m, "", m.Cmd(aaa.USER).Length()-2, "", "用户总数", aaa.USER)
|
||||
|
@ -60,7 +60,7 @@ func init() {
|
||||
if msg.Length() == 0 {
|
||||
return
|
||||
}
|
||||
m.Options(tcp.HOSTNAME, ice.Info.Hostname, nfs.PATH, msg.Append(mdb.TEXT))
|
||||
m.Options(tcp.HOSTNAME, ice.Info.HostName, nfs.PATH, msg.Append(mdb.TEXT))
|
||||
if !m.WarnNotValid(m.Option(nfs.PATH) == "", arg[0]) {
|
||||
m.Option(aaa.IP, msg.Append(aaa.IP))
|
||||
m.Option(ice.MSG_USERUA, msg.Append(aaa.UA))
|
||||
|
@ -127,7 +127,7 @@ func init() {
|
||||
m.Cmd("", mdb.CREATE, mdb.TYPE, mdb.PLUGIN, mdb.NAME, "免登录体验", mdb.ORDER, "12", ctx.INDEX, HEADER, ctx.ARGS, ice.DEMO)
|
||||
mdb.Config(m, ice.DEMO, ice.TRUE)
|
||||
} else if mdb.Config(m, ice.DEMO) == ice.TRUE {
|
||||
web.RenderCookie(m, aaa.SessCreate(m, ice.Info.Username))
|
||||
web.RenderCookie(m, aaa.SessCreate(m, ice.Info.UserName))
|
||||
m.Echo("login success")
|
||||
} else {
|
||||
m.Echo("login failure")
|
||||
@ -154,10 +154,12 @@ func init() {
|
||||
m.Option(ice.MSG_NODETYPE, ice.Info.NodeType)
|
||||
m.Option(ice.MSG_NODENAME, ice.Info.NodeName)
|
||||
m.Option("favicon", ice.Info.NodeIcon)
|
||||
if ice.Info.NodeType == web.WORKER && ice.Info.Titles == "ContextOS" {
|
||||
return
|
||||
}
|
||||
m.Option("titles", ice.Info.Titles)
|
||||
m.Option("titles", kit.GetValid(
|
||||
func() string { return kit.Select("", ice.Info.Titles, ice.Info.Titles != "ContextOS") },
|
||||
func() string { return kit.Select("", ice.Info.NodeName, ice.Info.NodeName != "ContextOS") },
|
||||
func() string { return kit.Select("", ice.Info.PathName, ice.Info.PathName != "ContextOS") },
|
||||
func() string { return kit.Select("", ice.Info.HostName, ice.Info.HostName != "ContextOS") },
|
||||
))
|
||||
})
|
||||
if ice.Info.NodeType == web.WORKER {
|
||||
return
|
||||
|
@ -115,7 +115,7 @@ fieldset.macos.menu.cmd>div.output>div.menu { padding:0 var(--button-padding); }
|
||||
body.dark fieldset.desktop>div.output>fieldset.macos { background-color:#08234ad1; }
|
||||
body.light fieldset.desktop>div.output>fieldset.macos { background-color:#daefff99; }
|
||||
body.white fieldset.desktop>div.output>div.desktop>div.item>div.name { color:white; }
|
||||
body.mobile fieldset.desktop>div.output>div.desktop>fieldset>legend { float:none; }
|
||||
body.mobile fieldset.desktop>div.output>div.desktop>fieldset>legend { float:left; }
|
||||
body.mobile fieldset.desktop>div.output>div.desktop>fieldset>form.option>div.item.text>input { width:60px; }
|
||||
body.mobile fieldset.macos.dock>div.output { overflow-y:hidden; }
|
||||
body.windows fieldset.desktop>div.output>fieldset.macos.notifications>div.action>div.item.refresh>span { font-size:24px; margin-top:0; }
|
||||
|
@ -4,7 +4,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.onlayout.background(can, can.misc.ResourceIcons(can, can.user.info.background||"usr/icons/background.png"), can._fields)
|
||||
can.onimport._menu(can), can.onimport._notifications(can), can.onimport._searchs(can), can.onimport._dock(can)
|
||||
can.sup.onexport.link = function() { return can.misc.MergeURL(can, {pod: can.ConfSpace()||can.misc.Search(can, ice.POD), cmd: web.DESKTOP}) }
|
||||
can.onexport.title(can, can.ConfHelp(), can.user.titles)
|
||||
// can.onexport.title(can, can.ConfHelp(), can.user.titles)
|
||||
},
|
||||
_menu: function(can) { can.onappend.plugin(can, {index: "web.chat.macos.menu", style: html.OUTPUT, title: can.Conf("title")}, function(sub) { can.ui.menu = sub, sub._desktop = can
|
||||
var tabs = can.misc.sessionStorage(can, [can.ConfIndex(), html.TABS])
|
||||
|
@ -106,7 +106,7 @@ func _autogen_git(m *ice.Message, arg ...string) ice.Map {
|
||||
msg.Append("icebergs", value["version"])
|
||||
}
|
||||
})
|
||||
return kit.Dict(arg, aaa.USERNAME, m.Option(ice.MSG_USERNAME), tcp.HOSTNAME, ice.Info.Hostname, nfs.PATH, kit.Path("")+nfs.PS, mdb.TIME, m.Time(),
|
||||
return kit.Dict(arg, aaa.USERNAME, m.Option(ice.MSG_USERNAME), tcp.HOSTNAME, ice.Info.HostName, nfs.PATH, kit.Path("")+nfs.PS, mdb.TIME, m.Time(),
|
||||
GIT, GitVersion(m), GO, GoVersion(m), nfs.MODULE, _autogen_mod(m, ice.GO_MOD),
|
||||
msg.AppendSimple("remote,branch,version,forword,author,email,hash,when,message,release,icebergs"),
|
||||
web.DOMAIN, m.Spawn(kit.Dict(ice.MSG_USERWEB, web.UserHost(m), ice.MSG_USERPOD, m.Option(ice.MSG_USERPOD))).MergePod(""),
|
||||
|
@ -62,13 +62,13 @@ func init() {
|
||||
}), Hand: func(m *ice.Message, arg ...string) {
|
||||
repos := map[string]string{}
|
||||
list := map[string]map[string]string{}
|
||||
list[ice.Info.Pathname] = map[string]string{}
|
||||
list[ice.Info.PathName] = map[string]string{}
|
||||
m.Cmds(web.CODE_GIT_REPOS).Table(func(value ice.Maps) { repos[strings.Split(value[web.ORIGIN], "://")[1]] = value[nfs.VERSION] })
|
||||
m.Cmd(web.CODE_MOD, mdb.RENDER, MOD, ice.GO_MOD, nfs.PWD).Table(func(value ice.Maps) {
|
||||
list[ice.Info.Pathname][value[REQUIRE]] = value[VERSION]
|
||||
list[ice.Info.PathName][value[REQUIRE]] = value[VERSION]
|
||||
if value[REPLACE] == nfs.PWD {
|
||||
list[ice.Info.Pathname][MODULE] = value[REQUIRE]
|
||||
list[ice.Info.Pathname][VERSION] = value[VERSION]
|
||||
list[ice.Info.PathName][MODULE] = value[REQUIRE]
|
||||
list[ice.Info.PathName][VERSION] = value[VERSION]
|
||||
} else {
|
||||
repos[value[REQUIRE]] = value[VERSION]
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ func init() {
|
||||
kit.If(value[mdb.TYPE] == SHELL, func() { m.Push(arg[0], value[mdb.TEXT]) })
|
||||
})
|
||||
case mdb.NAME:
|
||||
m.Push(arg[0], path.Base(m.Option(mdb.TYPE)), ice.Info.Hostname)
|
||||
m.Push(arg[0], path.Base(m.Option(mdb.TYPE)), ice.Info.HostName)
|
||||
case nfs.PATH:
|
||||
m.Cmdy(nfs.DIR, ice.USR_LOCAL_WORK, nfs.PATH)
|
||||
m.Cmdy(nfs.DIR, ice.USR_LOCAL_REPOS, nfs.PATH)
|
||||
|
8
info.go
8
info.go
@ -46,7 +46,7 @@ func (s MakeInfo) Versions() string {
|
||||
}
|
||||
}
|
||||
func (s info) Title() string {
|
||||
p := path.Base(kit.Select(s.Pathname, s.Make.Remote, s.Titles))
|
||||
p := path.Base(kit.Select(s.PathName, s.Make.Remote, s.Titles))
|
||||
if strings.HasPrefix(p, "20") {
|
||||
p = kit.Join(strings.Split(p, "-")[1:], "-")
|
||||
}
|
||||
@ -63,9 +63,9 @@ type info struct {
|
||||
Size string
|
||||
Hash string
|
||||
|
||||
Username string
|
||||
Hostname string
|
||||
Pathname string
|
||||
UserName string
|
||||
HostName string
|
||||
PathName string
|
||||
NodeName string
|
||||
NodeType string
|
||||
NodeIcon string
|
||||
|
@ -51,8 +51,7 @@ func init() {
|
||||
}, gdb.EventsAction(chat.HEADER_AGENT), ctx.ConfAction(
|
||||
"oauth", "", web.SPACE, "", nfs.SCRIPT, "https://res.wx.qq.com/open/js/jweixin-1.6.0.js",
|
||||
)), Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(ACCESS, AGENT).Options(SIGNATURE, _wx_sign(m, m.Option(NONCESTR, ice.Info.Pathname), m.Option(TIMESTAMP, kit.Format(time.Now().Unix())))).Display("")
|
||||
m.Info("what %v", m.FormatsMeta(nil))
|
||||
m.Cmdy(ACCESS, AGENT).Options(SIGNATURE, _wx_sign(m, m.Option(NONCESTR, ice.Info.PathName), m.Option(TIMESTAMP, kit.Format(time.Now().Unix())))).Display("")
|
||||
ctx.OptionFromConfig(m, "oauth", nfs.SCRIPT)
|
||||
if m.Option(ice.MSG_USERNAME) == "" {
|
||||
msg := m.Spawn()
|
||||
|
@ -84,7 +84,7 @@ func init() {
|
||||
aaa.SESS: {Name: "sess code", Help: "会话", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(ice.MSG_USERZONE, WX)
|
||||
if mdb.Conf(m, "header", "meta.demo") == ice.TRUE {
|
||||
m.Echo(aaa.SessCreate(m.Spawn(), ice.Info.Username))
|
||||
m.Echo(aaa.SessCreate(m.Spawn(), ice.Info.UserName))
|
||||
return
|
||||
}
|
||||
appid := kit.Select(m.Option(APPID), kit.Split(kit.ParseURL(m.Option(ice.MSG_REFERER)).Path, nfs.PS), 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user