Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
K
koishi-plugin-pics
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
3rdeye
koishi-plugin-pics
Commits
3e057beb
Commit
3e057beb
authored
May 01, 2022
by
nanahira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
single picsource base plugin
parent
4d9ec83b
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
103 additions
and
106 deletions
+103
-106
CONTRIBUTING.md
CONTRIBUTING.md
+3
-16
package-lock.json
package-lock.json
+73
-73
package.json
package.json
+1
-1
src/index.ts
src/index.ts
+26
-16
No files found.
CONTRIBUTING.md
View file @
3e057beb
...
...
@@ -52,6 +52,8 @@ export class PicSource {
#### 单图源
对于单图源的插件,我们提供了
`PicSourcePlugin`
基类,只需要集成该类即可快速开发单图源插件。
```
ts
import
{
Context
}
from
"
koishi
"
;
import
{
DefinePlugin
,
RegisterSchema
,
SchemaProperty
,
LifecycleEvents
}
from
"
koishi-thirdeye
"
;
...
...
@@ -65,25 +67,10 @@ export class Config extends PicSourceConfig {
@
DefinePlugin
({
name
:
'
my-picsource
'
,
schema
:
Config
})
export
default
class
MyPicSource
extends
PicSource
implements
LifecycleEvents
{
constructor
(
ctx
:
Context
,
config
:
Partial
<
Config
>
)
{
super
(
ctx
);
}
@
InjectConfig
()
private
config
:
Config
;
@
Inject
(
true
)
private
pics
:
PicsContainer
;
export
default
class
MyPicSource
extends
PicSourcePlugin
<
Config
>
{
async
randomPic
(
tags
:
string
[])
{
return
{
url
:
`https://cdn02.moecube.com:444/images/ygopro-images-zh-CN/
${
this
.
config
.
code
}
.jpg`
,
description
:
`
${
this
.
config
.
code
}
`
};
}
onApply
()
{
this
.
config
.
applyTo
(
this
);
this
.
pics
.
addSource
(
this
);
}
}
```
...
...
package-lock.json
View file @
3e057beb
...
...
@@ -37,7 +37,7 @@
"ws"
:
"^8.3.0"
},
"peerDependencies"
:
{
"koishi"
:
"^4.6.
0
"
"koishi"
:
"^4.6.
1
"
}
},
"node_modules/@ampproject/remapping"
:
{
...
...
@@ -1070,15 +1070,15 @@
}
},
"node_modules/@koishijs/core"
:
{
"version"
:
"4.6.
0
"
,
"resolved"
:
"https://registry.npmjs.org/@koishijs/core/-/core-4.6.
0
.tgz"
,
"integrity"
:
"sha512-
m+K2h/Oqmpcw39dQhJ/D9MBmwnWNUf9uFqymJ94+nP4CR7rcM1DTWNiaMGshGUqNu+s4q0ildoEDlQrE4hVuWA
=="
,
"version"
:
"4.6.
1
"
,
"resolved"
:
"https://registry.npmjs.org/@koishijs/core/-/core-4.6.
1
.tgz"
,
"integrity"
:
"sha512-
2HzdUi76YSLFZYpPXcmEwwVyHQLPF8BL0GJR6PuCYdOYfHykzwA5NmqOGx29EyeuYzs8sS6yr25IQktxMYqsdg
=="
,
"peer"
:
true
,
"dependencies"
:
{
"@koishijs/utils"
:
"^5.4.
0
"
,
"cosmotype"
:
"^1.0.
3
"
,
"@koishijs/utils"
:
"^5.4.
1
"
,
"cosmotype"
:
"^1.0.
6
"
,
"fastest-levenshtein"
:
"^1.0.12"
,
"ns-require"
:
"^1.1.
0
"
"ns-require"
:
"^1.1.
2
"
},
"engines"
:
{
"node"
:
">=12.0.0"
...
...
@@ -1139,15 +1139,15 @@
"peer"
:
true
},
"node_modules/@koishijs/utils"
:
{
"version"
:
"5.4.
0
"
,
"resolved"
:
"https://registry.npmjs.org/@koishijs/utils/-/utils-5.4.
0
.tgz"
,
"integrity"
:
"sha512-
w5SHArw032cXVtxp5nXkc5jzP6Fn3LrF7FQTanPnOgmjGv/AIOAKfJ6bqaOUsSg+ttcK3iO8xs65W6XsNz3g7
g=="
,
"version"
:
"5.4.
1
"
,
"resolved"
:
"https://registry.npmjs.org/@koishijs/utils/-/utils-5.4.
1
.tgz"
,
"integrity"
:
"sha512-
M3L9KqtdTyCzQK1LxTtp7QCucc75IA2vRwnYJA1gXMAxPC3SoEjUVmsk/oNFBSknmfADdViI5mFJtUXMCpJW1
g=="
,
"peer"
:
true
,
"dependencies"
:
{
"@koishijs/segment"
:
"^1.1.1"
,
"cosmokit"
:
"^1.1.
1
"
,
"reggol"
:
"^1.0.
1
"
,
"schemastery"
:
"^3.3.
2
"
,
"cosmokit"
:
"^1.1.
2
"
,
"reggol"
:
"^1.0.
2
"
,
"schemastery"
:
"^3.3.
3
"
,
"supports-color"
:
"^8.1.1"
}
},
...
...
@@ -2608,18 +2608,18 @@
"peer"
:
true
},
"node_modules/cosmokit"
:
{
"version"
:
"1.1.
1
"
,
"resolved"
:
"https://registry.npmjs.org/cosmokit/-/cosmokit-1.1.
1
.tgz"
,
"integrity"
:
"sha512-
+f8x9pFGIc7I6HTObS90dq2K5YsI4U3Me4l9OminU9woVtF9Sv3CAHb5vKbFZ93XpTFctAQ6qAVSGjkGvGI9iw
=="
"version"
:
"1.1.
2
"
,
"resolved"
:
"https://registry.npmjs.org/cosmokit/-/cosmokit-1.1.
2
.tgz"
,
"integrity"
:
"sha512-
cSNrcyxZ3GT+tjSlUzWIzMiK7Wndq1Nm/2tlRhT65RXltSIcH5zaHdmnz1TnIhLuOViaO9qfSdnRPzxNkxMv0g
=="
},
"node_modules/cosmotype"
:
{
"version"
:
"1.0.
3
"
,
"resolved"
:
"https://registry.npmjs.org/cosmotype/-/cosmotype-1.0.
3
.tgz"
,
"integrity"
:
"sha512-
JykvyDjyjaDjycm8CcK8GD4Xt6/Glu4pJU9uJ5lsDuE5B5bdmAykiTPMHfs+Is8QUsNaDKpsHfxtxCUBDPYgdw
=="
,
"version"
:
"1.0.
9
"
,
"resolved"
:
"https://registry.npmjs.org/cosmotype/-/cosmotype-1.0.
9
.tgz"
,
"integrity"
:
"sha512-
ot2m5LYBj9UNFvYpQNQ28hWYDG4GWmym094us2HNn6qgYzvALmjs4FxEVBsjA+VBnIf3ykuMGRYcex5cqZTvJQ
=="
,
"peer"
:
true
,
"dependencies"
:
{
"cosmokit"
:
"^1.1.
1
"
,
"ns-require"
:
"^1.1.
0
"
"cosmokit"
:
"^1.1.
2
"
,
"ns-require"
:
"^1.1.
2
"
}
},
"node_modules/cosmotype-decorators"
:
{
...
...
@@ -5220,14 +5220,14 @@
}
},
"node_modules/koishi"
:
{
"version"
:
"4.6.
0
"
,
"resolved"
:
"https://registry.npmjs.org/koishi/-/koishi-4.6.
0
.tgz"
,
"integrity"
:
"sha512-
QhjFWTGhrFnYfpVg4dNNxgHER38zSij3nyM/RB3YrLTM4VwImVk5unpgg0QryViwWxSYM4zJ0YUoys4A9jgG6
A=="
,
"version"
:
"4.6.
1
"
,
"resolved"
:
"https://registry.npmjs.org/koishi/-/koishi-4.6.
1
.tgz"
,
"integrity"
:
"sha512-
9NtcXrIKLN8AG9zEf3GzweSiHQubew0AWfjaci0grIxy760T77D8iLVsDbVhzmGSnc26WOR2q3CMFdRmE2igV
A=="
,
"peer"
:
true
,
"dependencies"
:
{
"@koa/router"
:
"^10.1.1"
,
"@koishijs/core"
:
"^4.6.
0
"
,
"@koishijs/utils"
:
"^5.4.
0
"
,
"@koishijs/core"
:
"^4.6.
1
"
,
"@koishijs/utils"
:
"^5.4.
1
"
,
"@types/koa"
:
"*"
,
"@types/koa__router"
:
"*"
,
"@types/ws"
:
"^8.5.3"
,
...
...
@@ -5582,9 +5582,9 @@
}
},
"node_modules/ns-require"
:
{
"version"
:
"1.1.
0
"
,
"resolved"
:
"https://registry.npmjs.org/ns-require/-/ns-require-1.1.
0
.tgz"
,
"integrity"
:
"sha512-
Iw349zwWNgkGZjYJtruf+BXUe8YHOiMZE0iUNffvpt/A1yTSabTnpBMQ0zNl65G1LhpzwCo1KMCqjmJF0z8O6g
=="
,
"version"
:
"1.1.
2
"
,
"resolved"
:
"https://registry.npmjs.org/ns-require/-/ns-require-1.1.
2
.tgz"
,
"integrity"
:
"sha512-
GUF6I1hWDsGx1cA9FW27KIRAlkMel2UZagR39dVNPAPBgwWK1Ez0XB96WEz2OFcwHsCORI9h75dEZueHqZ/1pA
=="
,
"peer"
:
true
},
"node_modules/nwsapi"
:
{
...
...
@@ -6252,12 +6252,12 @@
}
},
"node_modules/reggol"
:
{
"version"
:
"1.0.
1
"
,
"resolved"
:
"https://registry.npmjs.org/reggol/-/reggol-1.0.
1
.tgz"
,
"integrity"
:
"sha512-
ZMOp3rZG6YQFVp/DC+BgFZaXSQcxHDayCmo7cL/kGujsSEoUzee0VJq1KCe9sgNt0qsM6JzkuSlj/+5SmmoO7Q
=="
,
"version"
:
"1.0.
2
"
,
"resolved"
:
"https://registry.npmjs.org/reggol/-/reggol-1.0.
2
.tgz"
,
"integrity"
:
"sha512-
BP7gx5nUBntWChG4x/yf7xLdpxy1R5PMtF/LJlOsz+XkWtip4YVNkQp2Flmio9hXSc2UxrwUyP0WrQ1M/FFWXw
=="
,
"peer"
:
true
,
"dependencies"
:
{
"cosmokit"
:
"^1.1.
0
"
,
"cosmokit"
:
"^1.1.
2
"
,
"supports-color"
:
"^8.1.1"
}
},
...
...
@@ -6435,12 +6435,12 @@
}
},
"node_modules/schemastery"
:
{
"version"
:
"3.3.
2
"
,
"resolved"
:
"https://registry.npmjs.org/schemastery/-/schemastery-3.3.
2
.tgz"
,
"integrity"
:
"sha512-
Z1C850OPtNEBs+D4QBPdC+Wu1t6Fn1BrOJILRHs2b+I/u61hUKP2vIPMAXFLvmmONnwqAW8ksPdCD6Zz9n8zhg
=="
,
"version"
:
"3.3.
3
"
,
"resolved"
:
"https://registry.npmjs.org/schemastery/-/schemastery-3.3.
3
.tgz"
,
"integrity"
:
"sha512-
DwRsse6C+Qao90P/Bz+4G3gmAjM3he/VgHk3TykmEWv3KFqvwmqEn61SF3BPaTPP0L77a5Kc6q4+KQvdN1bBqA
=="
,
"peer"
:
true
,
"dependencies"
:
{
"cosmokit"
:
"^1.1.
0
"
"cosmokit"
:
"^1.1.
2
"
}
},
"node_modules/schemastery-gen"
:
{
...
...
@@ -8558,15 +8558,15 @@
}
},
"@koishijs/core"
:
{
"version"
:
"4.6.
0
"
,
"resolved"
:
"https://registry.npmjs.org/@koishijs/core/-/core-4.6.
0
.tgz"
,
"integrity"
:
"sha512-
m+K2h/Oqmpcw39dQhJ/D9MBmwnWNUf9uFqymJ94+nP4CR7rcM1DTWNiaMGshGUqNu+s4q0ildoEDlQrE4hVuWA
=="
,
"version"
:
"4.6.
1
"
,
"resolved"
:
"https://registry.npmjs.org/@koishijs/core/-/core-4.6.
1
.tgz"
,
"integrity"
:
"sha512-
2HzdUi76YSLFZYpPXcmEwwVyHQLPF8BL0GJR6PuCYdOYfHykzwA5NmqOGx29EyeuYzs8sS6yr25IQktxMYqsdg
=="
,
"peer"
:
true
,
"requires"
:
{
"@koishijs/utils"
:
"^5.4.
0
"
,
"cosmotype"
:
"^1.0.
3
"
,
"@koishijs/utils"
:
"^5.4.
1
"
,
"cosmotype"
:
"^1.0.
6
"
,
"fastest-levenshtein"
:
"^1.0.12"
,
"ns-require"
:
"^1.1.
0
"
"ns-require"
:
"^1.1.
2
"
}
},
"@koishijs/plugin-cache-lru"
:
{
...
...
@@ -8612,15 +8612,15 @@
"peer"
:
true
},
"@koishijs/utils"
:
{
"version"
:
"5.4.
0
"
,
"resolved"
:
"https://registry.npmjs.org/@koishijs/utils/-/utils-5.4.
0
.tgz"
,
"integrity"
:
"sha512-
w5SHArw032cXVtxp5nXkc5jzP6Fn3LrF7FQTanPnOgmjGv/AIOAKfJ6bqaOUsSg+ttcK3iO8xs65W6XsNz3g7
g=="
,
"version"
:
"5.4.
1
"
,
"resolved"
:
"https://registry.npmjs.org/@koishijs/utils/-/utils-5.4.
1
.tgz"
,
"integrity"
:
"sha512-
M3L9KqtdTyCzQK1LxTtp7QCucc75IA2vRwnYJA1gXMAxPC3SoEjUVmsk/oNFBSknmfADdViI5mFJtUXMCpJW1
g=="
,
"peer"
:
true
,
"requires"
:
{
"@koishijs/segment"
:
"^1.1.1"
,
"cosmokit"
:
"^1.1.
1
"
,
"reggol"
:
"^1.0.
1
"
,
"schemastery"
:
"^3.3.
2
"
,
"cosmokit"
:
"^1.1.
2
"
,
"reggol"
:
"^1.0.
2
"
,
"schemastery"
:
"^3.3.
3
"
,
"supports-color"
:
"^8.1.1"
},
"dependencies"
:
{
...
...
@@ -9820,18 +9820,18 @@
"peer"
:
true
},
"cosmokit"
:
{
"version"
:
"1.1.
1
"
,
"resolved"
:
"https://registry.npmjs.org/cosmokit/-/cosmokit-1.1.
1
.tgz"
,
"integrity"
:
"sha512-
+f8x9pFGIc7I6HTObS90dq2K5YsI4U3Me4l9OminU9woVtF9Sv3CAHb5vKbFZ93XpTFctAQ6qAVSGjkGvGI9iw
=="
"version"
:
"1.1.
2
"
,
"resolved"
:
"https://registry.npmjs.org/cosmokit/-/cosmokit-1.1.
2
.tgz"
,
"integrity"
:
"sha512-
cSNrcyxZ3GT+tjSlUzWIzMiK7Wndq1Nm/2tlRhT65RXltSIcH5zaHdmnz1TnIhLuOViaO9qfSdnRPzxNkxMv0g
=="
},
"cosmotype"
:
{
"version"
:
"1.0.
3
"
,
"resolved"
:
"https://registry.npmjs.org/cosmotype/-/cosmotype-1.0.
3
.tgz"
,
"integrity"
:
"sha512-
JykvyDjyjaDjycm8CcK8GD4Xt6/Glu4pJU9uJ5lsDuE5B5bdmAykiTPMHfs+Is8QUsNaDKpsHfxtxCUBDPYgdw
=="
,
"version"
:
"1.0.
9
"
,
"resolved"
:
"https://registry.npmjs.org/cosmotype/-/cosmotype-1.0.
9
.tgz"
,
"integrity"
:
"sha512-
ot2m5LYBj9UNFvYpQNQ28hWYDG4GWmym094us2HNn6qgYzvALmjs4FxEVBsjA+VBnIf3ykuMGRYcex5cqZTvJQ
=="
,
"peer"
:
true
,
"requires"
:
{
"cosmokit"
:
"^1.1.
1
"
,
"ns-require"
:
"^1.1.
0
"
"cosmokit"
:
"^1.1.
2
"
,
"ns-require"
:
"^1.1.
2
"
}
},
"cosmotype-decorators"
:
{
...
...
@@ -11783,14 +11783,14 @@
}
},
"koishi"
:
{
"version"
:
"4.6.
0
"
,
"resolved"
:
"https://registry.npmjs.org/koishi/-/koishi-4.6.
0
.tgz"
,
"integrity"
:
"sha512-
QhjFWTGhrFnYfpVg4dNNxgHER38zSij3nyM/RB3YrLTM4VwImVk5unpgg0QryViwWxSYM4zJ0YUoys4A9jgG6
A=="
,
"version"
:
"4.6.
1
"
,
"resolved"
:
"https://registry.npmjs.org/koishi/-/koishi-4.6.
1
.tgz"
,
"integrity"
:
"sha512-
9NtcXrIKLN8AG9zEf3GzweSiHQubew0AWfjaci0grIxy760T77D8iLVsDbVhzmGSnc26WOR2q3CMFdRmE2igV
A=="
,
"peer"
:
true
,
"requires"
:
{
"@koa/router"
:
"^10.1.1"
,
"@koishijs/core"
:
"^4.6.
0
"
,
"@koishijs/utils"
:
"^5.4.
0
"
,
"@koishijs/core"
:
"^4.6.
1
"
,
"@koishijs/utils"
:
"^5.4.
1
"
,
"@types/koa"
:
"*"
,
"@types/koa__router"
:
"*"
,
"@types/ws"
:
"^8.5.3"
,
...
...
@@ -12074,9 +12074,9 @@
}
},
"ns-require"
:
{
"version"
:
"1.1.
0
"
,
"resolved"
:
"https://registry.npmjs.org/ns-require/-/ns-require-1.1.
0
.tgz"
,
"integrity"
:
"sha512-
Iw349zwWNgkGZjYJtruf+BXUe8YHOiMZE0iUNffvpt/A1yTSabTnpBMQ0zNl65G1LhpzwCo1KMCqjmJF0z8O6g
=="
,
"version"
:
"1.1.
2
"
,
"resolved"
:
"https://registry.npmjs.org/ns-require/-/ns-require-1.1.
2
.tgz"
,
"integrity"
:
"sha512-
GUF6I1hWDsGx1cA9FW27KIRAlkMel2UZagR39dVNPAPBgwWK1Ez0XB96WEz2OFcwHsCORI9h75dEZueHqZ/1pA
=="
,
"peer"
:
true
},
"nwsapi"
:
{
...
...
@@ -12564,12 +12564,12 @@
"dev"
:
true
},
"reggol"
:
{
"version"
:
"1.0.
1
"
,
"resolved"
:
"https://registry.npmjs.org/reggol/-/reggol-1.0.
1
.tgz"
,
"integrity"
:
"sha512-
ZMOp3rZG6YQFVp/DC+BgFZaXSQcxHDayCmo7cL/kGujsSEoUzee0VJq1KCe9sgNt0qsM6JzkuSlj/+5SmmoO7Q
=="
,
"version"
:
"1.0.
2
"
,
"resolved"
:
"https://registry.npmjs.org/reggol/-/reggol-1.0.
2
.tgz"
,
"integrity"
:
"sha512-
BP7gx5nUBntWChG4x/yf7xLdpxy1R5PMtF/LJlOsz+XkWtip4YVNkQp2Flmio9hXSc2UxrwUyP0WrQ1M/FFWXw
=="
,
"peer"
:
true
,
"requires"
:
{
"cosmokit"
:
"^1.1.
0
"
,
"cosmokit"
:
"^1.1.
2
"
,
"supports-color"
:
"^8.1.1"
},
"dependencies"
:
{
...
...
@@ -12690,12 +12690,12 @@
}
},
"schemastery"
:
{
"version"
:
"3.3.
2
"
,
"resolved"
:
"https://registry.npmjs.org/schemastery/-/schemastery-3.3.
2
.tgz"
,
"integrity"
:
"sha512-
Z1C850OPtNEBs+D4QBPdC+Wu1t6Fn1BrOJILRHs2b+I/u61hUKP2vIPMAXFLvmmONnwqAW8ksPdCD6Zz9n8zhg
=="
,
"version"
:
"3.3.
3
"
,
"resolved"
:
"https://registry.npmjs.org/schemastery/-/schemastery-3.3.
3
.tgz"
,
"integrity"
:
"sha512-
DwRsse6C+Qao90P/Bz+4G3gmAjM3he/VgHk3TykmEWv3KFqvwmqEn61SF3BPaTPP0L77a5Kc6q4+KQvdN1bBqA
=="
,
"peer"
:
true
,
"requires"
:
{
"cosmokit"
:
"^1.1.
0
"
"cosmokit"
:
"^1.1.
2
"
}
},
"schemastery-gen"
:
{
...
...
package.json
View file @
3e057beb
...
...
@@ -57,7 +57,7 @@
"
ws
"
:
"
^8.3.0
"
},
"peerDependencies"
:
{
"koishi"
:
"^4.6.
0
"
"koishi"
:
"^4.6.
1
"
},
"jest"
:
{
"moduleFileExtensions"
:
[
...
...
src/index.ts
View file @
3e057beb
// import 'source-map-support/register';
import
{
Context
,
Assets
,
Awaitable
,
Random
,
Logger
,
Bot
,
remove
,
}
from
'
koishi
'
;
import
{
PicMiddlewareConfig
,
PicMiddlewareInfo
,
PicSourceInfo
,
PicsPluginConfig
,
}
from
'
./config
'
;
import
{
Context
,
Awaitable
,
Random
,
Logger
,
Bot
,
remove
}
from
'
koishi
'
;
import
{
PicSourceConfig
,
PicSourceInfo
,
PicsPluginConfig
}
from
'
./config
'
;
import
_
from
'
lodash
'
;
import
{
segment
,
Quester
}
from
'
koishi
'
;
import
{
BasePlugin
,
Caller
,
ClassType
,
DefinePlugin
,
Inject
,
InjectConfig
,
InjectLogger
,
LifecycleEvents
,
PartialDeep
,
Provide
,
}
from
'
koishi-thirdeye
'
;
import
{
AxiosRequestConfig
}
from
'
axios
'
;
...
...
@@ -77,6 +65,28 @@ export class PicSource implements PicSourceInfo {
}
}
export
class
PicSourcePlugin
<
C
extends
PicSourceConfig
=
PicSourceConfig
,
>
extends
PicSource
{
constructor
(
ctx
:
Context
,
config
:
PartialDeep
<
C
>
)
{
super
(
ctx
);
}
@
InjectConfig
()
protected
config
:
C
;
@
Inject
(
true
)
protected
pics
:
PicsContainer
;
@
InjectLogger
()
protected
logger
:
Logger
;
onApply
()
{
this
.
config
.
applyTo
(
this
);
this
.
pics
.
addSource
(
this
);
}
}
@
Provide
(
'
pics
'
,
{
immediate
:
true
})
@
DefinePlugin
({
name
:
'
pics
'
,
schema
:
PicsPluginConfig
})
export
default
class
PicsContainer
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment