Commit a72ca192 authored by baesangjune's avatar baesangjune
Browse files

.

parent c39773d6
[{"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\index.js":"1","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Search.js":"2","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\reportWebVitals.js":"3","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\App.js":"4","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Components\\Paginations.js":"5","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Components\\Place.js":"6"},{"size":1121,"mtime":1610344056379,"results":"7","hashOfConfig":"8"},{"size":38265,"mtime":1610344140960,"results":"9","hashOfConfig":"8"},{"size":375,"mtime":1609072355927,"results":"10","hashOfConfig":"8"},{"size":1547,"mtime":1610343834004,"results":"11","hashOfConfig":"8"},{"size":2199,"mtime":1610343833899,"results":"12","hashOfConfig":"8"},{"size":5323,"mtime":1610344084268,"results":"13","hashOfConfig":"8"},{"filePath":"14","messages":"15","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"zqc0qw",{"filePath":"16","messages":"17","errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18","messages":"19","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20","messages":"21","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22","messages":"23","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24","messages":"25","errorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\index.js",[],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Search.js",["26","27","28"],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\reportWebVitals.js",[],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\App.js",["29","30"],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Components\\Paginations.js",[],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Components\\Place.js",["31","32","33","34","35","36"],{"ruleId":"37","severity":1,"message":"38","line":5,"column":83,"nodeType":"39","messageId":"40","endLine":5,"endColumn":93},{"ruleId":"37","severity":1,"message":"41","line":14,"column":12,"nodeType":"39","messageId":"40","endLine":14,"endColumn":18},{"ruleId":"42","severity":1,"message":"43","line":457,"column":35,"nodeType":"44","endLine":457,"endColumn":76},{"ruleId":"37","severity":1,"message":"45","line":1,"column":17,"nodeType":"39","messageId":"40","endLine":1,"endColumn":26},{"ruleId":"37","severity":1,"message":"46","line":2,"column":10,"nodeType":"39","messageId":"40","endLine":2,"endColumn":14},{"ruleId":"37","severity":1,"message":"47","line":3,"column":33,"nodeType":"39","messageId":"40","endLine":3,"endColumn":36},{"ruleId":"37","severity":1,"message":"48","line":3,"column":46,"nodeType":"39","messageId":"40","endLine":3,"endColumn":51},{"ruleId":"37","severity":1,"message":"49","line":3,"column":53,"nodeType":"39","messageId":"40","endLine":3,"endColumn":57},{"ruleId":"37","severity":1,"message":"50","line":3,"column":59,"nodeType":"39","messageId":"40","endLine":3,"endColumn":68},{"ruleId":"37","severity":1,"message":"51","line":3,"column":70,"nodeType":"39","messageId":"40","endLine":3,"endColumn":78},{"ruleId":"52","severity":1,"message":"53","line":19,"column":6,"nodeType":"54","endLine":19,"endColumn":8,"suggestions":"55"},"no-unused-vars","'Pagination' is defined but never used.","Identifier","unusedVar","'mobile' is assigned a value but never used.","react/jsx-no-duplicate-props","No duplicate props allowed","JSXAttribute","'useEffect' is defined but never used.","'Link' is defined but never used.","'Col' is defined but never used.","'Badge' is defined but never used.","'Card' is defined but never used.","'Accordion' is defined but never used.","'Carousel' is defined but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'getReview'. Either include it or remove the dependency array.","ArrayExpression",["56"],{"desc":"57","fix":"58"},"Update the dependencies array to be: [getReview]",{"range":"59","text":"60"},[511,513],"[getReview]"] [{"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\index.js":"1","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Search.js":"2","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\reportWebVitals.js":"3","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\App.js":"4","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Components\\Paginations.js":"5","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Components\\Place.js":"6"},{"size":1121,"mtime":1610344056379,"results":"7","hashOfConfig":"8"},{"size":38273,"mtime":1610349309430,"results":"9","hashOfConfig":"8"},{"size":375,"mtime":1609072355927,"results":"10","hashOfConfig":"8"},{"size":1547,"mtime":1610343834004,"results":"11","hashOfConfig":"8"},{"size":2199,"mtime":1610343833899,"results":"12","hashOfConfig":"8"},{"size":5323,"mtime":1610344084268,"results":"13","hashOfConfig":"8"},{"filePath":"14","messages":"15","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"16"},"zqc0qw",{"filePath":"17","messages":"18","errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19","messages":"20","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"16"},{"filePath":"21","messages":"22","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"23","usedDeprecatedRules":"16"},{"filePath":"24","messages":"25","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"16"},{"filePath":"26","messages":"27","errorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"28","usedDeprecatedRules":"16"},"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\index.js",[],["29","30"],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Search.js",["31","32","33"],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\reportWebVitals.js",[],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\App.js",["34","35"],"import React, { useEffect, useState } from 'react';\r\nimport { Link, Redirect } from 'react-router-dom';\r\nimport ohuh from './ohuh.PNG';\r\nimport { Container, Row, Form, Image, InputGroup, Button, Col } from 'react-bootstrap';\r\n\r\nfunction App() {\r\n const [state, setState] = useState(false);\r\n const [search, setSearch] = useState(\"\");\r\n\r\n if (state !== false) {\r\n return <Redirect to={{\r\n pathname: `/search/${search}`,\r\n state: { id: search },\r\n }} />;\r\n }\r\n\r\n const handleChange = (e) => {\r\n setSearch(e.target.value);\r\n }\r\n\r\n const handleSubmit = () => {\r\n setState(true);\r\n }\r\n\r\n\r\n\r\n return (\r\n <Container className=\"vh-100 d-flex justify-content-md-center align-items-center\">\r\n <Col md={6} lassName=\" d-flex justify-content-center\">\r\n <Row style={{marginBottom:20}}>\r\n <Image src={ohuh} />\r\n </Row>\r\n\r\n <Row style={{marginBottom:500}}>\r\n <Form className=\"vw-100\" onSubmit={handleSubmit}>\r\n <InputGroup>\r\n <Form.Control\r\n size=\"lg\"\r\n placeholder=\"검색어를 입력하세요.\"\r\n aria-label=\"Large\"\r\n aria-describedby=\"inputGroup-sizing-sm\"\r\n onChange={handleChange}\r\n />\r\n <InputGroup.Append>\r\n <Button type='submit' variant=\"outline-secondary\">검색</Button>\r\n </InputGroup.Append>\r\n </InputGroup>\r\n </Form>\r\n </Row>\r\n </Col>\r\n\r\n </Container>\r\n );\r\n}\r\n\r\nexport default App;","C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Components\\Paginations.js",[],"C:\\Users\\Korea\\Desktop\\2020winter\\search-page\\client\\src\\Components\\Place.js",["36","37","38","39","40","41"],"import axios from 'axios';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Modal, Container, Row, Col, Button, Badge, Card, Accordion, Carousel } from 'react-bootstrap';\r\n\r\nfunction Place(props) {\r\n const [reviews, setReviews] = useState([])\r\n const getReview = () => {\r\n axios.get(`/api/review/${props.search.name}`)\r\n .then(res => {\r\n setReviews(res.data)\r\n })\r\n .catch(err => {\r\n console.log(err)\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n getReview();\r\n }, [])\r\n\r\n\r\n return (\r\n <Modal {...props}\r\n size=\"xl\"\r\n keyboard=\"true\"\r\n variant=\"backdrop.in\"\r\n // show={lgShow}\r\n // onHide={() => setLgShow(false)}\r\n aria-labelledby=\"example-modal-sizes-title-lg\">\r\n <Modal.Header closeButton>\r\n <Modal.Title id=\"contained-modal-title-vcenter\" style={{ fontSize: '40px' }}>\r\n {props.index + 1}. {props.search.name}\r\n </Modal.Title>\r\n </Modal.Header>\r\n <Modal.Body className=\"show-grid\">\r\n <Container style={{ fontSize: '40px' }}>\r\n {reviews.map((review, index) => {\r\n return (\r\n <Row className=\"mt-4\">\r\n <a href={review.link}>{review.title}</a>\r\n <div>{review.summary}</div>\r\n </Row>\r\n )\r\n })}\r\n </Container>\r\n\r\n {/* <Accordion defaultActiveKey=\"0\">\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"0\">\r\n <a className=\"mb-2\">다음의 블로그 보기</a>\r\n </Accordion.Toggle>\r\n <Accordion.Collapse eventKey=\"0\">\r\n <Card.Body><div>주도 전역을 지배하는 한라산은 남한에서 가장 높은 산으로 높이는 1,947.3m이다. 한라산이라는 이름은 산이 높아 산정에 서면 은하수를 잡아당길 수 있다는 뜻이며, 부악·원산·선산·두무악·영주산·부라산·혈망봉·여장군 등으로도 불려왔다.</div></Card.Body>\r\n </Accordion.Collapse>\r\n <Row>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"1\">\r\n <a className=\"mb-2\">네이버의 블로그 보기</a>\r\n </Accordion.Toggle>\r\n <Accordion.Collapse eventKey=\"1\">\r\n <Card.Body><div>한라산은 1966년 한라산 천연보호구역으로, 1970년 국립공원으로 지정되었다. 그리고 2002년에는 유네스코 생물권보전지역으로 지정되었으며 2007년에는 유네스코 세계자연유산으로 등재되었다. 2008년에는 물장오리오름 산정화구호 습지가 람사르 습지로 등록되어 보호 관리되고 있다</div></Card.Body>\r\n </Accordion.Collapse>\r\n </Row>\r\n <Row>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"2\">\r\n <a className=\"mb-2\">구글의 블로그 보기</a>\r\n </Accordion.Toggle>\r\n <Accordion.Collapse eventKey=\"2\">\r\n <Card.Body><div>한라산은 제주도에 있는 해발 1,947.06m, 면적 약 1,820km²의 화산으로, 제주도의 면적 대부분을 차지하고 있다. 정상에 백록담이라는 화산호가 있는데, 백록담이라는 이름은 흰 사슴이 물을 먹는 곳이라는 뜻에서 왔다고 전해진다.</div></Card.Body>\r\n </Accordion.Collapse>\r\n </Row>\r\n </Accordion>\r\n <Row style={{ color: 'white' }}>\r\n <a href=\"https://www.daum.net/\" className=\"mb-2\">다음</a><a href=\"https://www.naver.com/\" className=\"mb-2\">네이버</a><a href=\"https://www.google.com/\" className=\"mb-2\">구글</a>\r\n </Row>\r\n // </Container>\r\n <Carousel>\r\n <Carousel.Item interval={1000}>\r\n <h3>다음 블로그</h3>\r\n <div>주도 전역을 지배하는 한라산은 남한에서 가장 높은 산으로 높이는 1,947.3m이다. 한라산이라는 이름은 산이 높아 산정에 서면 은하수를 잡아당길 수 있다는 뜻이며, 부악·원산·선산·두무악·영주산·부라산·혈망봉·여장군 등으로도 불려왔다.</div>\r\n </Carousel.Item>\r\n <Carousel.Item interval={1000}>\r\n <h3>네이버 블로그</h3>\r\n <div>한라산은 1966년 한라산 천연보호구역으로, 1970년 국립공원으로 지정되었다. 그리고 2002년에는 유네스코 생물권보전지역으로 지정되었으며 2007년에는 유네스코 세계자연유산으로 등재되었다. 2008년에는 물장오리오름 산정화구호 습지가 람사르 습지로 등록되어 보호 관리되고 있다</div>\r\n </Carousel.Item>\r\n <Carousel.Item interval={1000}>\r\n <h3>구글 블로그</h3>\r\n <div>한라산은 제주도에 있는 해발 1,947.06m, 면적 약 1,820km²의 화산으로, 제주도의 면적 대부분을 차지하고 있다. 정상에 백록담이라는 화산호가 있는데, 백록담이라는 이름은 흰 사슴이 물을 먹는 곳이라는 뜻에서 왔다고 전해진다.</div>\r\n </Carousel.Item>\r\n </Carousel> */}\r\n </Modal.Body>\r\n <Modal.Footer>\r\n <Button block onClick={props.onHide}>Close</Button>\r\n </Modal.Footer>\r\n </Modal>\r\n );\r\n}\r\n\r\nexport default Place;\r\n",{"ruleId":"42","replacedBy":"43"},{"ruleId":"44","replacedBy":"45"},{"ruleId":"46","severity":1,"message":"47","line":5,"column":83,"nodeType":"48","messageId":"49","endLine":5,"endColumn":93},{"ruleId":"46","severity":1,"message":"50","line":14,"column":12,"nodeType":"48","messageId":"49","endLine":14,"endColumn":18},{"ruleId":"51","severity":1,"message":"52","line":457,"column":35,"nodeType":"53","endLine":457,"endColumn":76},{"ruleId":"46","severity":1,"message":"54","line":1,"column":17,"nodeType":"48","messageId":"49","endLine":1,"endColumn":26},{"ruleId":"46","severity":1,"message":"55","line":2,"column":10,"nodeType":"48","messageId":"49","endLine":2,"endColumn":14},{"ruleId":"46","severity":1,"message":"56","line":3,"column":33,"nodeType":"48","messageId":"49","endLine":3,"endColumn":36},{"ruleId":"46","severity":1,"message":"57","line":3,"column":46,"nodeType":"48","messageId":"49","endLine":3,"endColumn":51},{"ruleId":"46","severity":1,"message":"58","line":3,"column":53,"nodeType":"48","messageId":"49","endLine":3,"endColumn":57},{"ruleId":"46","severity":1,"message":"59","line":3,"column":59,"nodeType":"48","messageId":"49","endLine":3,"endColumn":68},{"ruleId":"46","severity":1,"message":"60","line":3,"column":70,"nodeType":"48","messageId":"49","endLine":3,"endColumn":78},{"ruleId":"61","severity":1,"message":"62","line":19,"column":6,"nodeType":"63","endLine":19,"endColumn":8,"suggestions":"64"},"no-native-reassign",["65"],"no-negated-in-lhs",["66"],"no-unused-vars","'Pagination' is defined but never used.","Identifier","unusedVar","'mobile' is assigned a value but never used.","react/jsx-no-duplicate-props","No duplicate props allowed","JSXAttribute","'useEffect' is defined but never used.","'Link' is defined but never used.","'Col' is defined but never used.","'Badge' is defined but never used.","'Card' is defined but never used.","'Accordion' is defined but never used.","'Carousel' is defined but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'getReview'. Either include it or remove the dependency array.","ArrayExpression",["67"],"no-global-assign","no-unsafe-negation",{"desc":"68","fix":"69"},"Update the dependencies array to be: [getReview]",{"range":"70","text":"71"},[511,513],"[getReview]"]
\ No newline at end of file \ No newline at end of file
[0111/154710.316:ERROR:directory_reader_win.cc(43)] FindFirstFile: 지정된 경로를 찾을 수 없습니다. (0x3)
...@@ -39,5 +39,5 @@ ...@@ -39,5 +39,5 @@
"last 1 safari version" "last 1 safari version"
] ]
}, },
"proxy":"http://localhost:3001" "proxy": "http://localhost:3001"
} }
...@@ -492,7 +492,7 @@ function Search(props) { ...@@ -492,7 +492,7 @@ function Search(props) {
) )
})} })}
</Row> </Row>
{console.log(showSet)} {/* {console.log(showSet)} */}
{/* show가 전부 true로 바뀌어서 전부 다 보이게 되는 것이다. */} {/* show가 전부 true로 바뀌어서 전부 다 보이게 되는 것이다. */}
<Row className="mt-2 d-flex justify-content-center"> <Row className="mt-2 d-flex justify-content-center">
<Paginations index={index} endPage={endPage} handlePage={handlePage}></Paginations> <Paginations index={index} endPage={endPage} handlePage={handlePage}></Paginations>
......
This diff is collapsed.
This diff is collapsed.
...@@ -8,14 +8,20 @@ ...@@ -8,14 +8,20 @@
"axios": "^0.21.1", "axios": "^0.21.1",
"bootstrap": "^4.5.3", "bootstrap": "^4.5.3",
"cheerio": "^1.0.0-rc.5", "cheerio": "^1.0.0-rc.5",
"esm": "^3.2.25",
"express": "^4.17.1", "express": "^4.17.1",
"iconv-lite": "^0.6.2",
"jschardet": "^2.2.1",
"mongoose": "^5.11.11",
"node-gyp": "^7.1.2",
"nodemon": "^2.0.6", "nodemon": "^2.0.6",
"react-bootstrap": "^1.4.0", "react-bootstrap": "^1.4.0",
"request": "^2.88.2" "request": "^2.88.2",
"request-promise": "^4.2.6"
}, },
"devDependencies": {}, "devDependencies": {},
"scripts": { "scripts": {
"dev": "nodemon server/scraper.js", "dev": "nodemon server/server.js",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"repository": { "repository": {
......
...@@ -3,24 +3,25 @@ import cheerio from "cheerio"; ...@@ -3,24 +3,25 @@ import cheerio from "cheerio";
import express from 'express'; import express from 'express';
import request from 'request-promise' import request from 'request-promise'
import jschardet from 'jschardet' import jschardet from 'jschardet'
import iconv from 'iconv' // import iconv from 'iconv'
import fs from 'fs' import fs from 'fs'
const Iconv = iconv.Iconv import axios from 'axios';
import { CLIENT_RENEG_LIMIT } from 'tls';
// const Iconv = iconv.Iconv
const signup = async (req, res) => { const signup = async (req, res) => {
res.send("안녕하세요") res.send("안녕하세요")
} }
const search = async (req, res) => { const search = async (req, res) => {
console.log(req.params.search) // console.log(req.params.search)
console.log("req", req) // console.log("req", req)
const url = "https://www.google.com/search?q=%ED%95%9C%EB%9D%BC%EC%82%B0%20site%3Atistory.com&oq=tistory&aqs=chrome..69i57j0l4j69i60l3.1746j0j4&sourceid=chrome&ie=UTF-8&ved=2ahUKEwis_bSFz4buAhWVdXAKHU0tBaoQ2wF6BAgIEAE&ei=T1D1X-yZD5XrwQPN2pTQCg" // const url = "https://www.google.com/search?q=%ED%95%9C%EB%9D%BC%EC%82%B0%20site%3Atistory.com&oq=tistory&aqs=chrome..69i57j0l4j69i60l3.1746j0j4&sourceid=chrome&ie=UTF-8&ved=2ahUKEwis_bSFz4buAhWVdXAKHU0tBaoQ2wF6BAgIEAE&ei=T1D1X-yZD5XrwQPN2pTQCg"
const url = "https://www.google.com/search?q=%ED%95%9C%EB%9D%BC%EC%82%B0%20site%3Atistory.com"
request(url)
.then(anyToUtf8)
.then((html) => {
// fs.writeFileSync("googlez.txt", '\ufeff' + html, { encoding: 'utf8' });
axios.get(url).then(html => {
// console.log(response.data)
fs.writeFile('google.txt', html.data, 'utf8', (err) => console.log(err))
let $ = cheerio.load(html, null, false); let $ = cheerio.load(html, null, false);
let places = [] let places = []
$('.kCrYT').each(function (i) { $('.kCrYT').each(function (i) {
...@@ -33,12 +34,29 @@ const search = async (req, res) => { ...@@ -33,12 +34,29 @@ const search = async (req, res) => {
// console.log(places) // console.log(places)
res.send(places) res.send(places)
}) })
function anyToUtf8(str) { // request(url)
const { encoding } = jschardet.detect(str); // // .then(anyToUtf8)
console.log("source encoding = " + encoding); // .then((html) => {
const iconv = new Iconv(encoding, "utf-8//translit//ignore"); // // fs.writeFileSync("googlez.txt", '\ufeff' + html, { encoding: 'utf8' });
return iconv.convert(str).toString();
} // let $ = cheerio.load(html, null, false);
// let places = []
// $('.kCrYT').each(function (i) {
// places[i] = {
// title: $(this).find('h3').text(),
// link: $(this).find('a').attr('href'),
// summary: $(this).find('.s3v9rd ').text(),
// }
// })
// // console.log(places)
// res.send(places)
// })
// function anyToUtf8(str) {
// const { encoding } = jschardet.detect(str);
// console.log("source encoding = " + encoding);
// const iconv = new Iconv(encoding, "utf-8//translit//ignore");
// return iconv.convert(str).toString();
// }
// try { // try {
......
import express from 'express' import express from 'express'
import connectDb from './utils/connectDb.js' import connectDb from './utils/connectDb.js'
import placeRouter from './routes/place.routes.js' // import placeRouter from './routes/place.routes.js'
import reviewRouter from './routes/review.routes.js' import reviewRouter from './routes/review.routes.js'
connectDb() connectDb()
...@@ -9,7 +9,7 @@ const app = express() ...@@ -9,7 +9,7 @@ const app = express()
app.use(express.json()) app.use(express.json())
app.use(placeRouter) // app.use(placeRouter)
app.use(reviewRouter) app.use(reviewRouter)
app.get('/', (req, res) => { app.get('/', (req, res) => {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment