Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
O
opening-hours
Project
Project
Details
Activity
Releases
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
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
regionalkauf
opening-hours
Commits
ac7d743e
Commit
ac7d743e
authored
Nov 05, 2014
by
Johannes Bill
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed error with mo-mo
parent
f14c708e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
42 additions
and
38 deletions
+42
-38
dateArray.js
lib/dateArray.js
+1
-1
timeUtils.js
lib/timeUtils.js
+40
-36
dataBaseQuery.js
serverTest/dataBaseQuery.js
+1
-1
No files found.
lib/dateArray.js
View file @
ac7d743e
...
@@ -137,7 +137,7 @@ function wrapper(_epochSpan) {
...
@@ -137,7 +137,7 @@ function wrapper(_epochSpan) {
case
7
:
case
7
:
return
[
0
,
0
];
return
[
0
,
0
];
case
8
:
case
8
:
return
[
0
,
7
];
return
[
1
,
7
];
case
9
:
case
9
:
return
[
1
,
5
];
return
[
1
,
5
];
case
10
:
case
10
:
...
...
lib/timeUtils.js
View file @
ac7d743e
...
@@ -3,14 +3,14 @@ var assert = require('assert');
...
@@ -3,14 +3,14 @@ var assert = require('assert');
function
compareTimeSpan
(
timeSpan
)
{
function
compareTimeSpan
(
timeSpan
)
{
var
from
=
timeSpan
[
0
];
var
from
=
timeSpan
[
0
];
var
till
=
timeSpan
[
1
];
var
till
=
timeSpan
[
1
];
if
(
from
.
h
==
till
.
h
)
if
(
from
.
h
==
till
.
h
)
return
from
.
m
-
till
.
m
;
return
from
.
m
-
till
.
m
;
else
else
return
from
.
h
-
till
.
h
return
from
.
h
-
till
.
h
}
}
function
transformTimeSpan
(
timeSpan
)
{
function
transformTimeSpan
(
timeSpan
)
{
if
(
compareTimeSpan
(
timeSpan
)
>=
0
)
{
if
(
compareTimeSpan
(
timeSpan
)
>=
0
)
{
timeSpan
[
1
].
h
+=
24
;
timeSpan
[
1
].
h
+=
24
;
}
}
return
timeSpan
;
return
timeSpan
;
...
@@ -26,12 +26,12 @@ function transformTimeSpan(timeSpan) {
...
@@ -26,12 +26,12 @@ function transformTimeSpan(timeSpan) {
//}
//}
function
_cyclicInterval
(
from
,
until
,
distanceDays
,
epochStart
,
epochEnd
)
{
function
_cyclicInterval
(
from
,
until
,
distanceDays
,
epochStart
,
epochEnd
)
{
if
(
from
.
getTime
()
>=
until
.
getTime
())
throw
new
Error
(
"startDate cant be greater than endDate"
);
if
(
from
.
getTime
()
>=
until
.
getTime
())
throw
new
Error
(
"startDate cant be greater than endDate"
);
var
resultArray
=
[];
var
resultArray
=
[];
from
=
new
Date
(
from
);
from
=
new
Date
(
from
);
until
=
new
Date
(
until
);
until
=
new
Date
(
until
);
while
(
until
.
getTime
()
<=
epochEnd
.
getTime
())
{
while
(
until
.
getTime
()
<=
epochEnd
.
getTime
())
{
resultArray
.
push
([
new
Date
(
from
),
new
Date
(
until
)]);
resultArray
.
push
([
new
Date
(
from
),
new
Date
(
until
)]);
from
.
setDate
(
from
.
getDate
()
+
distanceDays
);
from
.
setDate
(
from
.
getDate
()
+
distanceDays
);
until
.
setDate
(
until
.
getDate
()
+
distanceDays
);
until
.
setDate
(
until
.
getDate
()
+
distanceDays
);
...
@@ -41,18 +41,21 @@ function _cyclicInterval(from, until, distanceDays, epochStart, epochEnd) {
...
@@ -41,18 +41,21 @@ function _cyclicInterval(from, until, distanceDays, epochStart, epochEnd) {
function
_standard
(
day
,
timeFrom
,
timeUntil
,
startDate
,
endDate
,
distanceDays
)
{
function
_standard
(
day
,
timeFrom
,
timeUntil
,
startDate
,
endDate
,
distanceDays
)
{
var
dayDiff
=
day
-
startDate
.
getDay
();
var
dayDiff
=
day
-
startDate
.
getDay
();
if
(
dayDiff
<
0
)
if
(
dayDiff
>
0
)
dayDiff
-=
7
;
dayDiff
+=
7
;
var
date0
=
new
Date
(
startDate
.
getFullYear
(),
startDate
.
getMonth
(),
var
date0
=
new
Date
(
startDate
.
getFullYear
(),
startDate
.
getMonth
(),
startDate
.
getDate
()
+
dayDiff
,
timeFrom
.
h
,
timeFrom
.
m
);
startDate
.
getDate
()
+
dayDiff
,
timeFrom
.
h
,
timeFrom
.
m
);
var
date1
=
new
Date
(
startDate
.
getFullYear
(),
startDate
.
getMonth
(),
var
date1
=
new
Date
(
startDate
.
getFullYear
(),
startDate
.
getMonth
(),
startDate
.
getDate
()
+
dayDiff
,
timeUntil
.
h
,
timeUntil
.
m
);
startDate
.
getDate
()
+
dayDiff
,
timeUntil
.
h
,
timeUntil
.
m
);
return
_cyclicInterval
(
date0
,
date1
,
distanceDays
,
startDate
,
endDate
);
return
_cyclicInterval
(
date0
,
date1
,
distanceDays
,
startDate
,
endDate
);
}
}
function
standardFromTillDay
(
daySpan
,
timeSpan
,
dateSpan
,
epochSpan
,
daysDistance
)
{
function
standardFromTillDay
(
daySpan
,
timeSpan
,
dateSpan
,
epochSpan
,
daysDistance
)
{
if
(
dateSpan
[
0
]
>
epochSpan
[
1
]
||
dateSpan
[
1
]
<
epochSpan
[
0
])
{
return
[];
}
timeSpan
=
transformTimeSpan
(
timeSpan
);
timeSpan
=
transformTimeSpan
(
timeSpan
);
var
dayFrom
=
daySpan
[
0
];
var
dayFrom
=
daySpan
[
0
];
var
dayTo
=
daySpan
[
1
];
var
dayTo
=
daySpan
[
1
];
...
@@ -63,23 +66,24 @@ function standardFromTillDay(daySpan, timeSpan, dateSpan, epochSpan, daysDistanc
...
@@ -63,23 +66,24 @@ function standardFromTillDay(daySpan, timeSpan, dateSpan, epochSpan, daysDistanc
var
firstDays
=
_standard
(
dayFrom
,
timeFrom
,
timeUntil
,
epochStart
,
epochEnd
,
daysDistance
);
var
firstDays
=
_standard
(
dayFrom
,
timeFrom
,
timeUntil
,
epochStart
,
epochEnd
,
daysDistance
);
var
result
=
firstDays
.
slice
();
var
result
=
firstDays
.
slice
();
for
(
var
offset
=
1
;
offset
<=
dayTo
-
dayFrom
;
offset
++
)
{
for
(
var
offset
=
1
;
offset
<=
dayTo
-
dayFrom
;
offset
++
)
{
for
(
var
i
=
0
;
i
<
firstDays
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
firstDays
.
length
;
i
++
)
{
var
start
=
new
Date
(
firstDays
[
i
][
0
]);
var
start
=
new
Date
(
firstDays
[
i
][
0
]);
var
end
=
new
Date
(
firstDays
[
i
][
1
]);
var
end
=
new
Date
(
firstDays
[
i
][
1
]);
start
.
setDate
(
start
.
getDate
()
+
offset
);
start
.
setDate
(
start
.
getDate
()
+
offset
);
end
.
setDate
(
end
.
getDate
()
+
offset
);
end
.
setDate
(
end
.
getDate
()
+
offset
);
if
(
end
.
getTime
()
<=
epochEnd
.
getTime
())
if
(
end
.
getTime
()
<=
epochEnd
.
getTime
())
result
.
push
([
start
,
end
]);
result
.
push
([
start
,
end
]);
}
}
}
}
result
=
sort
(
result
);
result
=
sort
(
result
);
result
=
andOp
(
result
,
[
dateSpan
]);
result
=
andOp
(
result
,
[
epochSpan
]);
result
=
andOp
(
result
,
[
epochSpan
]);
return
result
;
return
result
;
}
}
function
cyclicFromTillDay
(
daySpan
,
noInMonth
,
timeSpan
,
dateSpan
,
epochSpan
)
{
function
cyclicFromTillDay
(
daySpan
,
noInMonth
,
timeSpan
,
dateSpan
,
epochSpan
)
{
if
(
!
epochSpan
)
if
(
!
epochSpan
)
epochSpan
=
dateSpan
;
epochSpan
=
dateSpan
;
timeSpan
=
transformTimeSpan
(
timeSpan
);
timeSpan
=
transformTimeSpan
(
timeSpan
);
...
@@ -91,8 +95,8 @@ function cyclicFromTillDay(daySpan, noInMonth, timeSpan, dateSpan, epochSpan) {
...
@@ -91,8 +95,8 @@ function cyclicFromTillDay(daySpan, noInMonth, timeSpan, dateSpan, epochSpan) {
var
endDate
=
dateSpan
[
1
];
var
endDate
=
dateSpan
[
1
];
//limit dateSpan to epochSpan, to reduce costs
//limit dateSpan to epochSpan, to reduce costs
if
(
endDate
.
getTime
()
>
epochSpan
[
1
].
getTime
())
endDate
=
epochSpan
[
1
];
if
(
endDate
.
getTime
()
>
epochSpan
[
1
].
getTime
())
endDate
=
epochSpan
[
1
];
if
(
startDate
.
getTime
()
<
epochSpan
[
0
].
getTime
())
{
if
(
startDate
.
getTime
()
<
epochSpan
[
0
].
getTime
())
{
var
t
=
epochSpan
[
0
];
var
t
=
epochSpan
[
0
];
//substract 1 month to cover special cases
//substract 1 month to cover special cases
startDate
=
new
Date
(
t
.
getFullYear
(),
t
.
getMonth
()
-
1
,
t
.
getDate
())
startDate
=
new
Date
(
t
.
getFullYear
(),
t
.
getMonth
()
-
1
,
t
.
getDate
())
...
@@ -101,25 +105,25 @@ function cyclicFromTillDay(daySpan, noInMonth, timeSpan, dateSpan, epochSpan) {
...
@@ -101,25 +105,25 @@ function cyclicFromTillDay(daySpan, noInMonth, timeSpan, dateSpan, epochSpan) {
var
result
=
[];
var
result
=
[];
startDate
=
new
Date
(
startDate
);
startDate
=
new
Date
(
startDate
);
while
(
true
)
{
while
(
true
)
{
var
date0
=
_getNextNoInMonthOccurence
(
dayFrom
,
startDate
,
noInMonth
);
var
date0
=
_getNextNoInMonthOccurence
(
dayFrom
,
startDate
,
noInMonth
);
date0
.
setHours
(
timeFrom
.
h
);
date0
.
setHours
(
timeFrom
.
h
);
date0
.
setMinutes
(
timeFrom
.
m
);
date0
.
setMinutes
(
timeFrom
.
m
);
var
date1
=
new
Date
(
date0
);
var
date1
=
new
Date
(
date0
);
date1
.
setHours
(
timeUntil
.
h
);
date1
.
setHours
(
timeUntil
.
h
);
date1
.
setMinutes
(
timeUntil
.
m
);
date1
.
setMinutes
(
timeUntil
.
m
);
if
(
date1
.
getTime
()
>
endDate
.
getTime
())
if
(
date1
.
getTime
()
>
endDate
.
getTime
())
break
;
break
;
else
{
else
{
result
.
push
([
date0
,
date1
]);
result
.
push
([
date0
,
date1
]);
startDate
=
new
Date
(
date1
);
startDate
=
new
Date
(
date1
);
startDate
.
setDate
(
startDate
.
getDate
()
+
1
);
startDate
.
setDate
(
startDate
.
getDate
()
+
1
);
for
(
var
offset
=
1
;
offset
<=
dayTo
-
dayFrom
;
offset
++
)
{
for
(
var
offset
=
1
;
offset
<=
dayTo
-
dayFrom
;
offset
++
)
{
date0
=
new
Date
(
date0
);
date0
=
new
Date
(
date0
);
date1
=
new
Date
(
date1
);
date1
=
new
Date
(
date1
);
date0
.
setDate
(
date0
.
getDate
()
+
1
);
date0
.
setDate
(
date0
.
getDate
()
+
1
);
date1
.
setDate
(
date1
.
getDate
()
+
1
);
date1
.
setDate
(
date1
.
getDate
()
+
1
);
if
(
date1
.
getTime
()
<=
endDate
.
getTime
())
if
(
date1
.
getTime
()
<=
endDate
.
getTime
())
result
.
push
([
date0
,
date1
]);
result
.
push
([
date0
,
date1
]);
else
break
;
else
break
;
}
}
...
@@ -134,7 +138,7 @@ function _getNextNoInMonthOccurence(day, startDate, noInMonth) {
...
@@ -134,7 +138,7 @@ function _getNextNoInMonthOccurence(day, startDate, noInMonth) {
startDate
=
new
Date
(
startDate
);
startDate
=
new
Date
(
startDate
);
var
_noInMonth
;
var
_noInMonth
;
if
(
noInMonth
==
-
1
)
{
if
(
noInMonth
==
-
1
)
{
_noInMonth
=
1
;
_noInMonth
=
1
;
startDate
.
setDate
(
startDate
.
getDate
()
+
7
);
startDate
.
setDate
(
startDate
.
getDate
()
+
7
);
}
}
...
@@ -143,16 +147,16 @@ function _getNextNoInMonthOccurence(day, startDate, noInMonth) {
...
@@ -143,16 +147,16 @@ function _getNextNoInMonthOccurence(day, startDate, noInMonth) {
}
}
var
dayDiff
=
day
-
startDate
.
getDay
();
var
dayDiff
=
day
-
startDate
.
getDay
();
if
(
dayDiff
<
0
)
dayDiff
+=
7
;
if
(
dayDiff
<
0
)
dayDiff
+=
7
;
startDate
.
setDate
(
startDate
.
getDate
()
+
dayDiff
);
startDate
.
setDate
(
startDate
.
getDate
()
+
dayDiff
);
var
currentNoInMonth
=
Math
.
ceil
(
startDate
.
getDate
()
/
7
);
var
currentNoInMonth
=
Math
.
ceil
(
startDate
.
getDate
()
/
7
);
while
(
currentNoInMonth
!=
_noInMonth
)
{
while
(
currentNoInMonth
!=
_noInMonth
)
{
startDate
=
new
Date
(
startDate
.
getTime
()
+
7
*
24
*
3600000
);
startDate
=
new
Date
(
startDate
.
getTime
()
+
7
*
24
*
3600000
);
currentNoInMonth
=
Math
.
ceil
(
startDate
.
getDate
()
/
7
);
currentNoInMonth
=
Math
.
ceil
(
startDate
.
getDate
()
/
7
);
}
}
if
(
noInMonth
==
-
1
)
{
if
(
noInMonth
==
-
1
)
{
startDate
.
setDate
(
startDate
.
getDate
()
-
7
);
startDate
.
setDate
(
startDate
.
getDate
()
-
7
);
}
}
return
startDate
;
return
startDate
;
...
@@ -168,7 +172,7 @@ function _getNextNoInMonthOccurence(day, startDate, noInMonth) {
...
@@ -168,7 +172,7 @@ function _getNextNoInMonthOccurence(day, startDate, noInMonth) {
*/
*/
function
singleDay
(
date
,
timeSpan
)
{
function
singleDay
(
date
,
timeSpan
)
{
var
startDate
,
endDate
;
var
startDate
,
endDate
;
if
(
timeSpan
)
{
if
(
timeSpan
)
{
timeSpan
=
transformTimeSpan
(
timeSpan
);
timeSpan
=
transformTimeSpan
(
timeSpan
);
startDate
=
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
timeSpan
[
0
].
h
,
timeSpan
[
0
].
m
);
startDate
=
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
timeSpan
[
0
].
h
,
timeSpan
[
0
].
m
);
endDate
=
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
timeSpan
[
1
].
h
,
timeSpan
[
1
].
m
);
endDate
=
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
timeSpan
[
1
].
h
,
timeSpan
[
1
].
m
);
...
@@ -193,7 +197,7 @@ function dateSpan(dateSpan) {
...
@@ -193,7 +197,7 @@ function dateSpan(dateSpan) {
function
orOp
(
intervals
)
{
function
orOp
(
intervals
)
{
var
result
=
[];
var
result
=
[];
for
(
var
i
=
0
;
i
<
intervals
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
intervals
.
length
;
i
++
)
{
result
=
result
.
concat
(
intervals
[
i
]);
result
=
result
.
concat
(
intervals
[
i
]);
}
}
sort
(
result
);
sort
(
result
);
...
@@ -202,7 +206,7 @@ function orOp(intervals) {
...
@@ -202,7 +206,7 @@ function orOp(intervals) {
}
}
function
sort
(
intervals
)
{
function
sort
(
intervals
)
{
intervals
.
sort
(
function
(
a
,
b
)
{
intervals
.
sort
(
function
(
a
,
b
)
{
return
a
[
0
].
getTime
()
-
b
[
0
].
getTime
();
return
a
[
0
].
getTime
()
-
b
[
0
].
getTime
();
});
});
return
intervals
;
return
intervals
;
...
@@ -210,11 +214,11 @@ function sort(intervals) {
...
@@ -210,11 +214,11 @@ function sort(intervals) {
function
mergeOverlaps
(
interval
)
{
function
mergeOverlaps
(
interval
)
{
var
i
=
0
;
var
i
=
0
;
while
(
i
<
interval
.
length
-
1
)
{
while
(
i
<
interval
.
length
-
1
)
{
var
endFirst
=
interval
[
i
][
1
];
var
endFirst
=
interval
[
i
][
1
];
var
startSecond
=
interval
[
i
+
1
][
0
];
var
startSecond
=
interval
[
i
+
1
][
0
];
var
endSecond
=
interval
[
i
+
1
][
1
];
var
endSecond
=
interval
[
i
+
1
][
1
];
if
(
endFirst
.
getTime
()
>=
startSecond
.
getTime
())
{
if
(
endFirst
.
getTime
()
>=
startSecond
.
getTime
())
{
interval
.
splice
(
i
+
1
,
1
);
interval
.
splice
(
i
+
1
,
1
);
interval
[
i
][
1
]
=
new
Date
(
Math
.
max
(
endFirst
,
endSecond
));
interval
[
i
][
1
]
=
new
Date
(
Math
.
max
(
endFirst
,
endSecond
));
}
}
...
@@ -228,23 +232,23 @@ function andOp(interval1, interval2) {
...
@@ -228,23 +232,23 @@ function andOp(interval1, interval2) {
var
i
=
0
;
var
i
=
0
;
var
j
=
0
;
var
j
=
0
;
while
(
i
<
interval1
.
length
&&
j
<
interval2
.
length
)
{
while
(
i
<
interval1
.
length
&&
j
<
interval2
.
length
)
{
var
start1
=
interval1
[
i
][
0
];
var
start1
=
interval1
[
i
][
0
];
var
end1
=
interval1
[
i
][
1
];
var
end1
=
interval1
[
i
][
1
];
var
start2
=
interval2
[
j
][
0
];
var
start2
=
interval2
[
j
][
0
];
var
end2
=
interval2
[
j
][
1
];
var
end2
=
interval2
[
j
][
1
];
//no overlap
//no overlap
if
(
end2
.
getTime
()
<=
start1
.
getTime
())
if
(
end2
.
getTime
()
<=
start1
.
getTime
())
j
++
;
j
++
;
else
if
(
end1
.
getTime
()
<=
start2
.
getTime
())
else
if
(
end1
.
getTime
()
<=
start2
.
getTime
())
i
++
;
i
++
;
//overlap
//overlap
else
{
else
{
var
newStart
;
var
newStart
;
var
newEnd
;
var
newEnd
;
if
(
end2
.
getTime
()
<=
end1
.
getTime
())
{
if
(
end2
.
getTime
()
<=
end1
.
getTime
())
{
j
++
;
j
++
;
newEnd
=
end2
;
newEnd
=
end2
;
}
}
...
@@ -262,13 +266,13 @@ function andOp(interval1, interval2) {
...
@@ -262,13 +266,13 @@ function andOp(interval1, interval2) {
function
invert
(
interval
,
epochStart
,
epochEnd
)
{
function
invert
(
interval
,
epochStart
,
epochEnd
)
{
var
result
=
[];
var
result
=
[];
var
start
=
epochStart
;
var
start
=
epochStart
;
for
(
var
i
=
0
;
i
<
interval
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
interval
.
length
;
i
++
)
{
var
end
=
interval
[
i
][
0
];
var
end
=
interval
[
i
][
0
];
if
(
start
.
getTime
()
<
end
.
getTime
())
if
(
start
.
getTime
()
<
end
.
getTime
())
result
.
push
([
start
,
end
]);
result
.
push
([
start
,
end
]);
start
=
interval
[
i
][
1
];
start
=
interval
[
i
][
1
];
}
}
if
(
start
.
getTime
()
<
epochEnd
.
getTime
())
if
(
start
.
getTime
()
<
epochEnd
.
getTime
())
result
.
push
([
start
,
epochEnd
]);
result
.
push
([
start
,
epochEnd
]);
return
result
;
return
result
;
}
}
...
@@ -279,10 +283,10 @@ function invert(interval, epochStart, epochEnd) {
...
@@ -279,10 +283,10 @@ function invert(interval, epochStart, epochEnd) {
* @returns Array{dateInterval}
* @returns Array{dateInterval}
*/
*/
function
andNotOp
(
interval1
,
interval2
)
{
function
andNotOp
(
interval1
,
interval2
)
{
if
(
!
(
interval1
&&
interval1
[
0
]
&&
interval1
[
0
][
0
]))
{
if
(
!
(
interval1
&&
interval1
[
0
]
&&
interval1
[
0
][
0
]))
{
return
[];
return
[];
}
}
if
(
!
(
interval2
&&
interval2
[
0
]
&&
interval2
[
0
][
0
]))
{
if
(
!
(
interval2
&&
interval2
[
0
]
&&
interval2
[
0
][
0
]))
{
return
interval1
;
return
interval1
;
}
}
...
...
serverTest/dataBaseQuery.js
View file @
ac7d743e
...
@@ -19,7 +19,7 @@ module.exports.getData = function (now, cb) {
...
@@ -19,7 +19,7 @@ module.exports.getData = function (now, cb) {
// dateArray.setEpocheSpan(epocheSpan);
// dateArray.setEpocheSpan(epocheSpan);
// connection.query('SELECT name, elements FROM cms_zoo_item WHERE type in ("pos", "company") ORDER BY id', function (err, rows) {
// connection.query('SELECT name, elements FROM cms_zoo_item WHERE type in ("pos", "company") ORDER BY id', function (err, rows) {
connection
.
query
(
'SELECT name, elements FROM cms_zoo_item WHERE id in (
864
)'
,
function
(
err
,
rows
)
{
connection
.
query
(
'SELECT name, elements FROM cms_zoo_item WHERE id in (
2513
)'
,
function
(
err
,
rows
)
{
console
.
error
(
err
);
console
.
error
(
err
);
console
.
log
(
rows
.
length
);
console
.
log
(
rows
.
length
);
var
result
=
[];
var
result
=
[];
...
...
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