Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dlink
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhaowei
dlink
Commits
0c77ee42
Unverified
Commit
0c77ee42
authored
Jul 25, 2022
by
zhu-mingye
Committed by
GitHub
Jul 25, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
optimization dlink-web,docs (#763)
parent
d8c2e776
Changes
13
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
105 additions
and
7619 deletions
+105
-7619
.gitignore
.gitignore
+2
-0
index.tsx
...c/components/Studio/StudioConsole/StudioProcess/index.tsx
+7
-7
index.tsx
...components/Studio/StudioRightTool/StudioHistory/index.tsx
+6
-1
index.tsx
dlink-web/src/pages/DevOps/JobInfo/CheckPoints/index.tsx
+6
-0
index.tsx
dlink-web/src/pages/DevOps/JobInfo/Config/index.tsx
+2
-5
index.tsx
dlink-web/src/pages/DevOps/JobInstanceTable/index.tsx
+1
-1
data.d.ts
dlink-web/src/pages/DevOps/data.d.ts
+1
-0
deploy.md
docs/docs/build_deploy/deploy.md
+19
-41
cdcsource_statements.md
docs/docs/data_integration_guide/cdcsource_statements.md
+16
-0
remote_debug.md
docs/docs/developer_guide/remote_debug.md
+5
-0
deploy.md
docs/versioned_docs/version-0.6/build_deploy/deploy.md
+19
-42
cdcsource_statements.md
...ersion-0.6/data_integration_guide/cdcsource_statements.md
+21
-1
yarn.lock
docs/yarn.lock
+0
-7521
No files found.
.gitignore
View file @
0c77ee42
...
...
@@ -41,3 +41,5 @@ docs/node_modules
docs/.cache-loader
docs/package-lock.json
docs/build
docs/yarn.lock
docs/*.log
\ No newline at end of file
dlink-web/src/components/Studio/StudioConsole/StudioProcess/index.tsx
View file @
0c77ee42
...
...
@@ -18,16 +18,15 @@
*/
import
{
Empty
,
Tag
,
Divider
,
Tooltip
,
message
,
Select
,
Button
,
Space
,
Modal
,
Dropdown
,
Menu
}
from
"antd"
;
import
{
Button
,
Divider
,
Dropdown
,
Empty
,
Menu
,
message
,
Modal
,
Select
,
Space
,
Tag
,
Tooltip
}
from
"antd"
;
import
{
StateType
}
from
"@/pages/DataStudio/model"
;
import
{
connect
}
from
"umi"
;
import
{
useState
}
from
"react"
;
import
{
SearchOutlined
,
CheckCircleOutlined
,
SyncOutlined
,
CloseCircleOutlined
,
ClockCircleOutlined
,
MinusCircleOutlined
,
Down
Outlined
}
from
'@ant-design/icons'
;
import
React
,
{
useState
}
from
"react"
;
import
{
DownOutlined
,
Search
Outlined
}
from
'@ant-design/icons'
;
import
ProTable
from
'@ant-design/pro-table'
;
import
{
cancelJob
,
savepointJob
,
showFlinkJobs
}
from
"../../StudioEvent/DDL"
;
import
{
ClusterTableListItem
}
from
"@/pages/Cluster/data"
;
import
React
from
"react"
;
import
JobStatus
from
"@/components/Common/JobStatus"
;
import
{
parseSecondStr
}
from
"@/components/Common/function"
;
const
{
Option
}
=
Select
;
...
...
@@ -110,9 +109,10 @@ const StudioProcess = (props: any) => {
valueType
:
'dateTime'
,
},
{
title
:
"耗时"
,
dataIndex
:
"duration"
,
sorter
:
true
,
valueType
:
'second'
,
render
:
(
_
,
row
)
=>
{
return
(
parseSecondStr
(
row
.
duration
))
}
},
{
title
:
"tasks"
,
dataIndex
:
"tasks"
,
...
...
dlink-web/src/components/Studio/StudioRightTool/StudioHistory/index.tsx
View file @
0c77ee42
...
...
@@ -83,7 +83,12 @@ const StudioHistory = (props: any) => {
</
div
><
br
/>
<
Scrollbars
style=
{
{
height
:
"98%"
}
}
>
<
React
.
StrictMode
>
<
MonacoDiffEditor
options=
{
{
readOnly
:
true
}
}
language=
{
"sql"
}
theme=
{
"vs-dark"
}
original=
{
originalValue
}
value=
{
currentValue
}
/>
<
MonacoDiffEditor
options=
{
{
readOnly
:
true
,
selectOnLineNumbers
:
true
,
lineDecorationsWidth
:
20
,
mouseWheelZoom
:
true
}
}
language=
{
"sql"
}
theme=
{
"vs-dark"
}
original=
{
originalValue
}
value=
{
currentValue
}
/>
</
React
.
StrictMode
>
</
Scrollbars
>
</
Modal
>
...
...
dlink-web/src/pages/DevOps/JobInfo/CheckPoints/index.tsx
View file @
0c77ee42
...
...
@@ -233,6 +233,7 @@ const CheckPoints = (props: any) => {
historyID
:
job
?.
jobHistory
.
id
,
id
:
entity
.
id
,
status
:
entity
.
status
,
checkpoint_type
:
entity
.
checkpoint_type
,
end_to_end_duration
:
entity
.
end_to_end_duration
,
external_path
:
entity
.
external_path
,
latest_ack_timestamp
:
entity
.
latest_ack_timestamp
,
...
...
@@ -273,6 +274,11 @@ const CheckPoints = (props: any) => {
return
entity
.
end_to_end_duration
===
null
?
'None'
:
parseMilliSecondStr
(
entity
.
end_to_end_duration
);
},
},
{
title
:
'类型'
,
align
:
'center'
,
dataIndex
:
'checkpoint_type'
,
},
{
title
:
'存储位置'
,
align
:
'center'
,
...
...
dlink-web/src/pages/DevOps/JobInfo/Config/index.tsx
View file @
0c77ee42
...
...
@@ -27,8 +27,6 @@ const Config = (props: any) => {
const
{
job
}
=
props
;
return
(<>
{
job
?.
jobHistory
?.
config
&&
<>
<>
<
Descriptions
bordered
size=
"small"
title=
{
"Dinky Job Configuration"
}
>
<
Descriptions
.
Item
label=
"执行模式"
>
{
job
?.
history
?.
type
?
(
...
...
@@ -67,7 +65,7 @@ const Config = (props: any) => {
</>
<
br
/><
br
/>
<>
{
!
JSON
.
stringify
(
job
?.
jobHistory
?.
config
).
includes
(
"errors"
)
&&
{
(
!
JSON
.
stringify
(
job
?.
jobHistory
?.
config
).
includes
(
"errors"
)
&&
!
job
?.
jobHistory
?.
config
)
&&
<
Descriptions
bordered
size=
"small"
title=
{
"Flink Job Configuration"
}
>
<
Descriptions
.
Item
label=
"Execution Mode"
>
<
Tag
color=
"blue"
title=
{
"Execution Mode"
}
>
...
...
@@ -100,8 +98,7 @@ const Config = (props: any) => {
}
</>
</>
}
</>)
)
};
export
default
Config
;
dlink-web/src/pages/DevOps/JobInstanceTable/index.tsx
View file @
0c77ee42
...
...
@@ -173,7 +173,7 @@ const JobInstanceTable = (props: any) => {
headerTitle=
{
`上次更新时间:${moment(time).format('HH:mm:ss')}`
}
polling=
{
status
==
activeKey
?
3000
:
undefined
}
pagination=
{
{
pageSize
:
5
,
pageSize
:
10
,
}
}
onRow=
{
record
=>
{
return
{
...
...
dlink-web/src/pages/DevOps/data.d.ts
View file @
0c77ee42
...
...
@@ -145,6 +145,7 @@ export type CheckPointsDetailInfo = {
historyID
:
number
,
id
:
number
,
status
:
string
,
checkpoint_type
:
string
,
end_to_end_duration
:
number
,
external_path
:
string
,
latest_ack_timestamp
:
number
,
...
...
docs/docs/build_deploy/deploy.md
View file @
0c77ee42
...
...
@@ -142,8 +142,10 @@ $nginx -s reload
Dinky 需要具备自身的 Flink 环境,该 Flink 环境的实现需要用户自己在 Dinky 根目录下创建 plugins 文件夹并上传相关的 Flink 依赖,如 flink-dist, flink-table 等,具体见下文。当然也可在启动文件中指定 FLINK_HOME,但不建议这样做。
:::warning 注意事项
Dinky 当前版本的 yarn 的 perjob 与 application 执行模式依赖 flink-shade-hadoop ,如果你的 Hadoop 版本为 2+ 或 3+,需要额外添加 flink-shade-hadoop-uber-3 包,请手动删除该包内部的 javax.servlet 等冲突内容。
当然如果你的 Hadoop 为 3+ 也可以自行编译对于版本的 dlink-client-hadoop.jar 以替代 uber 包,
:::
```
#创建目录
...
...
@@ -163,15 +165,26 @@ https://mvnrepository.com/artifact/org.apache.flink/flink-shaded-hadoop-3-uber?r
config/
--
配置文件
|- application.yml
extends/
--
扩展
|- dlink-client-1.11.jar
|- dlink-client-1.12.jar
|- dlink-client-1.14.jar
|- dlink-client-1.11.jar
--
适配 Flink1.11.x
|- dlink-client-1.12.jar
--
适配 Flink1.12.x
|- dlink-client-1.14.jar
--
适配 Flink1.14.x
|- dlink-client-1.15.jar
--
适配 Flink1.15.x
html/
--
前端编译产物
jar/
--
dlink application 模式提交 sql 用到的 jar
jar/
|- dlink-app-1.11.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.11.x
|- dlink-app-1.12.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.12.x
|- dlink-app-1.13.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.13.x
|- dlink-app-1.14.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.14.x
|- dlink-app-1.15.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.15.x
|- dlink-client-base.jar
--
整库同步场景下需要的包
|- dlink-common.jar
--
整库同步场景下需要的包
lib/
--
内部组件
|- dlink-alert-dingtalk.jar
|- dlink-alert-email.jar
|- dlink-alert-feishu.jar
|- dlink-alert-wechat.jar
|- dlink-client-1.13.jar
|- dlink-client-1.13.jar
--
适配 Flink1.13.x,默认
|- dlink-catalog-mysql.jar
--
dlink 的 catalog实现
|- dlink-connector-jdbc.jar
|- dlink-function.jar
|- dlink-metadata-clickhouse.jar
...
...
@@ -195,6 +208,7 @@ plugins/
sql/
|- dlink.sql
--
Mysql初始化脚本
|- dlink_history.sql
--
Mysql各版本及时间点升级脚本
|- dlinkmysqlcatalog.sql
--
dlink 的 catalog 表 SQL 脚本
auto.sh
--
启动停止脚本
dlink-admin.jar
--
主程序包
```
...
...
@@ -222,41 +236,5 @@ $sh auto.sh status
## Docker部署
[
👉DockerHub
](
https://hub.docker.com/r/ylyue/dinky
)
### Docker 部署参考命令:
```
bash
docker run
-it
--name
=
dinky
-p8888
:8888
\
-e
spring.datasource.url
=
jdbc:mysql://localhost:3306/dlink?useUnicode
=
true
&characterEncoding
=
UTF-8&autoReconnect
=
true
&useSSL
=
false
&zeroDateTimeBehavior
=
convertToNull&serverTimezone
=
Asia/Shanghai&allowPublicKeyRetrieval
=
true
\
-e
spring.datasource.username
=
root
\
-e
spring.datasource.password
=
11eb441842a9491c90168c6f76c2eed4
\
-v
/opt/docker/dinky/plugins:/opt/dinky/plugins
\
-v
/opt/docker/dinky/lib:/opt/dinky/lib
\
-v
/opt/docker/dinky/jar:/opt/dinky/jar
\
registry.cn-beijing.aliyuncs.com/yue-open/dinky:0.6.4-flink1.15
```
### 环境变量与挂载点:
-
SpringBoot 标准项目,
`-e`
可以用于替换
[
application.yml
](
https://gitee.com/DataLinkDC/Dinky/blob/0.6.4/dlink-admin/src/main/resources/application.yml
)
文件中的配置
-
`/opt/dinky/plugins`
挂载点,用于挂载Flink SQL开发中需要依赖的jar包
-
`/opt/dinky/lib`
挂载点(非必须),用于挂载Dinky内部组件,当你需要时再挂载出来
-
`/opt/dinky/jar`
挂载点(非必须),用于挂载dlink application模式提交sql用到的jar,当你需要时再挂载出来
### MySQL 数据库的初始化脚本:
-
[
👉Gitee Releases 界面
](
https://gitee.com/DataLinkDC/Dinky/releases
)
下载对应版本的releases包,获得Mysql初始化脚本
-
[
👉Dinky官网 Releases 界面
](
http://www.dlink.top/download/download
)
下载对应版本的releases包,获得Mysql初始化脚本
-
mysql需自行部署8.x版本,参考:
[
👉Centos Docker MySQL8 安装与初始化配置
](
https://blog.csdn.net/u013600314/article/details/80521778?spm=1001.2014.3001.5502
)
:::tip 版本号0.6.4-flink1.15:
-
`0.6.4`
代表Dinky版本号
-
`flink1.15`
代表Flink版本号,即默认提供了flink1.15的相关默认依赖,你任然可以替换
`plugins、lib、jar`
挂载点的相关依赖包,使之支持Flink其他版本,如:flink:1.15-scala_2.12.15
:::
:::tip Dinky与Flink:
-
此镜像仓库只是让你部署起了 Dinky 开发平台,因此你任然还需部署 Flink 集群
-
Flink集群部署参考
[
Flink官方文档
](
https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/deployment/resource-providers/standalone/docker/
)
:::
docs/docs/data_integration_guide/cdcsource_statements.md
View file @
0c77ee42
...
...
@@ -37,6 +37,22 @@ Dinky 提供了各式各样的 sink 方式,通过修改语句参数可以实
CDCSOURCE 语句用于将上游指定数据库的所有表的数据采用一个任务同步到下游系统。
:::warning
**Yarn Session**
,
**Standalone**
模式下 注意事项
在
**Yarn Session**
,
**Standalone**
模式下,使用整库同步需要将 dlink 的一些依赖放入 Flink/lib 下, 依赖如下:
1.
jar/dlink-client-base-${version}.jar
2.
jar/dlink-common-${version}.jar
3.
lib/dlink-client-${version}.jar
注意: 放入 Flink/lib 下后需要重启 Flink 集群
:::
:::warning
**Pre Job**
,
**Application**
模式下 注意事项
在
**Pre Job**
,
**Application**
模式下,使用整库同步需要将 dlink 的一些依赖放入 HDFS, 依赖如下:
1.
jar/dlink-client-base-${version}.jar
2.
jar/dlink-common-${version}.jar
3.
lib/dlink-client-${version}.jar
:::
### 语法结构
```
sql
...
...
docs/docs/developer_guide/remote_debug.md
View file @
0c77ee42
...
...
@@ -189,6 +189,11 @@ hive-site.xml 需要使用到 Hive Catalog 时添加


:::warning 注意事项
如果是整库同步场景下请将级别设置为全局库 ,模块选中所有
:::
### 启动 Yarn Session 集群
...
...
docs/versioned_docs/version-0.6/build_deploy/deploy.md
View file @
0c77ee42
...
...
@@ -142,8 +142,10 @@ $nginx -s reload
Dinky 需要具备自身的 Flink 环境,该 Flink 环境的实现需要用户自己在 Dinky 根目录下创建 plugins 文件夹并上传相关的 Flink 依赖,如 flink-dist, flink-table 等,具体见下文。当然也可在启动文件中指定 FLINK_HOME,但不建议这样做。
:::warning 注意事项
Dinky 当前版本的 yarn 的 perjob 与 application 执行模式依赖 flink-shade-hadoop ,如果你的 Hadoop 版本为 2+ 或 3+,需要额外添加 flink-shade-hadoop-uber-3 包,请手动删除该包内部的 javax.servlet 等冲突内容。
当然如果你的 Hadoop 为 3+ 也可以自行编译对于版本的 dlink-client-hadoop.jar 以替代 uber 包,
:::
```
#创建目录
...
...
@@ -163,15 +165,26 @@ https://mvnrepository.com/artifact/org.apache.flink/flink-shaded-hadoop-3-uber?r
config/
--
配置文件
|- application.yml
extends/
--
扩展
|- dlink-client-1.11.jar
|- dlink-client-1.12.jar
|- dlink-client-1.14.jar
|- dlink-client-1.11.jar
--
适配 Flink1.11.x
|- dlink-client-1.12.jar
--
适配 Flink1.12.x
|- dlink-client-1.14.jar
--
适配 Flink1.14.x
|- dlink-client-1.15.jar
--
适配 Flink1.15.x
html/
--
前端编译产物
jar/
--
dlink application 模式提交 sql 用到的 jar
jar/
|- dlink-app-1.11.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.11.x
|- dlink-app-1.12.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.12.x
|- dlink-app-1.13.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.13.x
|- dlink-app-1.14.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.14.x
|- dlink-app-1.15.jar
--
dlink application 模式提交 sql 用到的 jar 适配 Flink1.15.x
|- dlink-client-base.jar
--
整库同步场景下需要的包
|- dlink-common.jar
--
整库同步场景下需要的包
lib/
--
内部组件
|- dlink-alert-dingtalk.jar
|- dlink-alert-email.jar
|- dlink-alert-feishu.jar
|- dlink-alert-wechat.jar
|- dlink-client-1.13.jar
|- dlink-client-1.13.jar
--
适配 Flink1.13.x,默认
|- dlink-catalog-mysql.jar
--
dlink 的 catalog 实现
|- dlink-connector-jdbc.jar
|- dlink-function.jar
|- dlink-metadata-clickhouse.jar
...
...
@@ -195,6 +208,7 @@ plugins/
sql/
|- dlink.sql
--
Mysql初始化脚本
|- dlink_history.sql
--
Mysql各版本及时间点升级脚本
|- dlinkmysqlcatalog.sql
--
dlink 的 catalog 表 SQL 脚本
auto.sh
--
启动停止脚本
dlink-admin.jar
--
主程序包
```
...
...
@@ -222,41 +236,4 @@ $sh auto.sh status
## Docker部署
[
👉DockerHub
](
https://hub.docker.com/r/ylyue/dinky
)
### Docker 部署参考命令:
```
bash
docker run
-it
--name
=
dinky
-p8888
:8888
\
-e
spring.datasource.url
=
jdbc:mysql://localhost:3306/dlink?useUnicode
=
true
&characterEncoding
=
UTF-8&autoReconnect
=
true
&useSSL
=
false
&zeroDateTimeBehavior
=
convertToNull&serverTimezone
=
Asia/Shanghai&allowPublicKeyRetrieval
=
true
\
-e
spring.datasource.username
=
root
\
-e
spring.datasource.password
=
11eb441842a9491c90168c6f76c2eed4
\
-v
/opt/docker/dinky/plugins:/opt/dinky/plugins
\
-v
/opt/docker/dinky/lib:/opt/dinky/lib
\
-v
/opt/docker/dinky/jar:/opt/dinky/jar
\
registry.cn-beijing.aliyuncs.com/yue-open/dinky:0.6.4-flink1.15
```
### 环境变量与挂载点:
-
SpringBoot 标准项目,
`-e`
可以用于替换
[
application.yml
](
https://gitee.com/DataLinkDC/Dinky/blob/0.6.4/dlink-admin/src/main/resources/application.yml
)
文件中的配置
-
`/opt/dinky/plugins`
挂载点,用于挂载Flink SQL开发中需要依赖的jar包
-
`/opt/dinky/lib`
挂载点(非必须),用于挂载Dinky内部组件,当你需要时再挂载出来
-
`/opt/dinky/jar`
挂载点(非必须),用于挂载dlink application模式提交sql用到的jar,当你需要时再挂载出来
### MySQL 数据库的初始化脚本:
-
[
👉Gitee Releases 界面
](
https://gitee.com/DataLinkDC/Dinky/releases
)
下载对应版本的releases包,获得Mysql初始化脚本
-
[
👉Dinky官网 Releases 界面
](
http://www.dlink.top/download/download
)
下载对应版本的releases包,获得Mysql初始化脚本
-
mysql需自行部署8.x版本,参考:
[
👉Centos Docker MySQL8 安装与初始化配置
](
https://blog.csdn.net/u013600314/article/details/80521778?spm=1001.2014.3001.5502
)
:::tip 版本号0.6.4-flink1.15:
-
`0.6.4`
代表Dinky版本号
-
`flink1.15`
代表Flink版本号,即默认提供了flink1.15的相关默认依赖,你任然可以替换
`plugins、lib、jar`
挂载点的相关依赖包,使之支持Flink其他版本,如:flink:1.15-scala_2.12.15
:::
:::tip Dinky与Flink:
-
此镜像仓库只是让你部署起了 Dinky 开发平台,因此你任然还需部署 Flink 集群
-
Flink集群部署参考
[
Flink官方文档
](
https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/deployment/resource-providers/standalone/docker/
)
:::
docs/versioned_docs/version-0.6/data_integration_guide/cdcsource_statements.md
View file @
0c77ee42
...
...
@@ -17,7 +17,7 @@ Dinky 定义了 CDCSOURCE 整库同步的语法,该语法和 CDAS 作用相似

面对建立的数据库连接过多,Binlog 重复读取会造成源库的巨大压力,上文分享采用了 source 合并的优化,尝试合并同一作业中的 source,如果都是读的同一数据源,则会被合并成一个 source 节点。
面对建立的数据库连接过多,Binlog 重复读取会造成源库的巨大压力,上文分享采用了 source 合并的优化,尝试合并同一作业中的 source,如果都是读的同一数据源,则会被合并成一个 source 节点。
Dinky 采用的是只构建一个 source,然后根据 schema、database、table 进行分流处理,分别 sink 到对应的表。
...
...
@@ -37,6 +37,26 @@ Dinky 提供了各式各样的 sink 方式,通过修改语句参数可以实
CDCSOURCE 语句用于将上游指定数据库的所有表的数据采用一个任务同步到下游系统。
:::warning
**Yarn Session**
,
**Standalone**
模式下 注意事项
在
**Yarn Session**
,
**Standalone**
模式下,使用整库同步需要将 dlink 的一些依赖放入 Flink/lib 下, 依赖如下:
1.
jar/dlink-client-base-${version}.jar
2.
jar/dlink-common-${version}.jar
3.
lib/dlink-client-${version}.jar
注意: 放入 Flink/lib 下后需要重启 Flink 集群
:::
:::warning
**Pre Job**
,
**Application**
模式下 注意事项
在
**Pre Job**
,
**Application**
模式下,使用整库同步需要将 dlink 的一些依赖放入 HDFS, 依赖如下:
1.
jar/dlink-client-base-${version}.jar
2.
jar/dlink-common-${version}.jar
3.
lib/dlink-client-${version}.jar
:::
### 语法结构
```
sql
...
...
docs/yarn.lock
deleted
100644 → 0
View file @
d8c2e776
This diff is collapsed.
Click to expand it.
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