Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
solo-1
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
Administrator
solo-1
Commits
ef31c684
Unverified
Commit
ef31c684
authored
Jan 18, 2020
by
Van
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
🐛
#comment 为动态评论时无法定位
parent
1f4f3d0f
Changes
49
Show whitespace changes
Inline
Side-by-side
Showing
49 changed files
with
227 additions
and
211 deletions
+227
-211
src/main/resources/skins/9IPHP/article-list.ftl
src/main/resources/skins/9IPHP/article-list.ftl
+1
-1
src/main/resources/skins/9IPHP/article.ftl
src/main/resources/skins/9IPHP/article.ftl
+3
-2
src/main/resources/skins/Andrea/article-list.ftl
src/main/resources/skins/Andrea/article-list.ftl
+1
-1
src/main/resources/skins/Andrea/article.ftl
src/main/resources/skins/Andrea/article.ftl
+5
-4
src/main/resources/skins/Bruce/article.ftl
src/main/resources/skins/Bruce/article.ftl
+2
-1
src/main/resources/skins/Bruce/css/_bootstrap.scss
src/main/resources/skins/Bruce/css/_bootstrap.scss
+0
-1
src/main/resources/skins/Bruce/css/base.css
src/main/resources/skins/Bruce/css/base.css
+0
-1
src/main/resources/skins/Bruce/js/bootstrap.min.js
src/main/resources/skins/Bruce/js/bootstrap.min.js
+1
-1
src/main/resources/skins/Bubble/article-list.ftl
src/main/resources/skins/Bubble/article-list.ftl
+1
-1
src/main/resources/skins/Bubble/article.ftl
src/main/resources/skins/Bubble/article.ftl
+11
-10
src/main/resources/skins/Bubble/footer.ftl
src/main/resources/skins/Bubble/footer.ftl
+3
-3
src/main/resources/skins/Bubble/js/circleMagic.min.js
src/main/resources/skins/Bubble/js/circleMagic.min.js
+1
-1
src/main/resources/skins/Casper/article-list.ftl
src/main/resources/skins/Casper/article-list.ftl
+1
-1
src/main/resources/skins/Casper/article.ftl
src/main/resources/skins/Casper/article.ftl
+2
-1
src/main/resources/skins/Community/article-list.ftl
src/main/resources/skins/Community/article-list.ftl
+1
-1
src/main/resources/skins/Community/article.ftl
src/main/resources/skins/Community/article.ftl
+3
-4
src/main/resources/skins/Finding/article.ftl
src/main/resources/skins/Finding/article.ftl
+2
-1
src/main/resources/skins/Jane/article-list.ftl
src/main/resources/skins/Jane/article-list.ftl
+1
-1
src/main/resources/skins/Jane/article.ftl
src/main/resources/skins/Jane/article.ftl
+3
-2
src/main/resources/skins/Medium/article-list.ftl
src/main/resources/skins/Medium/article-list.ftl
+1
-1
src/main/resources/skins/Medium/article.ftl
src/main/resources/skins/Medium/article.ftl
+2
-1
src/main/resources/skins/NeoEase/article-list.ftl
src/main/resources/skins/NeoEase/article-list.ftl
+1
-1
src/main/resources/skins/NeoEase/article.ftl
src/main/resources/skins/NeoEase/article.ftl
+4
-3
src/main/resources/skins/Pinghsu/article.ftl
src/main/resources/skins/Pinghsu/article.ftl
+3
-2
src/main/resources/skins/favourite/article-list.ftl
src/main/resources/skins/favourite/article-list.ftl
+1
-1
src/main/resources/skins/favourite/article.ftl
src/main/resources/skins/favourite/article.ftl
+7
-6
src/main/resources/skins/i-nove/article-list.ftl
src/main/resources/skins/i-nove/article-list.ftl
+1
-1
src/main/resources/skins/i-nove/article.ftl
src/main/resources/skins/i-nove/article.ftl
+3
-2
src/main/resources/skins/metro-hot/article-list.ftl
src/main/resources/skins/metro-hot/article-list.ftl
+1
-1
src/main/resources/skins/metro-hot/article.ftl
src/main/resources/skins/metro-hot/article.ftl
+3
-2
src/main/resources/skins/metro-hot/css/base.css
src/main/resources/skins/metro-hot/css/base.css
+118
-118
src/main/resources/skins/metro-hot/css/base.scss
src/main/resources/skins/metro-hot/css/base.scss
+1
-1
src/main/resources/skins/next/article-list.ftl
src/main/resources/skins/next/article-list.ftl
+1
-1
src/main/resources/skins/next/article.ftl
src/main/resources/skins/next/article.ftl
+3
-2
src/main/resources/skins/next/css/base.css
src/main/resources/skins/next/css/base.css
+3
-3
src/main/resources/skins/next/css/base.scss
src/main/resources/skins/next/css/base.scss
+3
-3
src/main/resources/skins/nijigen/article-list.ftl
src/main/resources/skins/nijigen/article-list.ftl
+1
-1
src/main/resources/skins/nijigen/article.ftl
src/main/resources/skins/nijigen/article.ftl
+5
-4
src/main/resources/skins/owmx-3.0/article-list.ftl
src/main/resources/skins/owmx-3.0/article-list.ftl
+1
-1
src/main/resources/skins/owmx-3.0/article.ftl
src/main/resources/skins/owmx-3.0/article.ftl
+6
-5
src/main/resources/skins/timeline/article-list.ftl
src/main/resources/skins/timeline/article-list.ftl
+1
-1
src/main/resources/skins/timeline/article.ftl
src/main/resources/skins/timeline/article.ftl
+3
-2
src/main/resources/skins/timeline/index.ftl
src/main/resources/skins/timeline/index.ftl
+1
-1
src/main/resources/skins/timeline/js/common.js
src/main/resources/skins/timeline/js/common.js
+1
-1
src/main/resources/skins/timeline/js/common.min.js
src/main/resources/skins/timeline/js/common.min.js
+1
-1
src/main/resources/skins/tree-house/article-list.ftl
src/main/resources/skins/tree-house/article-list.ftl
+1
-1
src/main/resources/skins/tree-house/article.ftl
src/main/resources/skins/tree-house/article.ftl
+5
-4
src/main/resources/skins/yilia/article-list.ftl
src/main/resources/skins/yilia/article-list.ftl
+1
-1
src/main/resources/skins/yilia/article.ftl
src/main/resources/skins/yilia/article.ftl
+2
-1
No files found.
src/main/resources/skins/9IPHP/article-list.ftl
View file @
ef31c684
...
...
@@ -51,7 +51,7 @@
|
<span class="vditor-tooltipped vditor-tooltipped__n" aria-label="${commentCountLabel}">
<i class="icon-comments"></i>
<a href="${servePath}${article.articlePermalink}#comments">
<a href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${commentLabel}</a>
</span>
</#if>
...
...
src/main/resources/skins/9IPHP/article.ftl
View file @
ef31c684
...
...
@@ -63,7 +63,7 @@
|
<span
class=
"vditor-tooltipped vditor-tooltipped__n"
aria-label=
"${commentCountLabel}"
>
<i
class=
"icon-comments"
></i>
<a
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
${commentLabel}
</a>
</span>
</
#
if>
...
...
@@ -109,6 +109,7 @@
</div>
</footer>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
class=
"fn__none"
>
...
...
src/main/resources/skins/Andrea/article-list.ftl
View file @
ef31c684
...
...
@@ -49,7 +49,7 @@
${article.authorName}</a>
<#if commentable>
|
<a rel="nofollow" class="underline" href="${servePath}${article.articlePermalink}#comments">
<a rel="nofollow" class="underline" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${commentLabel}
</a>
</#if>
...
...
src/main/resources/skins/Andrea/article.ftl
View file @
ef31c684
...
...
@@ -63,7 +63,7 @@
${article.authorName}
</a>
<
#if
commentable
>
|
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
${commentLabel}
</a>
</
#
if>
...
...
@@ -105,6 +105,7 @@
<div
id=
"externalRelevantArticles"
class=
"article-relative"
></div>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
style=
"border-top: 2px solid #3F3D36;margin-top: 30px;padding-top: 27px; padding-bottom: 30px;"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
...
...
src/main/resources/skins/Bruce/article.ftl
View file @
ef31c684
...
...
@@ -74,6 +74,7 @@
</div>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
...
...
src/main/resources/skins/Bruce/css/_bootstrap.scss
View file @
ef31c684
...
...
@@ -1386,7 +1386,6 @@ pre {
word-break
:
break-all
;
word-wrap
:
break-word
;
background-color
:
#f5f5f5
;
border
:
1px
solid
#ccc
;
border-radius
:
4px
;
}
pre
code
{
...
...
src/main/resources/skins/Bruce/css/base.css
View file @
ef31c684
...
...
@@ -1385,7 +1385,6 @@ pre {
word-break
:
break-all
;
word-wrap
:
break-word
;
background-color
:
#f5f5f5
;
border
:
1px
solid
#ccc
;
border-radius
:
4px
;
}
pre
code
{
...
...
src/main/resources/skins/Bruce/js/bootstrap.min.js
View file @
ef31c684
if
(
"
undefined
"
==
typeof
jQuery
)
throw
new
Error
(
"
Bootstrap's JavaScript requires jQuery
"
);
!
function
(
t
){
"
use strict
"
;
t
.
fn
.
emulateTransitionEnd
=
function
(
e
){
var
i
=!
1
,
o
=
this
;
t
(
this
).
one
(
"
bsTransitionEnd
"
,(
function
(){
i
=!
0
}));
return
setTimeout
((
function
(){
i
||
t
(
o
).
trigger
(
t
.
support
.
transition
.
end
)}),
e
),
this
},
t
((
function
(){
t
.
support
.
transition
=
function
(){
var
t
=
document
.
createElement
(
"
bootstrap
"
),
e
=
{
WebkitTransition
:
"
webkitTransitionEnd
"
,
MozTransition
:
"
transitionend
"
,
OTransition
:
"
oTransitionEnd otransitionend
"
,
transition
:
"
transitionend
"
};
for
(
var
i
in
e
)
if
(
void
0
!==
t
.
style
[
i
])
return
{
end
:
e
[
i
]};
return
!
1
}(),
t
.
support
.
transition
&&
(
t
.
event
.
special
.
bsTransitionEnd
=
{
bindType
:
t
.
support
.
transition
.
end
,
delegateType
:
t
.
support
.
transition
.
end
,
handle
:
function
(
e
){
if
(
t
(
e
.
target
).
is
(
this
))
return
e
.
handleObj
.
handler
.
apply
(
this
,
arguments
)}})}))}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
'
[data-dismiss="alert"]
'
,
i
=
function
(
i
){
t
(
i
).
on
(
"
click
"
,
e
,
this
.
close
)};
i
.
VERSION
=
"
3.2.0
"
,
i
.
prototype
.
close
=
function
(
e
){
var
i
=
t
(
this
),
o
=
i
.
attr
(
"
data-target
"
);
o
||
(
o
=
(
o
=
i
.
attr
(
"
href
"
))
&&
o
.
replace
(
/.*
(?=
#
[^\s]
*$
)
/
,
""
));
var
s
=
t
(
o
);
function
n
(){
s
.
detach
().
trigger
(
"
closed.bs.alert
"
).
remove
()}
e
&&
e
.
preventDefault
(),
s
.
length
||
(
s
=
i
.
hasClass
(
"
alert
"
)?
i
:
i
.
parent
()),
s
.
trigger
(
e
=
t
.
Event
(
"
close.bs.alert
"
)),
e
.
isDefaultPrevented
()
||
(
s
.
removeClass
(
"
in
"
),
t
.
support
.
transition
&&
s
.
hasClass
(
"
fade
"
)?
s
.
one
(
"
bsTransitionEnd
"
,
n
).
emulateTransitionEnd
(
150
):
n
())};
var
o
=
t
.
fn
.
alert
;
t
.
fn
.
alert
=
function
(
e
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.alert
"
);
s
||
o
.
data
(
"
bs.alert
"
,
s
=
new
i
(
this
)),
"
string
"
==
typeof
e
&&
s
[
e
].
call
(
o
)}))},
t
.
fn
.
alert
.
Constructor
=
i
,
t
.
fn
.
alert
.
noConflict
=
function
(){
return
t
.
fn
.
alert
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.alert.data-api
"
,
e
,
i
.
prototype
.
close
)}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
i
,
o
){
this
.
$element
=
t
(
i
),
this
.
options
=
t
.
extend
({},
e
.
DEFAULTS
,
o
),
this
.
isLoading
=!
1
};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.button
"
),
n
=
"
object
"
==
typeof
i
&&
i
;
s
||
o
.
data
(
"
bs.button
"
,
s
=
new
e
(
this
,
n
)),
"
toggle
"
==
i
?
s
.
toggle
():
i
&&
s
.
setState
(
i
)}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
loadingText
:
"
loading...
"
},
e
.
prototype
.
setState
=
function
(
e
){
var
i
=
"
disabled
"
,
o
=
this
.
$element
,
s
=
o
.
is
(
"
input
"
)?
"
val
"
:
"
html
"
,
n
=
o
.
data
();
e
+=
"
Text
"
,
null
==
n
.
resetText
&&
o
.
data
(
"
resetText
"
,
o
[
s
]()),
o
[
s
](
null
==
n
[
e
]?
this
.
options
[
e
]:
n
[
e
]),
setTimeout
(
t
.
proxy
((
function
(){
"
loadingText
"
==
e
?(
this
.
isLoading
=!
0
,
o
.
addClass
(
i
).
attr
(
i
,
i
)):
this
.
isLoading
&&
(
this
.
isLoading
=!
1
,
o
.
removeClass
(
i
).
removeAttr
(
i
))}),
this
),
0
)},
e
.
prototype
.
toggle
=
function
(){
var
t
=!
0
,
e
=
this
.
$element
.
closest
(
'
[data-toggle="buttons"]
'
);
if
(
e
.
length
){
var
i
=
this
.
$element
.
find
(
"
input
"
);
"
radio
"
==
i
.
prop
(
"
type
"
)
&&
(
i
.
prop
(
"
checked
"
)
&&
this
.
$element
.
hasClass
(
"
active
"
)?
t
=!
1
:
e
.
find
(
"
.active
"
).
removeClass
(
"
active
"
)),
t
&&
i
.
prop
(
"
checked
"
,
!
this
.
$element
.
hasClass
(
"
active
"
)).
trigger
(
"
change
"
)}
t
&&
this
.
$element
.
toggleClass
(
"
active
"
)};
var
o
=
t
.
fn
.
button
;
t
.
fn
.
button
=
i
,
t
.
fn
.
button
.
Constructor
=
e
,
t
.
fn
.
button
.
noConflict
=
function
(){
return
t
.
fn
.
button
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.button.data-api
"
,
'
[data-toggle^="button"]
'
,(
function
(
e
){
var
o
=
t
(
e
.
target
);
o
.
hasClass
(
"
btn
"
)
||
(
o
=
o
.
closest
(
"
.btn
"
)),
i
.
call
(
o
,
"
toggle
"
),
e
.
preventDefault
()}))}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
e
,
i
){
this
.
$element
=
t
(
e
).
on
(
"
keydown.bs.carousel
"
,
t
.
proxy
(
this
.
keydown
,
this
)),
this
.
$indicators
=
this
.
$element
.
find
(
"
.carousel-indicators
"
),
this
.
options
=
i
,
this
.
paused
=
this
.
sliding
=
this
.
interval
=
this
.
$active
=
this
.
$items
=
null
,
"
hover
"
==
this
.
options
.
pause
&&
this
.
$element
.
on
(
"
mouseenter.bs.carousel
"
,
t
.
proxy
(
this
.
pause
,
this
)).
on
(
"
mouseleave.bs.carousel
"
,
t
.
proxy
(
this
.
cycle
,
this
))};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.carousel
"
),
n
=
t
.
extend
({},
e
.
DEFAULTS
,
o
.
data
(),
"
object
"
==
typeof
i
&&
i
),
r
=
"
string
"
==
typeof
i
?
i
:
n
.
slide
;
s
||
o
.
data
(
"
bs.carousel
"
,
s
=
new
e
(
this
,
n
)),
"
number
"
==
typeof
i
?
s
.
to
(
i
):
r
?
s
[
r
]():
n
.
interval
&&
s
.
pause
().
cycle
()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
interval
:
5
e3
,
pause
:
"
hover
"
,
wrap
:
!
0
},
e
.
prototype
.
keydown
=
function
(
t
){
switch
(
t
.
which
){
case
37
:
this
.
prev
();
break
;
case
39
:
this
.
next
();
break
;
default
:
return
}
t
.
preventDefault
()},
e
.
prototype
.
cycle
=
function
(
e
){
return
e
||
(
this
.
paused
=!
1
),
this
.
interval
&&
clearInterval
(
this
.
interval
),
this
.
options
.
interval
&&!
this
.
paused
&&
(
this
.
interval
=
setInterval
(
t
.
proxy
(
this
.
next
,
this
),
this
.
options
.
interval
)),
this
},
e
.
prototype
.
getItemIndex
=
function
(
t
){
return
this
.
$items
=
t
.
parent
().
children
(
"
.item
"
),
this
.
$items
.
index
(
t
||
this
.
$active
)},
e
.
prototype
.
to
=
function
(
e
){
var
i
=
this
,
o
=
this
.
getItemIndex
(
this
.
$active
=
this
.
$element
.
find
(
"
.item.active
"
));
if
(
!
(
e
>
this
.
$items
.
length
-
1
||
e
<
0
))
return
this
.
sliding
?
this
.
$element
.
one
(
"
slid.bs.carousel
"
,(
function
(){
i
.
to
(
e
)})):
o
==
e
?
this
.
pause
().
cycle
():
this
.
slide
(
e
>
o
?
"
next
"
:
"
prev
"
,
t
(
this
.
$items
[
e
]))},
e
.
prototype
.
pause
=
function
(
e
){
return
e
||
(
this
.
paused
=!
0
),
this
.
$element
.
find
(
"
.next, .prev
"
).
length
&&
t
.
support
.
transition
&&
(
this
.
$element
.
trigger
(
t
.
support
.
transition
.
end
),
this
.
cycle
(
!
0
)),
this
.
interval
=
clearInterval
(
this
.
interval
),
this
},
e
.
prototype
.
next
=
function
(){
if
(
!
this
.
sliding
)
return
this
.
slide
(
"
next
"
)},
e
.
prototype
.
prev
=
function
(){
if
(
!
this
.
sliding
)
return
this
.
slide
(
"
prev
"
)},
e
.
prototype
.
slide
=
function
(
e
,
i
){
var
o
=
this
.
$element
.
find
(
"
.item.active
"
),
s
=
i
||
o
[
e
](),
n
=
this
.
interval
,
r
=
"
next
"
==
e
?
"
left
"
:
"
right
"
,
a
=
"
next
"
==
e
?
"
first
"
:
"
last
"
,
l
=
this
;
if
(
!
s
.
length
){
if
(
!
this
.
options
.
wrap
)
return
;
s
=
this
.
$element
.
find
(
"
.item
"
)[
a
]()}
if
(
s
.
hasClass
(
"
active
"
))
return
this
.
sliding
=!
1
;
var
h
=
s
[
0
],
p
=
t
.
Event
(
"
slide.bs.carousel
"
,{
relatedTarget
:
h
,
direction
:
r
});
if
(
this
.
$element
.
trigger
(
p
),
!
p
.
isDefaultPrevented
()){
if
(
this
.
sliding
=!
0
,
n
&&
this
.
pause
(),
this
.
$indicators
.
length
){
this
.
$indicators
.
find
(
"
.active
"
).
removeClass
(
"
active
"
);
var
c
=
t
(
this
.
$indicators
.
children
()[
this
.
getItemIndex
(
s
)]);
c
&&
c
.
addClass
(
"
active
"
)}
var
d
=
t
.
Event
(
"
slid.bs.carousel
"
,{
relatedTarget
:
h
,
direction
:
r
});
return
t
.
support
.
transition
&&
this
.
$element
.
hasClass
(
"
slide
"
)?(
s
.
addClass
(
e
),
s
[
0
].
offsetWidth
,
o
.
addClass
(
r
),
s
.
addClass
(
r
),
o
.
one
(
"
bsTransitionEnd
"
,(
function
(){
s
.
removeClass
([
e
,
r
].
join
(
"
"
)).
addClass
(
"
active
"
),
o
.
removeClass
([
"
active
"
,
r
].
join
(
"
"
)),
l
.
sliding
=!
1
,
setTimeout
((
function
(){
l
.
$element
.
trigger
(
d
)}),
0
)})).
emulateTransitionEnd
(
1
e3
*
o
.
css
(
"
transition-duration
"
).
slice
(
0
,
-
1
))):(
o
.
removeClass
(
"
active
"
),
s
.
addClass
(
"
active
"
),
this
.
sliding
=!
1
,
this
.
$element
.
trigger
(
d
)),
n
&&
this
.
cycle
(),
this
}};
var
o
=
t
.
fn
.
carousel
;
t
.
fn
.
carousel
=
i
,
t
.
fn
.
carousel
.
Constructor
=
e
,
t
.
fn
.
carousel
.
noConflict
=
function
(){
return
t
.
fn
.
carousel
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.carousel.data-api
"
,
"
[data-slide], [data-slide-to]
"
,(
function
(
e
){
var
o
,
s
=
t
(
this
),
n
=
t
(
s
.
attr
(
"
data-target
"
)
||
(
o
=
s
.
attr
(
"
href
"
))
&&
o
.
replace
(
/.*
(?=
#
[^\s]
+$
)
/
,
""
));
if
(
n
.
hasClass
(
"
carousel
"
)){
var
r
=
t
.
extend
({},
n
.
data
(),
s
.
data
()),
a
=
s
.
attr
(
"
data-slide-to
"
);
a
&&
(
r
.
interval
=!
1
),
i
.
call
(
n
,
r
),
a
&&
n
.
data
(
"
bs.carousel
"
).
to
(
a
),
e
.
preventDefault
()}})),
t
(
window
).
on
(
"
load
"
,(
function
(){
t
(
'
[data-ride="carousel"]
'
).
each
((
function
(){
var
e
=
t
(
this
);
i
.
call
(
e
,
e
.
data
())}))}))}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
i
,
o
){
this
.
$element
=
t
(
i
),
this
.
options
=
t
.
extend
({},
e
.
DEFAULTS
,
o
),
this
.
transitioning
=
null
,
this
.
options
.
parent
&&
(
this
.
$parent
=
t
(
this
.
options
.
parent
)),
this
.
options
.
toggle
&&
this
.
toggle
()};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.collapse
"
),
n
=
t
.
extend
({},
e
.
DEFAULTS
,
o
.
data
(),
"
object
"
==
typeof
i
&&
i
);
!
s
&&
n
.
toggle
&&
"
show
"
==
i
&&
(
i
=!
i
),
s
||
o
.
data
(
"
bs.collapse
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
toggle
:
!
0
},
e
.
prototype
.
dimension
=
function
(){
return
this
.
$element
.
hasClass
(
"
width
"
)?
"
width
"
:
"
height
"
},
e
.
prototype
.
show
=
function
(){
if
(
!
this
.
transitioning
&&!
this
.
$element
.
hasClass
(
"
in
"
)){
var
e
=
t
.
Event
(
"
show.bs.collapse
"
);
if
(
this
.
$element
.
trigger
(
e
),
!
e
.
isDefaultPrevented
()){
var
o
=
this
.
$parent
&&
this
.
$parent
.
find
(
"
> .panel > .in
"
);
if
(
o
&&
o
.
length
){
var
s
=
o
.
data
(
"
bs.collapse
"
);
if
(
s
&&
s
.
transitioning
)
return
;
i
.
call
(
o
,
"
hide
"
),
s
||
o
.
data
(
"
bs.collapse
"
,
null
)}
var
n
=
this
.
dimension
();
this
.
$element
.
removeClass
(
"
collapse
"
).
addClass
(
"
collapsing
"
)[
n
](
0
),
this
.
transitioning
=
1
;
var
r
=
function
(){
this
.
$element
.
removeClass
(
"
collapsing
"
).
addClass
(
"
collapse in
"
)[
n
](
""
),
this
.
transitioning
=
0
,
this
.
$element
.
trigger
(
"
shown.bs.collapse
"
)};
if
(
!
t
.
support
.
transition
)
return
r
.
call
(
this
);
var
a
=
t
.
camelCase
([
"
scroll
"
,
n
].
join
(
"
-
"
));
this
.
$element
.
one
(
"
bsTransitionEnd
"
,
t
.
proxy
(
r
,
this
)).
emulateTransitionEnd
(
350
)[
n
](
this
.
$element
[
0
][
a
])}}},
e
.
prototype
.
hide
=
function
(){
if
(
!
this
.
transitioning
&&
this
.
$element
.
hasClass
(
"
in
"
)){
var
e
=
t
.
Event
(
"
hide.bs.collapse
"
);
if
(
this
.
$element
.
trigger
(
e
),
!
e
.
isDefaultPrevented
()){
var
i
=
this
.
dimension
();
this
.
$element
[
i
](
this
.
$element
[
i
]())[
0
].
offsetHeight
,
this
.
$element
.
addClass
(
"
collapsing
"
).
removeClass
(
"
collapse
"
).
removeClass
(
"
in
"
),
this
.
transitioning
=
1
;
var
o
=
function
(){
this
.
transitioning
=
0
,
this
.
$element
.
trigger
(
"
hidden.bs.collapse
"
).
removeClass
(
"
collapsing
"
).
addClass
(
"
collapse
"
)};
if
(
!
t
.
support
.
transition
)
return
o
.
call
(
this
);
this
.
$element
[
i
](
0
).
one
(
"
bsTransitionEnd
"
,
t
.
proxy
(
o
,
this
)).
emulateTransitionEnd
(
350
)}}},
e
.
prototype
.
toggle
=
function
(){
this
[
this
.
$element
.
hasClass
(
"
in
"
)?
"
hide
"
:
"
show
"
]()};
var
o
=
t
.
fn
.
collapse
;
t
.
fn
.
collapse
=
i
,
t
.
fn
.
collapse
.
Constructor
=
e
,
t
.
fn
.
collapse
.
noConflict
=
function
(){
return
t
.
fn
.
collapse
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.collapse.data-api
"
,
'
[data-toggle="collapse"]
'
,(
function
(
e
){
var
o
,
s
=
t
(
this
),
n
=
s
.
attr
(
"
data-target
"
)
||
e
.
preventDefault
()
||
(
o
=
s
.
attr
(
"
href
"
))
&&
o
.
replace
(
/.*
(?=
#
[^\s]
+$
)
/
,
""
),
r
=
t
(
n
),
a
=
r
.
data
(
"
bs.collapse
"
),
l
=
a
?
"
toggle
"
:
s
.
data
(),
h
=
s
.
attr
(
"
data-parent
"
),
p
=
h
&&
t
(
h
);
a
&&
a
.
transitioning
||
(
p
&&
p
.
find
(
'
[data-toggle="collapse"][data-parent="
'
+
h
+
'
"]
'
).
not
(
s
).
addClass
(
"
collapsed
"
),
s
[
r
.
hasClass
(
"
in
"
)?
"
addClass
"
:
"
removeClass
"
](
"
collapsed
"
)),
i
.
call
(
r
,
l
)}))}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
"
.dropdown-backdrop
"
,
i
=
'
[data-toggle="dropdown"]
'
,
o
=
function
(
e
){
t
(
e
).
on
(
"
click.bs.dropdown
"
,
this
.
toggle
)};
function
s
(
o
){
o
&&
3
===
o
.
which
||
(
t
(
e
).
remove
(),
t
(
i
).
each
((
function
(){
var
e
=
n
(
t
(
this
)),
i
=
{
relatedTarget
:
this
};
e
.
hasClass
(
"
open
"
)
&&
(
e
.
trigger
(
o
=
t
.
Event
(
"
hide.bs.dropdown
"
,
i
)),
o
.
isDefaultPrevented
()
||
e
.
removeClass
(
"
open
"
).
trigger
(
"
hidden.bs.dropdown
"
,
i
))})))}
function
n
(
e
){
var
i
=
e
.
attr
(
"
data-target
"
);
i
||
(
i
=
(
i
=
e
.
attr
(
"
href
"
))
&&
/#
[
A-Za-z
]
/
.
test
(
i
)
&&
i
.
replace
(
/.*
(?=
#
[^\s]
*$
)
/
,
""
));
var
o
=
i
&&
t
(
i
);
return
o
&&
o
.
length
?
o
:
e
.
parent
()}
o
.
VERSION
=
"
3.2.0
"
,
o
.
prototype
.
toggle
=
function
(
e
){
var
i
=
t
(
this
);
if
(
!
i
.
is
(
"
.disabled, :disabled
"
)){
var
o
=
n
(
i
),
r
=
o
.
hasClass
(
"
open
"
);
if
(
s
(),
!
r
){
"
ontouchstart
"
in
document
.
documentElement
&&!
o
.
closest
(
"
.navbar-nav
"
).
length
&&
t
(
'
<div class="dropdown-backdrop"/>
'
).
insertAfter
(
t
(
this
)).
on
(
"
click
"
,
s
);
var
a
=
{
relatedTarget
:
this
};
if
(
o
.
trigger
(
e
=
t
.
Event
(
"
show.bs.dropdown
"
,
a
)),
e
.
isDefaultPrevented
())
return
;
i
.
trigger
(
"
focus
"
),
o
.
toggleClass
(
"
open
"
).
trigger
(
"
shown.bs.dropdown
"
,
a
)}
return
!
1
}},
o
.
prototype
.
keydown
=
function
(
e
){
if
(
/
(
38|40|27
)
/
.
test
(
e
.
keyCode
)){
var
o
=
t
(
this
);
if
(
e
.
preventDefault
(),
e
.
stopPropagation
(),
!
o
.
is
(
"
.disabled, :disabled
"
)){
var
s
=
n
(
o
),
r
=
s
.
hasClass
(
"
open
"
);
if
(
!
r
||
r
&&
27
==
e
.
keyCode
)
return
27
==
e
.
which
&&
s
.
find
(
i
).
trigger
(
"
focus
"
),
o
.
trigger
(
"
click
"
);
var
a
=
"
li:not(.divider):visible a
"
,
l
=
s
.
find
(
'
[role="menu"]
'
+
a
+
'
, [role="listbox"]
'
+
a
);
if
(
l
.
length
){
var
h
=
l
.
index
(
l
.
filter
(
"
:focus
"
));
38
==
e
.
keyCode
&&
h
>
0
&&
h
--
,
40
==
e
.
keyCode
&&
h
<
l
.
length
-
1
&&
h
++
,
~
h
||
(
h
=
0
),
l
.
eq
(
h
).
trigger
(
"
focus
"
)}}}};
var
r
=
t
.
fn
.
dropdown
;
t
.
fn
.
dropdown
=
function
(
e
){
return
this
.
each
((
function
(){
var
i
=
t
(
this
),
s
=
i
.
data
(
"
bs.dropdown
"
);
s
||
i
.
data
(
"
bs.dropdown
"
,
s
=
new
o
(
this
)),
"
string
"
==
typeof
e
&&
s
[
e
].
call
(
i
)}))},
t
.
fn
.
dropdown
.
Constructor
=
o
,
t
.
fn
.
dropdown
.
noConflict
=
function
(){
return
t
.
fn
.
dropdown
=
r
,
this
},
t
(
document
).
on
(
"
click.bs.dropdown.data-api
"
,
s
).
on
(
"
click.bs.dropdown.data-api
"
,
"
.dropdown form
"
,(
function
(
t
){
t
.
stopPropagation
()})).
on
(
"
click.bs.dropdown.data-api
"
,
i
,
o
.
prototype
.
toggle
).
on
(
"
keydown.bs.dropdown.data-api
"
,
i
+
'
, [role="menu"], [role="listbox"]
'
,
o
.
prototype
.
keydown
)}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
e
,
i
){
this
.
options
=
i
,
this
.
$body
=
t
(
document
.
body
),
this
.
$element
=
t
(
e
),
this
.
$backdrop
=
this
.
isShown
=
null
,
this
.
scrollbarWidth
=
0
,
this
.
options
.
remote
&&
this
.
$element
.
find
(
"
.modal-content
"
).
load
(
this
.
options
.
remote
,
t
.
proxy
((
function
(){
this
.
$element
.
trigger
(
"
loaded.bs.modal
"
)}),
this
))};
function
i
(
i
,
o
){
return
this
.
each
((
function
(){
var
s
=
t
(
this
),
n
=
s
.
data
(
"
bs.modal
"
),
r
=
t
.
extend
({},
e
.
DEFAULTS
,
s
.
data
(),
"
object
"
==
typeof
i
&&
i
);
n
||
s
.
data
(
"
bs.modal
"
,
n
=
new
e
(
this
,
r
)),
"
string
"
==
typeof
i
?
n
[
i
](
o
):
r
.
show
&&
n
.
show
(
o
)}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
backdrop
:
!
0
,
keyboard
:
!
0
,
show
:
!
0
},
e
.
prototype
.
toggle
=
function
(
t
){
return
this
.
isShown
?
this
.
hide
():
this
.
show
(
t
)},
e
.
prototype
.
show
=
function
(
e
){
var
i
=
this
,
o
=
t
.
Event
(
"
show.bs.modal
"
,{
relatedTarget
:
e
});
this
.
$element
.
trigger
(
o
),
this
.
isShown
||
o
.
isDefaultPrevented
()
||
(
this
.
isShown
=!
0
,
this
.
checkScrollbar
(),
this
.
$body
.
addClass
(
"
modal-open
"
),
this
.
setScrollbar
(),
this
.
escape
(),
this
.
$element
.
on
(
"
click.dismiss.bs.modal
"
,
'
[data-dismiss="modal"]
'
,
t
.
proxy
(
this
.
hide
,
this
)),
this
.
backdrop
((
function
(){
var
o
=
t
.
support
.
transition
&&
i
.
$element
.
hasClass
(
"
fade
"
);
i
.
$element
.
parent
().
length
||
i
.
$element
.
appendTo
(
i
.
$body
),
i
.
$element
.
show
().
scrollTop
(
0
),
o
&&
i
.
$element
[
0
].
offsetWidth
,
i
.
$element
.
addClass
(
"
in
"
).
attr
(
"
aria-hidden
"
,
!
1
),
i
.
enforceFocus
();
var
s
=
t
.
Event
(
"
shown.bs.modal
"
,{
relatedTarget
:
e
});
o
?
i
.
$element
.
find
(
"
.modal-dialog
"
).
one
(
"
bsTransitionEnd
"
,(
function
(){
i
.
$element
.
trigger
(
"
focus
"
).
trigger
(
s
)})).
emulateTransitionEnd
(
300
):
i
.
$element
.
trigger
(
"
focus
"
).
trigger
(
s
)})))},
e
.
prototype
.
hide
=
function
(
e
){
e
&&
e
.
preventDefault
(),
e
=
t
.
Event
(
"
hide.bs.modal
"
),
this
.
$element
.
trigger
(
e
),
this
.
isShown
&&!
e
.
isDefaultPrevented
()
&&
(
this
.
isShown
=!
1
,
this
.
$body
.
removeClass
(
"
modal-open
"
),
this
.
resetScrollbar
(),
this
.
escape
(),
t
(
document
).
off
(
"
focusin.bs.modal
"
),
this
.
$element
.
removeClass
(
"
in
"
).
attr
(
"
aria-hidden
"
,
!
0
).
off
(
"
click.dismiss.bs.modal
"
),
t
.
support
.
transition
&&
this
.
$element
.
hasClass
(
"
fade
"
)?
this
.
$element
.
one
(
"
bsTransitionEnd
"
,
t
.
proxy
(
this
.
hideModal
,
this
)).
emulateTransitionEnd
(
300
):
this
.
hideModal
())},
e
.
prototype
.
enforceFocus
=
function
(){
t
(
document
).
off
(
"
focusin.bs.modal
"
).
on
(
"
focusin.bs.modal
"
,
t
.
proxy
((
function
(
t
){
this
.
$element
[
0
]
===
t
.
target
||
this
.
$element
.
has
(
t
.
target
).
length
||
this
.
$element
.
trigger
(
"
focus
"
)}),
this
))},
e
.
prototype
.
escape
=
function
(){
this
.
isShown
&&
this
.
options
.
keyboard
?
this
.
$element
.
on
(
"
keyup.dismiss.bs.modal
"
,
t
.
proxy
((
function
(
t
){
27
==
t
.
which
&&
this
.
hide
()}),
this
)):
this
.
isShown
||
this
.
$element
.
off
(
"
keyup.dismiss.bs.modal
"
)},
e
.
prototype
.
hideModal
=
function
(){
var
t
=
this
;
this
.
$element
.
hide
(),
this
.
backdrop
((
function
(){
t
.
$element
.
trigger
(
"
hidden.bs.modal
"
)}))},
e
.
prototype
.
removeBackdrop
=
function
(){
this
.
$backdrop
&&
this
.
$backdrop
.
remove
(),
this
.
$backdrop
=
null
},
e
.
prototype
.
backdrop
=
function
(
e
){
var
i
=
this
,
o
=
this
.
$element
.
hasClass
(
"
fade
"
)?
"
fade
"
:
""
;
if
(
this
.
isShown
&&
this
.
options
.
backdrop
){
var
s
=
t
.
support
.
transition
&&
o
;
if
(
this
.
$backdrop
=
t
(
'
<div class="modal-backdrop
'
+
o
+
'
" />
'
).
appendTo
(
this
.
$body
),
this
.
$element
.
on
(
"
click.dismiss.bs.modal
"
,
t
.
proxy
((
function
(
t
){
t
.
target
===
t
.
currentTarget
&&
(
"
static
"
==
this
.
options
.
backdrop
?
this
.
$element
[
0
].
focus
.
call
(
this
.
$element
[
0
]):
this
.
hide
.
call
(
this
))}),
this
)),
s
&&
this
.
$backdrop
[
0
].
offsetWidth
,
this
.
$backdrop
.
addClass
(
"
in
"
),
!
e
)
return
;
s
?
this
.
$backdrop
.
one
(
"
bsTransitionEnd
"
,
e
).
emulateTransitionEnd
(
150
):
e
()}
else
if
(
!
this
.
isShown
&&
this
.
$backdrop
){
this
.
$backdrop
.
removeClass
(
"
in
"
);
var
n
=
function
(){
i
.
removeBackdrop
(),
e
&&
e
()};
t
.
support
.
transition
&&
this
.
$element
.
hasClass
(
"
fade
"
)?
this
.
$backdrop
.
one
(
"
bsTransitionEnd
"
,
n
).
emulateTransitionEnd
(
150
):
n
()}
else
e
&&
e
()},
e
.
prototype
.
checkScrollbar
=
function
(){
document
.
body
.
clientWidth
>=
window
.
innerWidth
||
(
this
.
scrollbarWidth
=
this
.
scrollbarWidth
||
this
.
measureScrollbar
())},
e
.
prototype
.
setScrollbar
=
function
(){
var
t
=
parseInt
(
this
.
$body
.
css
(
"
padding-right
"
)
||
0
,
10
);
this
.
scrollbarWidth
&&
this
.
$body
.
css
(
"
padding-right
"
,
t
+
this
.
scrollbarWidth
)},
e
.
prototype
.
resetScrollbar
=
function
(){
this
.
$body
.
css
(
"
padding-right
"
,
""
)},
e
.
prototype
.
measureScrollbar
=
function
(){
var
t
=
document
.
createElement
(
"
div
"
);
t
.
className
=
"
modal-scrollbar-measure
"
,
this
.
$body
.
append
(
t
);
var
e
=
t
.
offsetWidth
-
t
.
clientWidth
;
return
this
.
$body
[
0
].
removeChild
(
t
),
e
};
var
o
=
t
.
fn
.
modal
;
t
.
fn
.
modal
=
i
,
t
.
fn
.
modal
.
Constructor
=
e
,
t
.
fn
.
modal
.
noConflict
=
function
(){
return
t
.
fn
.
modal
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.modal.data-api
"
,
'
[data-toggle="modal"]
'
,(
function
(
e
){
var
o
=
t
(
this
),
s
=
o
.
attr
(
"
href
"
),
n
=
t
(
o
.
attr
(
"
data-target
"
)
||
s
&&
s
.
replace
(
/.*
(?=
#
[^\s]
+$
)
/
,
""
)),
r
=
n
.
data
(
"
bs.modal
"
)?
"
toggle
"
:
t
.
extend
({
remote
:
!
/#/
.
test
(
s
)
&&
s
},
n
.
data
(),
o
.
data
());
o
.
is
(
"
a
"
)
&&
e
.
preventDefault
(),
n
.
one
(
"
show.bs.modal
"
,(
function
(
t
){
t
.
isDefaultPrevented
()
||
n
.
one
(
"
hidden.bs.modal
"
,(
function
(){
o
.
is
(
"
:visible
"
)
&&
o
.
trigger
(
"
focus
"
)}))})),
i
.
call
(
n
,
r
,
this
)}))}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
t
,
e
){
this
.
type
=
this
.
options
=
this
.
enabled
=
this
.
timeout
=
this
.
hoverState
=
this
.
$element
=
null
,
this
.
init
(
"
tooltip
"
,
t
,
e
)};
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
animation
:
!
0
,
placement
:
"
top
"
,
selector
:
!
1
,
template
:
'
<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>
'
,
trigger
:
"
hover focus
"
,
title
:
""
,
delay
:
0
,
html
:
!
1
,
container
:
!
1
,
viewport
:{
selector
:
"
body
"
,
padding
:
0
}},
e
.
prototype
.
init
=
function
(
e
,
i
,
o
){
this
.
enabled
=!
0
,
this
.
type
=
e
,
this
.
$element
=
t
(
i
),
this
.
options
=
this
.
getOptions
(
o
),
this
.
$viewport
=
this
.
options
.
viewport
&&
t
(
this
.
options
.
viewport
.
selector
||
this
.
options
.
viewport
);
for
(
var
s
=
this
.
options
.
trigger
.
split
(
"
"
),
n
=
s
.
length
;
n
--
;){
var
r
=
s
[
n
];
if
(
"
click
"
==
r
)
this
.
$element
.
on
(
"
click.
"
+
this
.
type
,
this
.
options
.
selector
,
t
.
proxy
(
this
.
toggle
,
this
));
else
if
(
"
manual
"
!=
r
){
var
a
=
"
hover
"
==
r
?
"
mouseenter
"
:
"
focusin
"
,
l
=
"
hover
"
==
r
?
"
mouseleave
"
:
"
focusout
"
;
this
.
$element
.
on
(
a
+
"
.
"
+
this
.
type
,
this
.
options
.
selector
,
t
.
proxy
(
this
.
enter
,
this
)),
this
.
$element
.
on
(
l
+
"
.
"
+
this
.
type
,
this
.
options
.
selector
,
t
.
proxy
(
this
.
leave
,
this
))}}
this
.
options
.
selector
?
this
.
_options
=
t
.
extend
({},
this
.
options
,{
trigger
:
"
manual
"
,
selector
:
""
}):
this
.
fixTitle
()},
e
.
prototype
.
getDefaults
=
function
(){
return
e
.
DEFAULTS
},
e
.
prototype
.
getOptions
=
function
(
e
){
return
(
e
=
t
.
extend
({},
this
.
getDefaults
(),
this
.
$element
.
data
(),
e
)).
delay
&&
"
number
"
==
typeof
e
.
delay
&&
(
e
.
delay
=
{
show
:
e
.
delay
,
hide
:
e
.
delay
}),
e
},
e
.
prototype
.
getDelegateOptions
=
function
(){
var
e
=
{},
i
=
this
.
getDefaults
();
return
this
.
_options
&&
t
.
each
(
this
.
_options
,(
function
(
t
,
o
){
i
[
t
]
!=
o
&&
(
e
[
t
]
=
o
)})),
e
},
e
.
prototype
.
enter
=
function
(
e
){
var
i
=
e
instanceof
this
.
constructor
?
e
:
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
);
if
(
i
||
(
i
=
new
this
.
constructor
(
e
.
currentTarget
,
this
.
getDelegateOptions
()),
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
,
i
)),
clearTimeout
(
i
.
timeout
),
i
.
hoverState
=
"
in
"
,
!
i
.
options
.
delay
||!
i
.
options
.
delay
.
show
)
return
i
.
show
();
i
.
timeout
=
setTimeout
((
function
(){
"
in
"
==
i
.
hoverState
&&
i
.
show
()}),
i
.
options
.
delay
.
show
)},
e
.
prototype
.
leave
=
function
(
e
){
var
i
=
e
instanceof
this
.
constructor
?
e
:
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
);
if
(
i
||
(
i
=
new
this
.
constructor
(
e
.
currentTarget
,
this
.
getDelegateOptions
()),
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
,
i
)),
clearTimeout
(
i
.
timeout
),
i
.
hoverState
=
"
out
"
,
!
i
.
options
.
delay
||!
i
.
options
.
delay
.
hide
)
return
i
.
hide
();
i
.
timeout
=
setTimeout
((
function
(){
"
out
"
==
i
.
hoverState
&&
i
.
hide
()}),
i
.
options
.
delay
.
hide
)},
e
.
prototype
.
show
=
function
(){
var
e
=
t
.
Event
(
"
show.bs.
"
+
this
.
type
);
if
(
this
.
hasContent
()
&&
this
.
enabled
){
this
.
$element
.
trigger
(
e
);
var
i
=
t
.
contains
(
document
.
documentElement
,
this
.
$element
[
0
]);
if
(
e
.
isDefaultPrevented
()
||!
i
)
return
;
var
o
=
this
,
s
=
this
.
tip
(),
n
=
this
.
getUID
(
this
.
type
);
this
.
setContent
(),
s
.
attr
(
"
id
"
,
n
),
this
.
$element
.
attr
(
"
aria-describedby
"
,
n
),
this
.
options
.
animation
&&
s
.
addClass
(
"
fade
"
);
var
r
=
"
function
"
==
typeof
this
.
options
.
placement
?
this
.
options
.
placement
.
call
(
this
,
s
[
0
],
this
.
$element
[
0
]):
this
.
options
.
placement
,
a
=
/
\s?
auto
?\s?
/i
,
l
=
a
.
test
(
r
);
l
&&
(
r
=
r
.
replace
(
a
,
""
)
||
"
top
"
),
s
.
detach
().
css
({
top
:
0
,
left
:
0
,
display
:
"
block
"
}).
addClass
(
r
).
data
(
"
bs.
"
+
this
.
type
,
this
),
this
.
options
.
container
?
s
.
appendTo
(
this
.
options
.
container
):
s
.
insertAfter
(
this
.
$element
);
var
h
=
this
.
getPosition
(),
p
=
s
[
0
].
offsetWidth
,
c
=
s
[
0
].
offsetHeight
;
if
(
l
){
var
d
=
r
,
f
=
this
.
$element
.
parent
(),
u
=
this
.
getPosition
(
f
);
r
=
"
bottom
"
==
r
&&
h
.
top
+
h
.
height
+
c
-
u
.
scroll
>
u
.
height
?
"
top
"
:
"
top
"
==
r
&&
h
.
top
-
u
.
scroll
-
c
<
0
?
"
bottom
"
:
"
right
"
==
r
&&
h
.
right
+
p
>
u
.
width
?
"
left
"
:
"
left
"
==
r
&&
h
.
left
-
p
<
u
.
left
?
"
right
"
:
r
,
s
.
removeClass
(
d
).
addClass
(
r
)}
var
g
=
this
.
getCalculatedOffset
(
r
,
h
,
p
,
c
);
this
.
applyPlacement
(
g
,
r
);
var
v
=
function
(){
o
.
$element
.
trigger
(
"
shown.bs.
"
+
o
.
type
),
o
.
hoverState
=
null
};
t
.
support
.
transition
&&
this
.
$tip
.
hasClass
(
"
fade
"
)?
s
.
one
(
"
bsTransitionEnd
"
,
v
).
emulateTransitionEnd
(
150
):
v
()}},
e
.
prototype
.
applyPlacement
=
function
(
e
,
i
){
var
o
=
this
.
tip
(),
s
=
o
[
0
].
offsetWidth
,
n
=
o
[
0
].
offsetHeight
,
r
=
parseInt
(
o
.
css
(
"
margin-top
"
),
10
),
a
=
parseInt
(
o
.
css
(
"
margin-left
"
),
10
);
isNaN
(
r
)
&&
(
r
=
0
),
isNaN
(
a
)
&&
(
a
=
0
),
e
.
top
=
e
.
top
+
r
,
e
.
left
=
e
.
left
+
a
,
t
.
offset
.
setOffset
(
o
[
0
],
t
.
extend
({
using
:
function
(
t
){
o
.
css
({
top
:
Math
.
round
(
t
.
top
),
left
:
Math
.
round
(
t
.
left
)})}},
e
),
0
),
o
.
addClass
(
"
in
"
);
var
l
=
o
[
0
].
offsetWidth
,
h
=
o
[
0
].
offsetHeight
;
"
top
"
==
i
&&
h
!=
n
&&
(
e
.
top
=
e
.
top
+
n
-
h
);
var
p
=
this
.
getViewportAdjustedDelta
(
i
,
e
,
l
,
h
);
p
.
left
?
e
.
left
+=
p
.
left
:
e
.
top
+=
p
.
top
;
var
c
=
p
.
left
?
2
*
p
.
left
-
s
+
l
:
2
*
p
.
top
-
n
+
h
,
d
=
p
.
left
?
"
left
"
:
"
top
"
,
f
=
p
.
left
?
"
offsetWidth
"
:
"
offsetHeight
"
;
o
.
offset
(
e
),
this
.
replaceArrow
(
c
,
o
[
0
][
f
],
d
)},
e
.
prototype
.
replaceArrow
=
function
(
t
,
e
,
i
){
this
.
arrow
().
css
(
i
,
t
?
50
*
(
1
-
t
/
e
)
+
"
%
"
:
""
)},
e
.
prototype
.
setContent
=
function
(){
var
t
=
this
.
tip
(),
e
=
this
.
getTitle
();
t
.
find
(
"
.tooltip-inner
"
)[
this
.
options
.
html
?
"
html
"
:
"
text
"
](
e
),
t
.
removeClass
(
"
fade in top bottom left right
"
)},
e
.
prototype
.
hide
=
function
(){
var
e
=
this
,
i
=
this
.
tip
(),
o
=
t
.
Event
(
"
hide.bs.
"
+
this
.
type
);
function
s
(){
"
in
"
!=
e
.
hoverState
&&
i
.
detach
(),
e
.
$element
.
trigger
(
"
hidden.bs.
"
+
e
.
type
)}
if
(
this
.
$element
.
removeAttr
(
"
aria-describedby
"
),
this
.
$element
.
trigger
(
o
),
!
o
.
isDefaultPrevented
())
return
i
.
removeClass
(
"
in
"
),
t
.
support
.
transition
&&
this
.
$tip
.
hasClass
(
"
fade
"
)?
i
.
one
(
"
bsTransitionEnd
"
,
s
).
emulateTransitionEnd
(
150
):
s
(),
this
.
hoverState
=
null
,
this
},
e
.
prototype
.
fixTitle
=
function
(){
var
t
=
this
.
$element
;(
t
.
attr
(
"
title
"
)
||
"
string
"
!=
typeof
t
.
attr
(
"
data-original-title
"
))
&&
t
.
attr
(
"
data-original-title
"
,
t
.
attr
(
"
title
"
)
||
""
).
attr
(
"
title
"
,
""
)},
e
.
prototype
.
hasContent
=
function
(){
return
this
.
getTitle
()},
e
.
prototype
.
getPosition
=
function
(
e
){
var
i
=
(
e
=
e
||
this
.
$element
)[
0
],
o
=
"
BODY
"
==
i
.
tagName
;
return
t
.
extend
({},
"
function
"
==
typeof
i
.
getBoundingClientRect
?
i
.
getBoundingClientRect
():
null
,{
scroll
:
o
?
document
.
documentElement
.
scrollTop
||
document
.
body
.
scrollTop
:
e
.
scrollTop
(),
width
:
o
?
t
(
window
).
width
():
e
.
outerWidth
(),
height
:
o
?
t
(
window
).
height
():
e
.
outerHeight
()},
o
?{
top
:
0
,
left
:
0
}:
e
.
offset
())},
e
.
prototype
.
getCalculatedOffset
=
function
(
t
,
e
,
i
,
o
){
return
"
bottom
"
==
t
?{
top
:
e
.
top
+
e
.
height
,
left
:
e
.
left
+
e
.
width
/
2
-
i
/
2
}:
"
top
"
==
t
?{
top
:
e
.
top
-
o
,
left
:
e
.
left
+
e
.
width
/
2
-
i
/
2
}:
"
left
"
==
t
?{
top
:
e
.
top
+
e
.
height
/
2
-
o
/
2
,
left
:
e
.
left
-
i
}:{
top
:
e
.
top
+
e
.
height
/
2
-
o
/
2
,
left
:
e
.
left
+
e
.
width
}},
e
.
prototype
.
getViewportAdjustedDelta
=
function
(
t
,
e
,
i
,
o
){
var
s
=
{
top
:
0
,
left
:
0
};
if
(
!
this
.
$viewport
)
return
s
;
var
n
=
this
.
options
.
viewport
&&
this
.
options
.
viewport
.
padding
||
0
,
r
=
this
.
getPosition
(
this
.
$viewport
);
if
(
/right|left/
.
test
(
t
)){
var
a
=
e
.
top
-
n
-
r
.
scroll
,
l
=
e
.
top
+
n
-
r
.
scroll
+
o
;
a
<
r
.
top
?
s
.
top
=
r
.
top
-
a
:
l
>
r
.
top
+
r
.
height
&&
(
s
.
top
=
r
.
top
+
r
.
height
-
l
)}
else
{
var
h
=
e
.
left
-
n
,
p
=
e
.
left
+
n
+
i
;
h
<
r
.
left
?
s
.
left
=
r
.
left
-
h
:
p
>
r
.
width
&&
(
s
.
left
=
r
.
left
+
r
.
width
-
p
)}
return
s
},
e
.
prototype
.
getTitle
=
function
(){
var
t
=
this
.
$element
,
e
=
this
.
options
;
return
t
.
attr
(
"
data-original-title
"
)
||
(
"
function
"
==
typeof
e
.
title
?
e
.
title
.
call
(
t
[
0
]):
e
.
title
)},
e
.
prototype
.
getUID
=
function
(
t
){
do
{
t
+=~~
(
1
e6
*
Math
.
random
())}
while
(
document
.
getElementById
(
t
));
return
t
},
e
.
prototype
.
tip
=
function
(){
return
this
.
$tip
=
this
.
$tip
||
t
(
this
.
options
.
template
)},
e
.
prototype
.
arrow
=
function
(){
return
this
.
$arrow
=
this
.
$arrow
||
this
.
tip
().
find
(
"
.tooltip-arrow
"
)},
e
.
prototype
.
validate
=
function
(){
this
.
$element
[
0
].
parentNode
||
(
this
.
hide
(),
this
.
$element
=
null
,
this
.
options
=
null
)},
e
.
prototype
.
enable
=
function
(){
this
.
enabled
=!
0
},
e
.
prototype
.
disable
=
function
(){
this
.
enabled
=!
1
},
e
.
prototype
.
toggleEnabled
=
function
(){
this
.
enabled
=!
this
.
enabled
},
e
.
prototype
.
toggle
=
function
(
e
){
var
i
=
this
;
e
&&
((
i
=
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
))
||
(
i
=
new
this
.
constructor
(
e
.
currentTarget
,
this
.
getDelegateOptions
()),
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
,
i
))),
i
.
tip
().
hasClass
(
"
in
"
)?
i
.
leave
(
i
):
i
.
enter
(
i
)},
e
.
prototype
.
destroy
=
function
(){
clearTimeout
(
this
.
timeout
),
this
.
hide
().
$element
.
off
(
"
.
"
+
this
.
type
).
removeData
(
"
bs.
"
+
this
.
type
)};
var
i
=
t
.
fn
.
tooltip
;
t
.
fn
.
tooltip
=
function
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.tooltip
"
),
n
=
"
object
"
==
typeof
i
&&
i
;(
s
||
"
destroy
"
!=
i
)
&&
(
s
||
o
.
data
(
"
bs.tooltip
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]())}))},
t
.
fn
.
tooltip
.
Constructor
=
e
,
t
.
fn
.
tooltip
.
noConflict
=
function
(){
return
t
.
fn
.
tooltip
=
i
,
this
}}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
t
,
e
){
this
.
init
(
"
popover
"
,
t
,
e
)};
if
(
!
t
.
fn
.
tooltip
)
throw
new
Error
(
"
Popover requires tooltip.js
"
);
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
t
.
extend
({},
t
.
fn
.
tooltip
.
Constructor
.
DEFAULTS
,{
placement
:
"
right
"
,
trigger
:
"
click
"
,
content
:
""
,
template
:
'
<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>
'
}),
e
.
prototype
=
t
.
extend
({},
t
.
fn
.
tooltip
.
Constructor
.
prototype
),
e
.
prototype
.
constructor
=
e
,
e
.
prototype
.
getDefaults
=
function
(){
return
e
.
DEFAULTS
},
e
.
prototype
.
setContent
=
function
(){
var
t
=
this
.
tip
(),
e
=
this
.
getTitle
(),
i
=
this
.
getContent
();
t
.
find
(
"
.popover-title
"
)[
this
.
options
.
html
?
"
html
"
:
"
text
"
](
e
),
t
.
find
(
"
.popover-content
"
).
empty
()[
this
.
options
.
html
?
"
string
"
==
typeof
i
?
"
html
"
:
"
append
"
:
"
text
"
](
i
),
t
.
removeClass
(
"
fade top bottom left right in
"
),
t
.
find
(
"
.popover-title
"
).
html
()
||
t
.
find
(
"
.popover-title
"
).
hide
()},
e
.
prototype
.
hasContent
=
function
(){
return
this
.
getTitle
()
||
this
.
getContent
()},
e
.
prototype
.
getContent
=
function
(){
var
t
=
this
.
$element
,
e
=
this
.
options
;
return
t
.
attr
(
"
data-content
"
)
||
(
"
function
"
==
typeof
e
.
content
?
e
.
content
.
call
(
t
[
0
]):
e
.
content
)},
e
.
prototype
.
arrow
=
function
(){
return
this
.
$arrow
=
this
.
$arrow
||
this
.
tip
().
find
(
"
.arrow
"
)},
e
.
prototype
.
tip
=
function
(){
return
this
.
$tip
||
(
this
.
$tip
=
t
(
this
.
options
.
template
)),
this
.
$tip
};
var
i
=
t
.
fn
.
popover
;
t
.
fn
.
popover
=
function
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.popover
"
),
n
=
"
object
"
==
typeof
i
&&
i
;(
s
||
"
destroy
"
!=
i
)
&&
(
s
||
o
.
data
(
"
bs.popover
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]())}))},
t
.
fn
.
popover
.
Constructor
=
e
,
t
.
fn
.
popover
.
noConflict
=
function
(){
return
t
.
fn
.
popover
=
i
,
this
}}(
jQuery
),
function
(
t
){
"
use strict
"
;
function
e
(
i
,
o
){
var
s
=
t
.
proxy
(
this
.
process
,
this
);
this
.
$body
=
t
(
"
body
"
),
this
.
$scrollElement
=
t
(
i
).
is
(
"
body
"
)?
t
(
window
):
t
(
i
),
this
.
options
=
t
.
extend
({},
e
.
DEFAULTS
,
o
),
this
.
selector
=
(
this
.
options
.
target
||
""
)
+
"
.nav li > a
"
,
this
.
offsets
=
[],
this
.
targets
=
[],
this
.
activeTarget
=
null
,
this
.
scrollHeight
=
0
,
this
.
$scrollElement
.
on
(
"
scroll.bs.scrollspy
"
,
s
),
this
.
refresh
(),
this
.
process
()}
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.scrollspy
"
),
n
=
"
object
"
==
typeof
i
&&
i
;
s
||
o
.
data
(
"
bs.scrollspy
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
offset
:
10
},
e
.
prototype
.
getScrollHeight
=
function
(){
return
this
.
$scrollElement
[
0
].
scrollHeight
||
Math
.
max
(
this
.
$body
[
0
].
scrollHeight
,
document
.
documentElement
.
scrollHeight
)},
e
.
prototype
.
refresh
=
function
(){
var
e
=
"
offset
"
,
i
=
0
;
t
.
isWindow
(
this
.
$scrollElement
[
0
])
||
(
e
=
"
position
"
,
i
=
this
.
$scrollElement
.
scrollTop
()),
this
.
offsets
=
[],
this
.
targets
=
[],
this
.
scrollHeight
=
this
.
getScrollHeight
();
var
o
=
this
;
this
.
$body
.
find
(
this
.
selector
).
map
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
target
"
)
||
o
.
attr
(
"
href
"
),
n
=
/^#./
.
test
(
s
)
&&
t
(
s
);
return
n
&&
n
.
length
&&
n
.
is
(
"
:visible
"
)
&&
[[
n
[
e
]().
top
+
i
,
s
]]
||
null
})).
sort
((
function
(
t
,
e
){
return
t
[
0
]
-
e
[
0
]})).
each
((
function
(){
o
.
offsets
.
push
(
this
[
0
]),
o
.
targets
.
push
(
this
[
1
])}))},
e
.
prototype
.
process
=
function
(){
var
t
,
e
=
this
.
$scrollElement
.
scrollTop
()
+
this
.
options
.
offset
,
i
=
this
.
getScrollHeight
(),
o
=
this
.
options
.
offset
+
i
-
this
.
$scrollElement
.
height
(),
s
=
this
.
offsets
,
n
=
this
.
targets
,
r
=
this
.
activeTarget
;
if
(
this
.
scrollHeight
!=
i
&&
this
.
refresh
(),
e
>=
o
)
return
r
!=
(
t
=
n
[
n
.
length
-
1
])
&&
this
.
activate
(
t
);
if
(
r
&&
e
<=
s
[
0
])
return
r
!=
(
t
=
n
[
0
])
&&
this
.
activate
(
t
);
for
(
t
=
s
.
length
;
t
--
;)
r
!=
n
[
t
]
&&
e
>=
s
[
t
]
&&
(
!
s
[
t
+
1
]
||
e
<=
s
[
t
+
1
])
&&
this
.
activate
(
n
[
t
])},
e
.
prototype
.
activate
=
function
(
e
){
this
.
activeTarget
=
e
,
t
(
this
.
selector
).
parentsUntil
(
this
.
options
.
target
,
"
.active
"
).
removeClass
(
"
active
"
);
var
i
=
this
.
selector
+
'
[data-target="
'
+
e
+
'
"],
'
+
this
.
selector
+
'
[href="
'
+
e
+
'
"]
'
,
o
=
t
(
i
).
parents
(
"
li
"
).
addClass
(
"
active
"
);
o
.
parent
(
"
.dropdown-menu
"
).
length
&&
(
o
=
o
.
closest
(
"
li.dropdown
"
).
addClass
(
"
active
"
)),
o
.
trigger
(
"
activate.bs.scrollspy
"
)};
var
o
=
t
.
fn
.
scrollspy
;
t
.
fn
.
scrollspy
=
i
,
t
.
fn
.
scrollspy
.
Constructor
=
e
,
t
.
fn
.
scrollspy
.
noConflict
=
function
(){
return
t
.
fn
.
scrollspy
=
o
,
this
},
t
(
window
).
on
(
"
load.bs.scrollspy.data-api
"
,(
function
(){
t
(
'
[data-spy="scroll"]
'
).
each
((
function
(){
var
e
=
t
(
this
);
i
.
call
(
e
,
e
.
data
())}))}))}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
e
){
this
.
element
=
t
(
e
)};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.tab
"
);
s
||
o
.
data
(
"
bs.tab
"
,
s
=
new
e
(
this
)),
"
string
"
==
typeof
i
&&
s
[
i
]()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
prototype
.
show
=
function
(){
var
e
=
this
.
element
,
i
=
e
.
closest
(
"
ul:not(.dropdown-menu)
"
),
o
=
e
.
data
(
"
target
"
);
if
(
o
||
(
o
=
(
o
=
e
.
attr
(
"
href
"
))
&&
o
.
replace
(
/.*
(?=
#
[^\s]
*$
)
/
,
""
)),
!
e
.
parent
(
"
li
"
).
hasClass
(
"
active
"
)){
var
s
=
i
.
find
(
"
.active:last a
"
)[
0
],
n
=
t
.
Event
(
"
show.bs.tab
"
,{
relatedTarget
:
s
});
if
(
e
.
trigger
(
n
),
!
n
.
isDefaultPrevented
()){
var
r
=
t
(
o
);
this
.
activate
(
e
.
closest
(
"
li
"
),
i
),
this
.
activate
(
r
,
r
.
parent
(),(
function
(){
e
.
trigger
({
type
:
"
shown.bs.tab
"
,
relatedTarget
:
s
})}))}}},
e
.
prototype
.
activate
=
function
(
e
,
i
,
o
){
var
s
=
i
.
find
(
"
> .active
"
),
n
=
o
&&
t
.
support
.
transition
&&
s
.
hasClass
(
"
fade
"
);
function
r
(){
s
.
removeClass
(
"
active
"
).
find
(
"
> .dropdown-menu > .active
"
).
removeClass
(
"
active
"
),
e
.
addClass
(
"
active
"
),
n
?(
e
[
0
].
offsetWidth
,
e
.
addClass
(
"
in
"
)):
e
.
removeClass
(
"
fade
"
),
e
.
parent
(
"
.dropdown-menu
"
)
&&
e
.
closest
(
"
li.dropdown
"
).
addClass
(
"
active
"
),
o
&&
o
()}
n
?
s
.
one
(
"
bsTransitionEnd
"
,
r
).
emulateTransitionEnd
(
150
):
r
(),
s
.
removeClass
(
"
in
"
)};
var
o
=
t
.
fn
.
tab
;
t
.
fn
.
tab
=
i
,
t
.
fn
.
tab
.
Constructor
=
e
,
t
.
fn
.
tab
.
noConflict
=
function
(){
return
t
.
fn
.
tab
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.tab.data-api
"
,
'
[data-toggle="tab"], [data-toggle="pill"]
'
,(
function
(
e
){
e
.
preventDefault
(),
i
.
call
(
t
(
this
),
"
show
"
)}))}(
jQuery
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
i
,
o
){
this
.
options
=
t
.
extend
({},
e
.
DEFAULTS
,
o
),
this
.
$target
=
t
(
this
.
options
.
target
).
on
(
"
scroll.bs.affix.data-api
"
,
t
.
proxy
(
this
.
checkPosition
,
this
)).
on
(
"
click.bs.affix.data-api
"
,
t
.
proxy
(
this
.
checkPositionWithEventLoop
,
this
)),
this
.
$element
=
t
(
i
),
this
.
affixed
=
this
.
unpin
=
this
.
pinnedOffset
=
null
,
this
.
checkPosition
()};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.affix
"
),
n
=
"
object
"
==
typeof
i
&&
i
;
s
||
o
.
data
(
"
bs.affix
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
RESET
=
"
affix affix-top affix-bottom
"
,
e
.
DEFAULTS
=
{
offset
:
0
,
target
:
window
},
e
.
prototype
.
getPinnedOffset
=
function
(){
if
(
this
.
pinnedOffset
)
return
this
.
pinnedOffset
;
this
.
$element
.
removeClass
(
e
.
RESET
).
addClass
(
"
affix
"
);
var
t
=
this
.
$target
.
scrollTop
(),
i
=
this
.
$element
.
offset
();
return
this
.
pinnedOffset
=
i
.
top
-
t
},
e
.
prototype
.
checkPositionWithEventLoop
=
function
(){
setTimeout
(
t
.
proxy
(
this
.
checkPosition
,
this
),
1
)},
e
.
prototype
.
checkPosition
=
function
(){
if
(
this
.
$element
.
is
(
"
:visible
"
)){
var
i
=
t
(
document
).
height
(),
o
=
this
.
$target
.
scrollTop
(),
s
=
this
.
$element
.
offset
(),
n
=
this
.
options
.
offset
,
r
=
n
.
top
,
a
=
n
.
bottom
;
"
object
"
!=
typeof
n
&&
(
a
=
r
=
n
),
"
function
"
==
typeof
r
&&
(
r
=
n
.
top
(
this
.
$element
)),
"
function
"
==
typeof
a
&&
(
a
=
n
.
bottom
(
this
.
$element
));
var
l
=!
(
null
!=
this
.
unpin
&&
o
+
this
.
unpin
<=
s
.
top
)
&&
(
null
!=
a
&&
s
.
top
+
this
.
$element
.
height
()
>=
i
-
a
?
"
bottom
"
:
null
!=
r
&&
o
<=
r
&&
"
top
"
);
if
(
this
.
affixed
!==
l
){
null
!=
this
.
unpin
&&
this
.
$element
.
css
(
"
top
"
,
""
);
var
h
=
"
affix
"
+
(
l
?
"
-
"
+
l
:
""
),
p
=
t
.
Event
(
h
+
"
.bs.affix
"
);
this
.
$element
.
trigger
(
p
),
p
.
isDefaultPrevented
()
||
(
this
.
affixed
=
l
,
this
.
unpin
=
"
bottom
"
==
l
?
this
.
getPinnedOffset
():
null
,
this
.
$element
.
removeClass
(
e
.
RESET
).
addClass
(
h
).
trigger
(
t
.
Event
(
h
.
replace
(
"
affix
"
,
"
affixed
"
))),
"
bottom
"
==
l
&&
this
.
$element
.
offset
({
top
:
i
-
this
.
$element
.
height
()
-
a
}))}}};
var
o
=
t
.
fn
.
affix
;
t
.
fn
.
affix
=
i
,
t
.
fn
.
affix
.
Constructor
=
e
,
t
.
fn
.
affix
.
noConflict
=
function
(){
return
t
.
fn
.
affix
=
o
,
this
},
t
(
window
).
on
(
"
load
"
,(
function
(){
t
(
"
.article__toc
"
).
animate
({
left
:
t
(
"
.site
"
).
outerWidth
()
+
t
(
"
.site
"
).
offset
().
left
+
"
px
"
},
600
),
t
(
'
[data-spy="affix"]
'
).
each
((
function
(){
var
e
=
t
(
this
),
o
=
e
.
data
();
o
.
offset
=
o
.
offset
||
{},
o
.
offsetBottom
&&
(
o
.
offset
.
bottom
=
o
.
offsetBottom
),
o
.
offsetTop
&&
(
o
.
offset
.
top
=
o
.
offsetTop
),
i
.
call
(
e
,
o
)}))}))}(
jQuery
);
\ No newline at end of file
if
(
"
undefined
"
==
typeof
$
)
throw
new
Error
(
"
Bootstrap's JavaScript requires jQuery
"
);
!
function
(
t
){
"
use strict
"
;
t
.
fn
.
emulateTransitionEnd
=
function
(
e
){
var
i
=!
1
,
o
=
this
;
t
(
this
).
one
(
"
bsTransitionEnd
"
,(
function
(){
i
=!
0
}));
return
setTimeout
((
function
(){
i
||
t
(
o
).
trigger
(
t
.
support
.
transition
.
end
)}),
e
),
this
},
t
((
function
(){
t
.
support
.
transition
=
function
(){
var
t
=
document
.
createElement
(
"
bootstrap
"
),
e
=
{
WebkitTransition
:
"
webkitTransitionEnd
"
,
MozTransition
:
"
transitionend
"
,
OTransition
:
"
oTransitionEnd otransitionend
"
,
transition
:
"
transitionend
"
};
for
(
var
i
in
e
)
if
(
void
0
!==
t
.
style
[
i
])
return
{
end
:
e
[
i
]};
return
!
1
}(),
t
.
support
.
transition
&&
(
t
.
event
.
special
.
bsTransitionEnd
=
{
bindType
:
t
.
support
.
transition
.
end
,
delegateType
:
t
.
support
.
transition
.
end
,
handle
:
function
(
e
){
if
(
t
(
e
.
target
).
is
(
this
))
return
e
.
handleObj
.
handler
.
apply
(
this
,
arguments
)}})}))}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
'
[data-dismiss="alert"]
'
,
i
=
function
(
i
){
t
(
i
).
on
(
"
click
"
,
e
,
this
.
close
)};
i
.
VERSION
=
"
3.2.0
"
,
i
.
prototype
.
close
=
function
(
e
){
var
i
=
t
(
this
),
o
=
i
.
attr
(
"
data-target
"
);
o
||
(
o
=
(
o
=
i
.
attr
(
"
href
"
))
&&
o
.
replace
(
/.*
(?=
#
[^\s]
*$
)
/
,
""
));
var
s
=
t
(
o
);
function
n
(){
s
.
detach
().
trigger
(
"
closed.bs.alert
"
).
remove
()}
e
&&
e
.
preventDefault
(),
s
.
length
||
(
s
=
i
.
hasClass
(
"
alert
"
)?
i
:
i
.
parent
()),
s
.
trigger
(
e
=
t
.
Event
(
"
close.bs.alert
"
)),
e
.
isDefaultPrevented
()
||
(
s
.
removeClass
(
"
in
"
),
t
.
support
.
transition
&&
s
.
hasClass
(
"
fade
"
)?
s
.
one
(
"
bsTransitionEnd
"
,
n
).
emulateTransitionEnd
(
150
):
n
())};
var
o
=
t
.
fn
.
alert
;
t
.
fn
.
alert
=
function
(
e
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.alert
"
);
s
||
o
.
data
(
"
bs.alert
"
,
s
=
new
i
(
this
)),
"
string
"
==
typeof
e
&&
s
[
e
].
call
(
o
)}))},
t
.
fn
.
alert
.
Constructor
=
i
,
t
.
fn
.
alert
.
noConflict
=
function
(){
return
t
.
fn
.
alert
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.alert.data-api
"
,
e
,
i
.
prototype
.
close
)}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
i
,
o
){
this
.
$element
=
t
(
i
),
this
.
options
=
t
.
extend
({},
e
.
DEFAULTS
,
o
),
this
.
isLoading
=!
1
};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.button
"
),
n
=
"
object
"
==
typeof
i
&&
i
;
s
||
o
.
data
(
"
bs.button
"
,
s
=
new
e
(
this
,
n
)),
"
toggle
"
==
i
?
s
.
toggle
():
i
&&
s
.
setState
(
i
)}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
loadingText
:
"
loading...
"
},
e
.
prototype
.
setState
=
function
(
e
){
var
i
=
"
disabled
"
,
o
=
this
.
$element
,
s
=
o
.
is
(
"
input
"
)?
"
val
"
:
"
html
"
,
n
=
o
.
data
();
e
+=
"
Text
"
,
null
==
n
.
resetText
&&
o
.
data
(
"
resetText
"
,
o
[
s
]()),
o
[
s
](
null
==
n
[
e
]?
this
.
options
[
e
]:
n
[
e
]),
setTimeout
(
t
.
proxy
((
function
(){
"
loadingText
"
==
e
?(
this
.
isLoading
=!
0
,
o
.
addClass
(
i
).
attr
(
i
,
i
)):
this
.
isLoading
&&
(
this
.
isLoading
=!
1
,
o
.
removeClass
(
i
).
removeAttr
(
i
))}),
this
),
0
)},
e
.
prototype
.
toggle
=
function
(){
var
t
=!
0
,
e
=
this
.
$element
.
closest
(
'
[data-toggle="buttons"]
'
);
if
(
e
.
length
){
var
i
=
this
.
$element
.
find
(
"
input
"
);
"
radio
"
==
i
.
prop
(
"
type
"
)
&&
(
i
.
prop
(
"
checked
"
)
&&
this
.
$element
.
hasClass
(
"
active
"
)?
t
=!
1
:
e
.
find
(
"
.active
"
).
removeClass
(
"
active
"
)),
t
&&
i
.
prop
(
"
checked
"
,
!
this
.
$element
.
hasClass
(
"
active
"
)).
trigger
(
"
change
"
)}
t
&&
this
.
$element
.
toggleClass
(
"
active
"
)};
var
o
=
t
.
fn
.
button
;
t
.
fn
.
button
=
i
,
t
.
fn
.
button
.
Constructor
=
e
,
t
.
fn
.
button
.
noConflict
=
function
(){
return
t
.
fn
.
button
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.button.data-api
"
,
'
[data-toggle^="button"]
'
,(
function
(
e
){
var
o
=
t
(
e
.
target
);
o
.
hasClass
(
"
btn
"
)
||
(
o
=
o
.
closest
(
"
.btn
"
)),
i
.
call
(
o
,
"
toggle
"
),
e
.
preventDefault
()}))}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
e
,
i
){
this
.
$element
=
t
(
e
).
on
(
"
keydown.bs.carousel
"
,
t
.
proxy
(
this
.
keydown
,
this
)),
this
.
$indicators
=
this
.
$element
.
find
(
"
.carousel-indicators
"
),
this
.
options
=
i
,
this
.
paused
=
this
.
sliding
=
this
.
interval
=
this
.
$active
=
this
.
$items
=
null
,
"
hover
"
==
this
.
options
.
pause
&&
this
.
$element
.
on
(
"
mouseenter.bs.carousel
"
,
t
.
proxy
(
this
.
pause
,
this
)).
on
(
"
mouseleave.bs.carousel
"
,
t
.
proxy
(
this
.
cycle
,
this
))};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.carousel
"
),
n
=
t
.
extend
({},
e
.
DEFAULTS
,
o
.
data
(),
"
object
"
==
typeof
i
&&
i
),
r
=
"
string
"
==
typeof
i
?
i
:
n
.
slide
;
s
||
o
.
data
(
"
bs.carousel
"
,
s
=
new
e
(
this
,
n
)),
"
number
"
==
typeof
i
?
s
.
to
(
i
):
r
?
s
[
r
]():
n
.
interval
&&
s
.
pause
().
cycle
()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
interval
:
5
e3
,
pause
:
"
hover
"
,
wrap
:
!
0
},
e
.
prototype
.
keydown
=
function
(
t
){
switch
(
t
.
which
){
case
37
:
this
.
prev
();
break
;
case
39
:
this
.
next
();
break
;
default
:
return
}
t
.
preventDefault
()},
e
.
prototype
.
cycle
=
function
(
e
){
return
e
||
(
this
.
paused
=!
1
),
this
.
interval
&&
clearInterval
(
this
.
interval
),
this
.
options
.
interval
&&!
this
.
paused
&&
(
this
.
interval
=
setInterval
(
t
.
proxy
(
this
.
next
,
this
),
this
.
options
.
interval
)),
this
},
e
.
prototype
.
getItemIndex
=
function
(
t
){
return
this
.
$items
=
t
.
parent
().
children
(
"
.item
"
),
this
.
$items
.
index
(
t
||
this
.
$active
)},
e
.
prototype
.
to
=
function
(
e
){
var
i
=
this
,
o
=
this
.
getItemIndex
(
this
.
$active
=
this
.
$element
.
find
(
"
.item.active
"
));
if
(
!
(
e
>
this
.
$items
.
length
-
1
||
e
<
0
))
return
this
.
sliding
?
this
.
$element
.
one
(
"
slid.bs.carousel
"
,(
function
(){
i
.
to
(
e
)})):
o
==
e
?
this
.
pause
().
cycle
():
this
.
slide
(
e
>
o
?
"
next
"
:
"
prev
"
,
t
(
this
.
$items
[
e
]))},
e
.
prototype
.
pause
=
function
(
e
){
return
e
||
(
this
.
paused
=!
0
),
this
.
$element
.
find
(
"
.next, .prev
"
).
length
&&
t
.
support
.
transition
&&
(
this
.
$element
.
trigger
(
t
.
support
.
transition
.
end
),
this
.
cycle
(
!
0
)),
this
.
interval
=
clearInterval
(
this
.
interval
),
this
},
e
.
prototype
.
next
=
function
(){
if
(
!
this
.
sliding
)
return
this
.
slide
(
"
next
"
)},
e
.
prototype
.
prev
=
function
(){
if
(
!
this
.
sliding
)
return
this
.
slide
(
"
prev
"
)},
e
.
prototype
.
slide
=
function
(
e
,
i
){
var
o
=
this
.
$element
.
find
(
"
.item.active
"
),
s
=
i
||
o
[
e
](),
n
=
this
.
interval
,
r
=
"
next
"
==
e
?
"
left
"
:
"
right
"
,
a
=
"
next
"
==
e
?
"
first
"
:
"
last
"
,
l
=
this
;
if
(
!
s
.
length
){
if
(
!
this
.
options
.
wrap
)
return
;
s
=
this
.
$element
.
find
(
"
.item
"
)[
a
]()}
if
(
s
.
hasClass
(
"
active
"
))
return
this
.
sliding
=!
1
;
var
h
=
s
[
0
],
p
=
t
.
Event
(
"
slide.bs.carousel
"
,{
relatedTarget
:
h
,
direction
:
r
});
if
(
this
.
$element
.
trigger
(
p
),
!
p
.
isDefaultPrevented
()){
if
(
this
.
sliding
=!
0
,
n
&&
this
.
pause
(),
this
.
$indicators
.
length
){
this
.
$indicators
.
find
(
"
.active
"
).
removeClass
(
"
active
"
);
var
c
=
t
(
this
.
$indicators
.
children
()[
this
.
getItemIndex
(
s
)]);
c
&&
c
.
addClass
(
"
active
"
)}
var
d
=
t
.
Event
(
"
slid.bs.carousel
"
,{
relatedTarget
:
h
,
direction
:
r
});
return
t
.
support
.
transition
&&
this
.
$element
.
hasClass
(
"
slide
"
)?(
s
.
addClass
(
e
),
s
[
0
].
offsetWidth
,
o
.
addClass
(
r
),
s
.
addClass
(
r
),
o
.
one
(
"
bsTransitionEnd
"
,(
function
(){
s
.
removeClass
([
e
,
r
].
join
(
"
"
)).
addClass
(
"
active
"
),
o
.
removeClass
([
"
active
"
,
r
].
join
(
"
"
)),
l
.
sliding
=!
1
,
setTimeout
((
function
(){
l
.
$element
.
trigger
(
d
)}),
0
)})).
emulateTransitionEnd
(
1
e3
*
o
.
css
(
"
transition-duration
"
).
slice
(
0
,
-
1
))):(
o
.
removeClass
(
"
active
"
),
s
.
addClass
(
"
active
"
),
this
.
sliding
=!
1
,
this
.
$element
.
trigger
(
d
)),
n
&&
this
.
cycle
(),
this
}};
var
o
=
t
.
fn
.
carousel
;
t
.
fn
.
carousel
=
i
,
t
.
fn
.
carousel
.
Constructor
=
e
,
t
.
fn
.
carousel
.
noConflict
=
function
(){
return
t
.
fn
.
carousel
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.carousel.data-api
"
,
"
[data-slide], [data-slide-to]
"
,(
function
(
e
){
var
o
,
s
=
t
(
this
),
n
=
t
(
s
.
attr
(
"
data-target
"
)
||
(
o
=
s
.
attr
(
"
href
"
))
&&
o
.
replace
(
/.*
(?=
#
[^\s]
+$
)
/
,
""
));
if
(
n
.
hasClass
(
"
carousel
"
)){
var
r
=
t
.
extend
({},
n
.
data
(),
s
.
data
()),
a
=
s
.
attr
(
"
data-slide-to
"
);
a
&&
(
r
.
interval
=!
1
),
i
.
call
(
n
,
r
),
a
&&
n
.
data
(
"
bs.carousel
"
).
to
(
a
),
e
.
preventDefault
()}})),
t
(
window
).
on
(
"
load
"
,(
function
(){
t
(
'
[data-ride="carousel"]
'
).
each
((
function
(){
var
e
=
t
(
this
);
i
.
call
(
e
,
e
.
data
())}))}))}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
i
,
o
){
this
.
$element
=
t
(
i
),
this
.
options
=
t
.
extend
({},
e
.
DEFAULTS
,
o
),
this
.
transitioning
=
null
,
this
.
options
.
parent
&&
(
this
.
$parent
=
t
(
this
.
options
.
parent
)),
this
.
options
.
toggle
&&
this
.
toggle
()};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.collapse
"
),
n
=
t
.
extend
({},
e
.
DEFAULTS
,
o
.
data
(),
"
object
"
==
typeof
i
&&
i
);
!
s
&&
n
.
toggle
&&
"
show
"
==
i
&&
(
i
=!
i
),
s
||
o
.
data
(
"
bs.collapse
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
toggle
:
!
0
},
e
.
prototype
.
dimension
=
function
(){
return
this
.
$element
.
hasClass
(
"
width
"
)?
"
width
"
:
"
height
"
},
e
.
prototype
.
show
=
function
(){
if
(
!
this
.
transitioning
&&!
this
.
$element
.
hasClass
(
"
in
"
)){
var
e
=
t
.
Event
(
"
show.bs.collapse
"
);
if
(
this
.
$element
.
trigger
(
e
),
!
e
.
isDefaultPrevented
()){
var
o
=
this
.
$parent
&&
this
.
$parent
.
find
(
"
> .panel > .in
"
);
if
(
o
&&
o
.
length
){
var
s
=
o
.
data
(
"
bs.collapse
"
);
if
(
s
&&
s
.
transitioning
)
return
;
i
.
call
(
o
,
"
hide
"
),
s
||
o
.
data
(
"
bs.collapse
"
,
null
)}
var
n
=
this
.
dimension
();
this
.
$element
.
removeClass
(
"
collapse
"
).
addClass
(
"
collapsing
"
)[
n
](
0
),
this
.
transitioning
=
1
;
var
r
=
function
(){
this
.
$element
.
removeClass
(
"
collapsing
"
).
addClass
(
"
collapse in
"
)[
n
](
""
),
this
.
transitioning
=
0
,
this
.
$element
.
trigger
(
"
shown.bs.collapse
"
)};
if
(
!
t
.
support
.
transition
)
return
r
.
call
(
this
);
var
a
=
t
.
camelCase
([
"
scroll
"
,
n
].
join
(
"
-
"
));
this
.
$element
.
one
(
"
bsTransitionEnd
"
,
t
.
proxy
(
r
,
this
)).
emulateTransitionEnd
(
350
)[
n
](
this
.
$element
[
0
][
a
])}}},
e
.
prototype
.
hide
=
function
(){
if
(
!
this
.
transitioning
&&
this
.
$element
.
hasClass
(
"
in
"
)){
var
e
=
t
.
Event
(
"
hide.bs.collapse
"
);
if
(
this
.
$element
.
trigger
(
e
),
!
e
.
isDefaultPrevented
()){
var
i
=
this
.
dimension
();
this
.
$element
[
i
](
this
.
$element
[
i
]())[
0
].
offsetHeight
,
this
.
$element
.
addClass
(
"
collapsing
"
).
removeClass
(
"
collapse
"
).
removeClass
(
"
in
"
),
this
.
transitioning
=
1
;
var
o
=
function
(){
this
.
transitioning
=
0
,
this
.
$element
.
trigger
(
"
hidden.bs.collapse
"
).
removeClass
(
"
collapsing
"
).
addClass
(
"
collapse
"
)};
if
(
!
t
.
support
.
transition
)
return
o
.
call
(
this
);
this
.
$element
[
i
](
0
).
one
(
"
bsTransitionEnd
"
,
t
.
proxy
(
o
,
this
)).
emulateTransitionEnd
(
350
)}}},
e
.
prototype
.
toggle
=
function
(){
this
[
this
.
$element
.
hasClass
(
"
in
"
)?
"
hide
"
:
"
show
"
]()};
var
o
=
t
.
fn
.
collapse
;
t
.
fn
.
collapse
=
i
,
t
.
fn
.
collapse
.
Constructor
=
e
,
t
.
fn
.
collapse
.
noConflict
=
function
(){
return
t
.
fn
.
collapse
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.collapse.data-api
"
,
'
[data-toggle="collapse"]
'
,(
function
(
e
){
var
o
,
s
=
t
(
this
),
n
=
s
.
attr
(
"
data-target
"
)
||
e
.
preventDefault
()
||
(
o
=
s
.
attr
(
"
href
"
))
&&
o
.
replace
(
/.*
(?=
#
[^\s]
+$
)
/
,
""
),
r
=
t
(
n
),
a
=
r
.
data
(
"
bs.collapse
"
),
l
=
a
?
"
toggle
"
:
s
.
data
(),
h
=
s
.
attr
(
"
data-parent
"
),
p
=
h
&&
t
(
h
);
a
&&
a
.
transitioning
||
(
p
&&
p
.
find
(
'
[data-toggle="collapse"][data-parent="
'
+
h
+
'
"]
'
).
not
(
s
).
addClass
(
"
collapsed
"
),
s
[
r
.
hasClass
(
"
in
"
)?
"
addClass
"
:
"
removeClass
"
](
"
collapsed
"
)),
i
.
call
(
r
,
l
)}))}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
"
.dropdown-backdrop
"
,
i
=
'
[data-toggle="dropdown"]
'
,
o
=
function
(
e
){
t
(
e
).
on
(
"
click.bs.dropdown
"
,
this
.
toggle
)};
function
s
(
o
){
o
&&
3
===
o
.
which
||
(
t
(
e
).
remove
(),
t
(
i
).
each
((
function
(){
var
e
=
n
(
t
(
this
)),
i
=
{
relatedTarget
:
this
};
e
.
hasClass
(
"
open
"
)
&&
(
e
.
trigger
(
o
=
t
.
Event
(
"
hide.bs.dropdown
"
,
i
)),
o
.
isDefaultPrevented
()
||
e
.
removeClass
(
"
open
"
).
trigger
(
"
hidden.bs.dropdown
"
,
i
))})))}
function
n
(
e
){
var
i
=
e
.
attr
(
"
data-target
"
);
i
||
(
i
=
(
i
=
e
.
attr
(
"
href
"
))
&&
/#
[
A-Za-z
]
/
.
test
(
i
)
&&
i
.
replace
(
/.*
(?=
#
[^\s]
*$
)
/
,
""
));
var
o
=
i
&&
t
(
i
);
return
o
&&
o
.
length
?
o
:
e
.
parent
()}
o
.
VERSION
=
"
3.2.0
"
,
o
.
prototype
.
toggle
=
function
(
e
){
var
i
=
t
(
this
);
if
(
!
i
.
is
(
"
.disabled, :disabled
"
)){
var
o
=
n
(
i
),
r
=
o
.
hasClass
(
"
open
"
);
if
(
s
(),
!
r
){
"
ontouchstart
"
in
document
.
documentElement
&&!
o
.
closest
(
"
.navbar-nav
"
).
length
&&
t
(
'
<div class="dropdown-backdrop"/>
'
).
insertAfter
(
t
(
this
)).
on
(
"
click
"
,
s
);
var
a
=
{
relatedTarget
:
this
};
if
(
o
.
trigger
(
e
=
t
.
Event
(
"
show.bs.dropdown
"
,
a
)),
e
.
isDefaultPrevented
())
return
;
i
.
trigger
(
"
focus
"
),
o
.
toggleClass
(
"
open
"
).
trigger
(
"
shown.bs.dropdown
"
,
a
)}
return
!
1
}},
o
.
prototype
.
keydown
=
function
(
e
){
if
(
/
(
38|40|27
)
/
.
test
(
e
.
keyCode
)){
var
o
=
t
(
this
);
if
(
e
.
preventDefault
(),
e
.
stopPropagation
(),
!
o
.
is
(
"
.disabled, :disabled
"
)){
var
s
=
n
(
o
),
r
=
s
.
hasClass
(
"
open
"
);
if
(
!
r
||
r
&&
27
==
e
.
keyCode
)
return
27
==
e
.
which
&&
s
.
find
(
i
).
trigger
(
"
focus
"
),
o
.
trigger
(
"
click
"
);
var
a
=
"
li:not(.divider):visible a
"
,
l
=
s
.
find
(
'
[role="menu"]
'
+
a
+
'
, [role="listbox"]
'
+
a
);
if
(
l
.
length
){
var
h
=
l
.
index
(
l
.
filter
(
"
:focus
"
));
38
==
e
.
keyCode
&&
h
>
0
&&
h
--
,
40
==
e
.
keyCode
&&
h
<
l
.
length
-
1
&&
h
++
,
~
h
||
(
h
=
0
),
l
.
eq
(
h
).
trigger
(
"
focus
"
)}}}};
var
r
=
t
.
fn
.
dropdown
;
t
.
fn
.
dropdown
=
function
(
e
){
return
this
.
each
((
function
(){
var
i
=
t
(
this
),
s
=
i
.
data
(
"
bs.dropdown
"
);
s
||
i
.
data
(
"
bs.dropdown
"
,
s
=
new
o
(
this
)),
"
string
"
==
typeof
e
&&
s
[
e
].
call
(
i
)}))},
t
.
fn
.
dropdown
.
Constructor
=
o
,
t
.
fn
.
dropdown
.
noConflict
=
function
(){
return
t
.
fn
.
dropdown
=
r
,
this
},
t
(
document
).
on
(
"
click.bs.dropdown.data-api
"
,
s
).
on
(
"
click.bs.dropdown.data-api
"
,
"
.dropdown form
"
,(
function
(
t
){
t
.
stopPropagation
()})).
on
(
"
click.bs.dropdown.data-api
"
,
i
,
o
.
prototype
.
toggle
).
on
(
"
keydown.bs.dropdown.data-api
"
,
i
+
'
, [role="menu"], [role="listbox"]
'
,
o
.
prototype
.
keydown
)}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
e
,
i
){
this
.
options
=
i
,
this
.
$body
=
t
(
document
.
body
),
this
.
$element
=
t
(
e
),
this
.
$backdrop
=
this
.
isShown
=
null
,
this
.
scrollbarWidth
=
0
,
this
.
options
.
remote
&&
this
.
$element
.
find
(
"
.modal-content
"
).
load
(
this
.
options
.
remote
,
t
.
proxy
((
function
(){
this
.
$element
.
trigger
(
"
loaded.bs.modal
"
)}),
this
))};
function
i
(
i
,
o
){
return
this
.
each
((
function
(){
var
s
=
t
(
this
),
n
=
s
.
data
(
"
bs.modal
"
),
r
=
t
.
extend
({},
e
.
DEFAULTS
,
s
.
data
(),
"
object
"
==
typeof
i
&&
i
);
n
||
s
.
data
(
"
bs.modal
"
,
n
=
new
e
(
this
,
r
)),
"
string
"
==
typeof
i
?
n
[
i
](
o
):
r
.
show
&&
n
.
show
(
o
)}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
backdrop
:
!
0
,
keyboard
:
!
0
,
show
:
!
0
},
e
.
prototype
.
toggle
=
function
(
t
){
return
this
.
isShown
?
this
.
hide
():
this
.
show
(
t
)},
e
.
prototype
.
show
=
function
(
e
){
var
i
=
this
,
o
=
t
.
Event
(
"
show.bs.modal
"
,{
relatedTarget
:
e
});
this
.
$element
.
trigger
(
o
),
this
.
isShown
||
o
.
isDefaultPrevented
()
||
(
this
.
isShown
=!
0
,
this
.
checkScrollbar
(),
this
.
$body
.
addClass
(
"
modal-open
"
),
this
.
setScrollbar
(),
this
.
escape
(),
this
.
$element
.
on
(
"
click.dismiss.bs.modal
"
,
'
[data-dismiss="modal"]
'
,
t
.
proxy
(
this
.
hide
,
this
)),
this
.
backdrop
((
function
(){
var
o
=
t
.
support
.
transition
&&
i
.
$element
.
hasClass
(
"
fade
"
);
i
.
$element
.
parent
().
length
||
i
.
$element
.
appendTo
(
i
.
$body
),
i
.
$element
.
show
().
scrollTop
(
0
),
o
&&
i
.
$element
[
0
].
offsetWidth
,
i
.
$element
.
addClass
(
"
in
"
).
attr
(
"
aria-hidden
"
,
!
1
),
i
.
enforceFocus
();
var
s
=
t
.
Event
(
"
shown.bs.modal
"
,{
relatedTarget
:
e
});
o
?
i
.
$element
.
find
(
"
.modal-dialog
"
).
one
(
"
bsTransitionEnd
"
,(
function
(){
i
.
$element
.
trigger
(
"
focus
"
).
trigger
(
s
)})).
emulateTransitionEnd
(
300
):
i
.
$element
.
trigger
(
"
focus
"
).
trigger
(
s
)})))},
e
.
prototype
.
hide
=
function
(
e
){
e
&&
e
.
preventDefault
(),
e
=
t
.
Event
(
"
hide.bs.modal
"
),
this
.
$element
.
trigger
(
e
),
this
.
isShown
&&!
e
.
isDefaultPrevented
()
&&
(
this
.
isShown
=!
1
,
this
.
$body
.
removeClass
(
"
modal-open
"
),
this
.
resetScrollbar
(),
this
.
escape
(),
t
(
document
).
off
(
"
focusin.bs.modal
"
),
this
.
$element
.
removeClass
(
"
in
"
).
attr
(
"
aria-hidden
"
,
!
0
).
off
(
"
click.dismiss.bs.modal
"
),
t
.
support
.
transition
&&
this
.
$element
.
hasClass
(
"
fade
"
)?
this
.
$element
.
one
(
"
bsTransitionEnd
"
,
t
.
proxy
(
this
.
hideModal
,
this
)).
emulateTransitionEnd
(
300
):
this
.
hideModal
())},
e
.
prototype
.
enforceFocus
=
function
(){
t
(
document
).
off
(
"
focusin.bs.modal
"
).
on
(
"
focusin.bs.modal
"
,
t
.
proxy
((
function
(
t
){
this
.
$element
[
0
]
===
t
.
target
||
this
.
$element
.
has
(
t
.
target
).
length
||
this
.
$element
.
trigger
(
"
focus
"
)}),
this
))},
e
.
prototype
.
escape
=
function
(){
this
.
isShown
&&
this
.
options
.
keyboard
?
this
.
$element
.
on
(
"
keyup.dismiss.bs.modal
"
,
t
.
proxy
((
function
(
t
){
27
==
t
.
which
&&
this
.
hide
()}),
this
)):
this
.
isShown
||
this
.
$element
.
off
(
"
keyup.dismiss.bs.modal
"
)},
e
.
prototype
.
hideModal
=
function
(){
var
t
=
this
;
this
.
$element
.
hide
(),
this
.
backdrop
((
function
(){
t
.
$element
.
trigger
(
"
hidden.bs.modal
"
)}))},
e
.
prototype
.
removeBackdrop
=
function
(){
this
.
$backdrop
&&
this
.
$backdrop
.
remove
(),
this
.
$backdrop
=
null
},
e
.
prototype
.
backdrop
=
function
(
e
){
var
i
=
this
,
o
=
this
.
$element
.
hasClass
(
"
fade
"
)?
"
fade
"
:
""
;
if
(
this
.
isShown
&&
this
.
options
.
backdrop
){
var
s
=
t
.
support
.
transition
&&
o
;
if
(
this
.
$backdrop
=
t
(
'
<div class="modal-backdrop
'
+
o
+
'
" />
'
).
appendTo
(
this
.
$body
),
this
.
$element
.
on
(
"
click.dismiss.bs.modal
"
,
t
.
proxy
((
function
(
t
){
t
.
target
===
t
.
currentTarget
&&
(
"
static
"
==
this
.
options
.
backdrop
?
this
.
$element
[
0
].
focus
.
call
(
this
.
$element
[
0
]):
this
.
hide
.
call
(
this
))}),
this
)),
s
&&
this
.
$backdrop
[
0
].
offsetWidth
,
this
.
$backdrop
.
addClass
(
"
in
"
),
!
e
)
return
;
s
?
this
.
$backdrop
.
one
(
"
bsTransitionEnd
"
,
e
).
emulateTransitionEnd
(
150
):
e
()}
else
if
(
!
this
.
isShown
&&
this
.
$backdrop
){
this
.
$backdrop
.
removeClass
(
"
in
"
);
var
n
=
function
(){
i
.
removeBackdrop
(),
e
&&
e
()};
t
.
support
.
transition
&&
this
.
$element
.
hasClass
(
"
fade
"
)?
this
.
$backdrop
.
one
(
"
bsTransitionEnd
"
,
n
).
emulateTransitionEnd
(
150
):
n
()}
else
e
&&
e
()},
e
.
prototype
.
checkScrollbar
=
function
(){
document
.
body
.
clientWidth
>=
window
.
innerWidth
||
(
this
.
scrollbarWidth
=
this
.
scrollbarWidth
||
this
.
measureScrollbar
())},
e
.
prototype
.
setScrollbar
=
function
(){
var
t
=
parseInt
(
this
.
$body
.
css
(
"
padding-right
"
)
||
0
,
10
);
this
.
scrollbarWidth
&&
this
.
$body
.
css
(
"
padding-right
"
,
t
+
this
.
scrollbarWidth
)},
e
.
prototype
.
resetScrollbar
=
function
(){
this
.
$body
.
css
(
"
padding-right
"
,
""
)},
e
.
prototype
.
measureScrollbar
=
function
(){
var
t
=
document
.
createElement
(
"
div
"
);
t
.
className
=
"
modal-scrollbar-measure
"
,
this
.
$body
.
append
(
t
);
var
e
=
t
.
offsetWidth
-
t
.
clientWidth
;
return
this
.
$body
[
0
].
removeChild
(
t
),
e
};
var
o
=
t
.
fn
.
modal
;
t
.
fn
.
modal
=
i
,
t
.
fn
.
modal
.
Constructor
=
e
,
t
.
fn
.
modal
.
noConflict
=
function
(){
return
t
.
fn
.
modal
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.modal.data-api
"
,
'
[data-toggle="modal"]
'
,(
function
(
e
){
var
o
=
t
(
this
),
s
=
o
.
attr
(
"
href
"
),
n
=
t
(
o
.
attr
(
"
data-target
"
)
||
s
&&
s
.
replace
(
/.*
(?=
#
[^\s]
+$
)
/
,
""
)),
r
=
n
.
data
(
"
bs.modal
"
)?
"
toggle
"
:
t
.
extend
({
remote
:
!
/#/
.
test
(
s
)
&&
s
},
n
.
data
(),
o
.
data
());
o
.
is
(
"
a
"
)
&&
e
.
preventDefault
(),
n
.
one
(
"
show.bs.modal
"
,(
function
(
t
){
t
.
isDefaultPrevented
()
||
n
.
one
(
"
hidden.bs.modal
"
,(
function
(){
o
.
is
(
"
:visible
"
)
&&
o
.
trigger
(
"
focus
"
)}))})),
i
.
call
(
n
,
r
,
this
)}))}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
t
,
e
){
this
.
type
=
this
.
options
=
this
.
enabled
=
this
.
timeout
=
this
.
hoverState
=
this
.
$element
=
null
,
this
.
init
(
"
tooltip
"
,
t
,
e
)};
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
animation
:
!
0
,
placement
:
"
top
"
,
selector
:
!
1
,
template
:
'
<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>
'
,
trigger
:
"
hover focus
"
,
title
:
""
,
delay
:
0
,
html
:
!
1
,
container
:
!
1
,
viewport
:{
selector
:
"
body
"
,
padding
:
0
}},
e
.
prototype
.
init
=
function
(
e
,
i
,
o
){
this
.
enabled
=!
0
,
this
.
type
=
e
,
this
.
$element
=
t
(
i
),
this
.
options
=
this
.
getOptions
(
o
),
this
.
$viewport
=
this
.
options
.
viewport
&&
t
(
this
.
options
.
viewport
.
selector
||
this
.
options
.
viewport
);
for
(
var
s
=
this
.
options
.
trigger
.
split
(
"
"
),
n
=
s
.
length
;
n
--
;){
var
r
=
s
[
n
];
if
(
"
click
"
==
r
)
this
.
$element
.
on
(
"
click.
"
+
this
.
type
,
this
.
options
.
selector
,
t
.
proxy
(
this
.
toggle
,
this
));
else
if
(
"
manual
"
!=
r
){
var
a
=
"
hover
"
==
r
?
"
mouseenter
"
:
"
focusin
"
,
l
=
"
hover
"
==
r
?
"
mouseleave
"
:
"
focusout
"
;
this
.
$element
.
on
(
a
+
"
.
"
+
this
.
type
,
this
.
options
.
selector
,
t
.
proxy
(
this
.
enter
,
this
)),
this
.
$element
.
on
(
l
+
"
.
"
+
this
.
type
,
this
.
options
.
selector
,
t
.
proxy
(
this
.
leave
,
this
))}}
this
.
options
.
selector
?
this
.
_options
=
t
.
extend
({},
this
.
options
,{
trigger
:
"
manual
"
,
selector
:
""
}):
this
.
fixTitle
()},
e
.
prototype
.
getDefaults
=
function
(){
return
e
.
DEFAULTS
},
e
.
prototype
.
getOptions
=
function
(
e
){
return
(
e
=
t
.
extend
({},
this
.
getDefaults
(),
this
.
$element
.
data
(),
e
)).
delay
&&
"
number
"
==
typeof
e
.
delay
&&
(
e
.
delay
=
{
show
:
e
.
delay
,
hide
:
e
.
delay
}),
e
},
e
.
prototype
.
getDelegateOptions
=
function
(){
var
e
=
{},
i
=
this
.
getDefaults
();
return
this
.
_options
&&
t
.
each
(
this
.
_options
,(
function
(
t
,
o
){
i
[
t
]
!=
o
&&
(
e
[
t
]
=
o
)})),
e
},
e
.
prototype
.
enter
=
function
(
e
){
var
i
=
e
instanceof
this
.
constructor
?
e
:
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
);
if
(
i
||
(
i
=
new
this
.
constructor
(
e
.
currentTarget
,
this
.
getDelegateOptions
()),
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
,
i
)),
clearTimeout
(
i
.
timeout
),
i
.
hoverState
=
"
in
"
,
!
i
.
options
.
delay
||!
i
.
options
.
delay
.
show
)
return
i
.
show
();
i
.
timeout
=
setTimeout
((
function
(){
"
in
"
==
i
.
hoverState
&&
i
.
show
()}),
i
.
options
.
delay
.
show
)},
e
.
prototype
.
leave
=
function
(
e
){
var
i
=
e
instanceof
this
.
constructor
?
e
:
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
);
if
(
i
||
(
i
=
new
this
.
constructor
(
e
.
currentTarget
,
this
.
getDelegateOptions
()),
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
,
i
)),
clearTimeout
(
i
.
timeout
),
i
.
hoverState
=
"
out
"
,
!
i
.
options
.
delay
||!
i
.
options
.
delay
.
hide
)
return
i
.
hide
();
i
.
timeout
=
setTimeout
((
function
(){
"
out
"
==
i
.
hoverState
&&
i
.
hide
()}),
i
.
options
.
delay
.
hide
)},
e
.
prototype
.
show
=
function
(){
var
e
=
t
.
Event
(
"
show.bs.
"
+
this
.
type
);
if
(
this
.
hasContent
()
&&
this
.
enabled
){
this
.
$element
.
trigger
(
e
);
var
i
=
t
.
contains
(
document
.
documentElement
,
this
.
$element
[
0
]);
if
(
e
.
isDefaultPrevented
()
||!
i
)
return
;
var
o
=
this
,
s
=
this
.
tip
(),
n
=
this
.
getUID
(
this
.
type
);
this
.
setContent
(),
s
.
attr
(
"
id
"
,
n
),
this
.
$element
.
attr
(
"
aria-describedby
"
,
n
),
this
.
options
.
animation
&&
s
.
addClass
(
"
fade
"
);
var
r
=
"
function
"
==
typeof
this
.
options
.
placement
?
this
.
options
.
placement
.
call
(
this
,
s
[
0
],
this
.
$element
[
0
]):
this
.
options
.
placement
,
a
=
/
\s?
auto
?\s?
/i
,
l
=
a
.
test
(
r
);
l
&&
(
r
=
r
.
replace
(
a
,
""
)
||
"
top
"
),
s
.
detach
().
css
({
top
:
0
,
left
:
0
,
display
:
"
block
"
}).
addClass
(
r
).
data
(
"
bs.
"
+
this
.
type
,
this
),
this
.
options
.
container
?
s
.
appendTo
(
this
.
options
.
container
):
s
.
insertAfter
(
this
.
$element
);
var
h
=
this
.
getPosition
(),
p
=
s
[
0
].
offsetWidth
,
c
=
s
[
0
].
offsetHeight
;
if
(
l
){
var
d
=
r
,
f
=
this
.
$element
.
parent
(),
u
=
this
.
getPosition
(
f
);
r
=
"
bottom
"
==
r
&&
h
.
top
+
h
.
height
+
c
-
u
.
scroll
>
u
.
height
?
"
top
"
:
"
top
"
==
r
&&
h
.
top
-
u
.
scroll
-
c
<
0
?
"
bottom
"
:
"
right
"
==
r
&&
h
.
right
+
p
>
u
.
width
?
"
left
"
:
"
left
"
==
r
&&
h
.
left
-
p
<
u
.
left
?
"
right
"
:
r
,
s
.
removeClass
(
d
).
addClass
(
r
)}
var
g
=
this
.
getCalculatedOffset
(
r
,
h
,
p
,
c
);
this
.
applyPlacement
(
g
,
r
);
var
v
=
function
(){
o
.
$element
.
trigger
(
"
shown.bs.
"
+
o
.
type
),
o
.
hoverState
=
null
};
t
.
support
.
transition
&&
this
.
$tip
.
hasClass
(
"
fade
"
)?
s
.
one
(
"
bsTransitionEnd
"
,
v
).
emulateTransitionEnd
(
150
):
v
()}},
e
.
prototype
.
applyPlacement
=
function
(
e
,
i
){
var
o
=
this
.
tip
(),
s
=
o
[
0
].
offsetWidth
,
n
=
o
[
0
].
offsetHeight
,
r
=
parseInt
(
o
.
css
(
"
margin-top
"
),
10
),
a
=
parseInt
(
o
.
css
(
"
margin-left
"
),
10
);
isNaN
(
r
)
&&
(
r
=
0
),
isNaN
(
a
)
&&
(
a
=
0
),
e
.
top
=
e
.
top
+
r
,
e
.
left
=
e
.
left
+
a
,
t
.
offset
.
setOffset
(
o
[
0
],
t
.
extend
({
using
:
function
(
t
){
o
.
css
({
top
:
Math
.
round
(
t
.
top
),
left
:
Math
.
round
(
t
.
left
)})}},
e
),
0
),
o
.
addClass
(
"
in
"
);
var
l
=
o
[
0
].
offsetWidth
,
h
=
o
[
0
].
offsetHeight
;
"
top
"
==
i
&&
h
!=
n
&&
(
e
.
top
=
e
.
top
+
n
-
h
);
var
p
=
this
.
getViewportAdjustedDelta
(
i
,
e
,
l
,
h
);
p
.
left
?
e
.
left
+=
p
.
left
:
e
.
top
+=
p
.
top
;
var
c
=
p
.
left
?
2
*
p
.
left
-
s
+
l
:
2
*
p
.
top
-
n
+
h
,
d
=
p
.
left
?
"
left
"
:
"
top
"
,
f
=
p
.
left
?
"
offsetWidth
"
:
"
offsetHeight
"
;
o
.
offset
(
e
),
this
.
replaceArrow
(
c
,
o
[
0
][
f
],
d
)},
e
.
prototype
.
replaceArrow
=
function
(
t
,
e
,
i
){
this
.
arrow
().
css
(
i
,
t
?
50
*
(
1
-
t
/
e
)
+
"
%
"
:
""
)},
e
.
prototype
.
setContent
=
function
(){
var
t
=
this
.
tip
(),
e
=
this
.
getTitle
();
t
.
find
(
"
.tooltip-inner
"
)[
this
.
options
.
html
?
"
html
"
:
"
text
"
](
e
),
t
.
removeClass
(
"
fade in top bottom left right
"
)},
e
.
prototype
.
hide
=
function
(){
var
e
=
this
,
i
=
this
.
tip
(),
o
=
t
.
Event
(
"
hide.bs.
"
+
this
.
type
);
function
s
(){
"
in
"
!=
e
.
hoverState
&&
i
.
detach
(),
e
.
$element
.
trigger
(
"
hidden.bs.
"
+
e
.
type
)}
if
(
this
.
$element
.
removeAttr
(
"
aria-describedby
"
),
this
.
$element
.
trigger
(
o
),
!
o
.
isDefaultPrevented
())
return
i
.
removeClass
(
"
in
"
),
t
.
support
.
transition
&&
this
.
$tip
.
hasClass
(
"
fade
"
)?
i
.
one
(
"
bsTransitionEnd
"
,
s
).
emulateTransitionEnd
(
150
):
s
(),
this
.
hoverState
=
null
,
this
},
e
.
prototype
.
fixTitle
=
function
(){
var
t
=
this
.
$element
;(
t
.
attr
(
"
title
"
)
||
"
string
"
!=
typeof
t
.
attr
(
"
data-original-title
"
))
&&
t
.
attr
(
"
data-original-title
"
,
t
.
attr
(
"
title
"
)
||
""
).
attr
(
"
title
"
,
""
)},
e
.
prototype
.
hasContent
=
function
(){
return
this
.
getTitle
()},
e
.
prototype
.
getPosition
=
function
(
e
){
var
i
=
(
e
=
e
||
this
.
$element
)[
0
],
o
=
"
BODY
"
==
i
.
tagName
;
return
t
.
extend
({},
"
function
"
==
typeof
i
.
getBoundingClientRect
?
i
.
getBoundingClientRect
():
null
,{
scroll
:
o
?
document
.
documentElement
.
scrollTop
||
document
.
body
.
scrollTop
:
e
.
scrollTop
(),
width
:
o
?
t
(
window
).
width
():
e
.
outerWidth
(),
height
:
o
?
t
(
window
).
height
():
e
.
outerHeight
()},
o
?{
top
:
0
,
left
:
0
}:
e
.
offset
())},
e
.
prototype
.
getCalculatedOffset
=
function
(
t
,
e
,
i
,
o
){
return
"
bottom
"
==
t
?{
top
:
e
.
top
+
e
.
height
,
left
:
e
.
left
+
e
.
width
/
2
-
i
/
2
}:
"
top
"
==
t
?{
top
:
e
.
top
-
o
,
left
:
e
.
left
+
e
.
width
/
2
-
i
/
2
}:
"
left
"
==
t
?{
top
:
e
.
top
+
e
.
height
/
2
-
o
/
2
,
left
:
e
.
left
-
i
}:{
top
:
e
.
top
+
e
.
height
/
2
-
o
/
2
,
left
:
e
.
left
+
e
.
width
}},
e
.
prototype
.
getViewportAdjustedDelta
=
function
(
t
,
e
,
i
,
o
){
var
s
=
{
top
:
0
,
left
:
0
};
if
(
!
this
.
$viewport
)
return
s
;
var
n
=
this
.
options
.
viewport
&&
this
.
options
.
viewport
.
padding
||
0
,
r
=
this
.
getPosition
(
this
.
$viewport
);
if
(
/right|left/
.
test
(
t
)){
var
a
=
e
.
top
-
n
-
r
.
scroll
,
l
=
e
.
top
+
n
-
r
.
scroll
+
o
;
a
<
r
.
top
?
s
.
top
=
r
.
top
-
a
:
l
>
r
.
top
+
r
.
height
&&
(
s
.
top
=
r
.
top
+
r
.
height
-
l
)}
else
{
var
h
=
e
.
left
-
n
,
p
=
e
.
left
+
n
+
i
;
h
<
r
.
left
?
s
.
left
=
r
.
left
-
h
:
p
>
r
.
width
&&
(
s
.
left
=
r
.
left
+
r
.
width
-
p
)}
return
s
},
e
.
prototype
.
getTitle
=
function
(){
var
t
=
this
.
$element
,
e
=
this
.
options
;
return
t
.
attr
(
"
data-original-title
"
)
||
(
"
function
"
==
typeof
e
.
title
?
e
.
title
.
call
(
t
[
0
]):
e
.
title
)},
e
.
prototype
.
getUID
=
function
(
t
){
do
{
t
+=~~
(
1
e6
*
Math
.
random
())}
while
(
document
.
getElementById
(
t
));
return
t
},
e
.
prototype
.
tip
=
function
(){
return
this
.
$tip
=
this
.
$tip
||
t
(
this
.
options
.
template
)},
e
.
prototype
.
arrow
=
function
(){
return
this
.
$arrow
=
this
.
$arrow
||
this
.
tip
().
find
(
"
.tooltip-arrow
"
)},
e
.
prototype
.
validate
=
function
(){
this
.
$element
[
0
].
parentNode
||
(
this
.
hide
(),
this
.
$element
=
null
,
this
.
options
=
null
)},
e
.
prototype
.
enable
=
function
(){
this
.
enabled
=!
0
},
e
.
prototype
.
disable
=
function
(){
this
.
enabled
=!
1
},
e
.
prototype
.
toggleEnabled
=
function
(){
this
.
enabled
=!
this
.
enabled
},
e
.
prototype
.
toggle
=
function
(
e
){
var
i
=
this
;
e
&&
((
i
=
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
))
||
(
i
=
new
this
.
constructor
(
e
.
currentTarget
,
this
.
getDelegateOptions
()),
t
(
e
.
currentTarget
).
data
(
"
bs.
"
+
this
.
type
,
i
))),
i
.
tip
().
hasClass
(
"
in
"
)?
i
.
leave
(
i
):
i
.
enter
(
i
)},
e
.
prototype
.
destroy
=
function
(){
clearTimeout
(
this
.
timeout
),
this
.
hide
().
$element
.
off
(
"
.
"
+
this
.
type
).
removeData
(
"
bs.
"
+
this
.
type
)};
var
i
=
t
.
fn
.
tooltip
;
t
.
fn
.
tooltip
=
function
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.tooltip
"
),
n
=
"
object
"
==
typeof
i
&&
i
;(
s
||
"
destroy
"
!=
i
)
&&
(
s
||
o
.
data
(
"
bs.tooltip
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]())}))},
t
.
fn
.
tooltip
.
Constructor
=
e
,
t
.
fn
.
tooltip
.
noConflict
=
function
(){
return
t
.
fn
.
tooltip
=
i
,
this
}}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
t
,
e
){
this
.
init
(
"
popover
"
,
t
,
e
)};
if
(
!
t
.
fn
.
tooltip
)
throw
new
Error
(
"
Popover requires tooltip.js
"
);
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
t
.
extend
({},
t
.
fn
.
tooltip
.
Constructor
.
DEFAULTS
,{
placement
:
"
right
"
,
trigger
:
"
click
"
,
content
:
""
,
template
:
'
<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>
'
}),
e
.
prototype
=
t
.
extend
({},
t
.
fn
.
tooltip
.
Constructor
.
prototype
),
e
.
prototype
.
constructor
=
e
,
e
.
prototype
.
getDefaults
=
function
(){
return
e
.
DEFAULTS
},
e
.
prototype
.
setContent
=
function
(){
var
t
=
this
.
tip
(),
e
=
this
.
getTitle
(),
i
=
this
.
getContent
();
t
.
find
(
"
.popover-title
"
)[
this
.
options
.
html
?
"
html
"
:
"
text
"
](
e
),
t
.
find
(
"
.popover-content
"
).
empty
()[
this
.
options
.
html
?
"
string
"
==
typeof
i
?
"
html
"
:
"
append
"
:
"
text
"
](
i
),
t
.
removeClass
(
"
fade top bottom left right in
"
),
t
.
find
(
"
.popover-title
"
).
html
()
||
t
.
find
(
"
.popover-title
"
).
hide
()},
e
.
prototype
.
hasContent
=
function
(){
return
this
.
getTitle
()
||
this
.
getContent
()},
e
.
prototype
.
getContent
=
function
(){
var
t
=
this
.
$element
,
e
=
this
.
options
;
return
t
.
attr
(
"
data-content
"
)
||
(
"
function
"
==
typeof
e
.
content
?
e
.
content
.
call
(
t
[
0
]):
e
.
content
)},
e
.
prototype
.
arrow
=
function
(){
return
this
.
$arrow
=
this
.
$arrow
||
this
.
tip
().
find
(
"
.arrow
"
)},
e
.
prototype
.
tip
=
function
(){
return
this
.
$tip
||
(
this
.
$tip
=
t
(
this
.
options
.
template
)),
this
.
$tip
};
var
i
=
t
.
fn
.
popover
;
t
.
fn
.
popover
=
function
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.popover
"
),
n
=
"
object
"
==
typeof
i
&&
i
;(
s
||
"
destroy
"
!=
i
)
&&
(
s
||
o
.
data
(
"
bs.popover
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]())}))},
t
.
fn
.
popover
.
Constructor
=
e
,
t
.
fn
.
popover
.
noConflict
=
function
(){
return
t
.
fn
.
popover
=
i
,
this
}}(
$
),
function
(
t
){
"
use strict
"
;
function
e
(
i
,
o
){
var
s
=
t
.
proxy
(
this
.
process
,
this
);
this
.
$body
=
t
(
"
body
"
),
this
.
$scrollElement
=
t
(
i
).
is
(
"
body
"
)?
t
(
window
):
t
(
i
),
this
.
options
=
t
.
extend
({},
e
.
DEFAULTS
,
o
),
this
.
selector
=
(
this
.
options
.
target
||
""
)
+
"
.nav li > a
"
,
this
.
offsets
=
[],
this
.
targets
=
[],
this
.
activeTarget
=
null
,
this
.
scrollHeight
=
0
,
this
.
$scrollElement
.
on
(
"
scroll.bs.scrollspy
"
,
s
),
this
.
refresh
(),
this
.
process
()}
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.scrollspy
"
),
n
=
"
object
"
==
typeof
i
&&
i
;
s
||
o
.
data
(
"
bs.scrollspy
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
DEFAULTS
=
{
offset
:
10
},
e
.
prototype
.
getScrollHeight
=
function
(){
return
this
.
$scrollElement
[
0
].
scrollHeight
||
Math
.
max
(
this
.
$body
[
0
].
scrollHeight
,
document
.
documentElement
.
scrollHeight
)},
e
.
prototype
.
refresh
=
function
(){
var
e
=
"
offset
"
,
i
=
0
;
t
.
isWindow
(
this
.
$scrollElement
[
0
])
||
(
e
=
"
position
"
,
i
=
this
.
$scrollElement
.
scrollTop
()),
this
.
offsets
=
[],
this
.
targets
=
[],
this
.
scrollHeight
=
this
.
getScrollHeight
();
var
o
=
this
;
this
.
$body
.
find
(
this
.
selector
).
map
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
target
"
)
||
o
.
attr
(
"
href
"
),
n
=
/^#./
.
test
(
s
)
&&
t
(
s
);
return
n
&&
n
.
length
&&
n
.
is
(
"
:visible
"
)
&&
[[
n
[
e
]().
top
+
i
,
s
]]
||
null
})).
sort
((
function
(
t
,
e
){
return
t
[
0
]
-
e
[
0
]})).
each
((
function
(){
o
.
offsets
.
push
(
this
[
0
]),
o
.
targets
.
push
(
this
[
1
])}))},
e
.
prototype
.
process
=
function
(){
var
t
,
e
=
this
.
$scrollElement
.
scrollTop
()
+
this
.
options
.
offset
,
i
=
this
.
getScrollHeight
(),
o
=
this
.
options
.
offset
+
i
-
this
.
$scrollElement
.
height
(),
s
=
this
.
offsets
,
n
=
this
.
targets
,
r
=
this
.
activeTarget
;
if
(
this
.
scrollHeight
!=
i
&&
this
.
refresh
(),
e
>=
o
)
return
r
!=
(
t
=
n
[
n
.
length
-
1
])
&&
this
.
activate
(
t
);
if
(
r
&&
e
<=
s
[
0
])
return
r
!=
(
t
=
n
[
0
])
&&
this
.
activate
(
t
);
for
(
t
=
s
.
length
;
t
--
;)
r
!=
n
[
t
]
&&
e
>=
s
[
t
]
&&
(
!
s
[
t
+
1
]
||
e
<=
s
[
t
+
1
])
&&
this
.
activate
(
n
[
t
])},
e
.
prototype
.
activate
=
function
(
e
){
this
.
activeTarget
=
e
,
t
(
this
.
selector
).
parentsUntil
(
this
.
options
.
target
,
"
.active
"
).
removeClass
(
"
active
"
);
var
i
=
this
.
selector
+
'
[data-target="
'
+
e
+
'
"],
'
+
this
.
selector
+
'
[href="
'
+
e
+
'
"]
'
,
o
=
t
(
i
).
parents
(
"
li
"
).
addClass
(
"
active
"
);
o
.
parent
(
"
.dropdown-menu
"
).
length
&&
(
o
=
o
.
closest
(
"
li.dropdown
"
).
addClass
(
"
active
"
)),
o
.
trigger
(
"
activate.bs.scrollspy
"
)};
var
o
=
t
.
fn
.
scrollspy
;
t
.
fn
.
scrollspy
=
i
,
t
.
fn
.
scrollspy
.
Constructor
=
e
,
t
.
fn
.
scrollspy
.
noConflict
=
function
(){
return
t
.
fn
.
scrollspy
=
o
,
this
},
t
(
window
).
on
(
"
load.bs.scrollspy.data-api
"
,(
function
(){
t
(
'
[data-spy="scroll"]
'
).
each
((
function
(){
var
e
=
t
(
this
);
i
.
call
(
e
,
e
.
data
())}))}))}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
e
){
this
.
element
=
t
(
e
)};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.tab
"
);
s
||
o
.
data
(
"
bs.tab
"
,
s
=
new
e
(
this
)),
"
string
"
==
typeof
i
&&
s
[
i
]()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
prototype
.
show
=
function
(){
var
e
=
this
.
element
,
i
=
e
.
closest
(
"
ul:not(.dropdown-menu)
"
),
o
=
e
.
data
(
"
target
"
);
if
(
o
||
(
o
=
(
o
=
e
.
attr
(
"
href
"
))
&&
o
.
replace
(
/.*
(?=
#
[^\s]
*$
)
/
,
""
)),
!
e
.
parent
(
"
li
"
).
hasClass
(
"
active
"
)){
var
s
=
i
.
find
(
"
.active:last a
"
)[
0
],
n
=
t
.
Event
(
"
show.bs.tab
"
,{
relatedTarget
:
s
});
if
(
e
.
trigger
(
n
),
!
n
.
isDefaultPrevented
()){
var
r
=
t
(
o
);
this
.
activate
(
e
.
closest
(
"
li
"
),
i
),
this
.
activate
(
r
,
r
.
parent
(),(
function
(){
e
.
trigger
({
type
:
"
shown.bs.tab
"
,
relatedTarget
:
s
})}))}}},
e
.
prototype
.
activate
=
function
(
e
,
i
,
o
){
var
s
=
i
.
find
(
"
> .active
"
),
n
=
o
&&
t
.
support
.
transition
&&
s
.
hasClass
(
"
fade
"
);
function
r
(){
s
.
removeClass
(
"
active
"
).
find
(
"
> .dropdown-menu > .active
"
).
removeClass
(
"
active
"
),
e
.
addClass
(
"
active
"
),
n
?(
e
[
0
].
offsetWidth
,
e
.
addClass
(
"
in
"
)):
e
.
removeClass
(
"
fade
"
),
e
.
parent
(
"
.dropdown-menu
"
)
&&
e
.
closest
(
"
li.dropdown
"
).
addClass
(
"
active
"
),
o
&&
o
()}
n
?
s
.
one
(
"
bsTransitionEnd
"
,
r
).
emulateTransitionEnd
(
150
):
r
(),
s
.
removeClass
(
"
in
"
)};
var
o
=
t
.
fn
.
tab
;
t
.
fn
.
tab
=
i
,
t
.
fn
.
tab
.
Constructor
=
e
,
t
.
fn
.
tab
.
noConflict
=
function
(){
return
t
.
fn
.
tab
=
o
,
this
},
t
(
document
).
on
(
"
click.bs.tab.data-api
"
,
'
[data-toggle="tab"], [data-toggle="pill"]
'
,(
function
(
e
){
e
.
preventDefault
(),
i
.
call
(
t
(
this
),
"
show
"
)}))}(
$
),
function
(
t
){
"
use strict
"
;
var
e
=
function
(
i
,
o
){
this
.
options
=
t
.
extend
({},
e
.
DEFAULTS
,
o
),
this
.
$target
=
t
(
this
.
options
.
target
).
on
(
"
scroll.bs.affix.data-api
"
,
t
.
proxy
(
this
.
checkPosition
,
this
)).
on
(
"
click.bs.affix.data-api
"
,
t
.
proxy
(
this
.
checkPositionWithEventLoop
,
this
)),
this
.
$element
=
t
(
i
),
this
.
affixed
=
this
.
unpin
=
this
.
pinnedOffset
=
null
,
this
.
checkPosition
()};
function
i
(
i
){
return
this
.
each
((
function
(){
var
o
=
t
(
this
),
s
=
o
.
data
(
"
bs.affix
"
),
n
=
"
object
"
==
typeof
i
&&
i
;
s
||
o
.
data
(
"
bs.affix
"
,
s
=
new
e
(
this
,
n
)),
"
string
"
==
typeof
i
&&
s
[
i
]()}))}
e
.
VERSION
=
"
3.2.0
"
,
e
.
RESET
=
"
affix affix-top affix-bottom
"
,
e
.
DEFAULTS
=
{
offset
:
0
,
target
:
window
},
e
.
prototype
.
getPinnedOffset
=
function
(){
if
(
this
.
pinnedOffset
)
return
this
.
pinnedOffset
;
this
.
$element
.
removeClass
(
e
.
RESET
).
addClass
(
"
affix
"
);
var
t
=
this
.
$target
.
scrollTop
(),
i
=
this
.
$element
.
offset
();
return
this
.
pinnedOffset
=
i
.
top
-
t
},
e
.
prototype
.
checkPositionWithEventLoop
=
function
(){
setTimeout
(
t
.
proxy
(
this
.
checkPosition
,
this
),
1
)},
e
.
prototype
.
checkPosition
=
function
(){
if
(
this
.
$element
.
is
(
"
:visible
"
)){
var
i
=
t
(
document
).
height
(),
o
=
this
.
$target
.
scrollTop
(),
s
=
this
.
$element
.
offset
(),
n
=
this
.
options
.
offset
,
r
=
n
.
top
,
a
=
n
.
bottom
;
"
object
"
!=
typeof
n
&&
(
a
=
r
=
n
),
"
function
"
==
typeof
r
&&
(
r
=
n
.
top
(
this
.
$element
)),
"
function
"
==
typeof
a
&&
(
a
=
n
.
bottom
(
this
.
$element
));
var
l
=!
(
null
!=
this
.
unpin
&&
o
+
this
.
unpin
<=
s
.
top
)
&&
(
null
!=
a
&&
s
.
top
+
this
.
$element
.
height
()
>=
i
-
a
?
"
bottom
"
:
null
!=
r
&&
o
<=
r
&&
"
top
"
);
if
(
this
.
affixed
!==
l
){
null
!=
this
.
unpin
&&
this
.
$element
.
css
(
"
top
"
,
""
);
var
h
=
"
affix
"
+
(
l
?
"
-
"
+
l
:
""
),
p
=
t
.
Event
(
h
+
"
.bs.affix
"
);
this
.
$element
.
trigger
(
p
),
p
.
isDefaultPrevented
()
||
(
this
.
affixed
=
l
,
this
.
unpin
=
"
bottom
"
==
l
?
this
.
getPinnedOffset
():
null
,
this
.
$element
.
removeClass
(
e
.
RESET
).
addClass
(
h
).
trigger
(
t
.
Event
(
h
.
replace
(
"
affix
"
,
"
affixed
"
))),
"
bottom
"
==
l
&&
this
.
$element
.
offset
({
top
:
i
-
this
.
$element
.
height
()
-
a
}))}}};
var
o
=
t
.
fn
.
affix
;
t
.
fn
.
affix
=
i
,
t
.
fn
.
affix
.
Constructor
=
e
,
t
.
fn
.
affix
.
noConflict
=
function
(){
return
t
.
fn
.
affix
=
o
,
this
},
t
(
window
).
on
(
"
load
"
,(
function
(){
t
(
"
.article__toc
"
).
animate
({
left
:
t
(
"
.site
"
).
outerWidth
()
+
t
(
"
.site
"
).
offset
().
left
+
"
px
"
},
600
),
t
(
'
[data-spy="affix"]
'
).
each
((
function
(){
var
e
=
t
(
this
),
o
=
e
.
data
();
o
.
offset
=
o
.
offset
||
{},
o
.
offsetBottom
&&
(
o
.
offset
.
bottom
=
o
.
offsetBottom
),
o
.
offsetTop
&&
(
o
.
offset
.
top
=
o
.
offsetTop
),
i
.
call
(
e
,
o
)}))}))}(
$
);
src/main/resources/skins/Bubble/article-list.ftl
View file @
ef31c684
...
...
@@ -56,7 +56,7 @@
</#list>
<#if commentable>
·
<a class="item__tag" href="${servePath}${article.articlePermalink}#comments">
<a class="item__tag" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${commentLabel}
</a>
</#if>
...
...
src/main/resources/skins/Bubble/article.ftl
View file @
ef31c684
...
...
@@ -83,6 +83,7 @@
</div>
</
#
if>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
class=
"wrapper"
>
<div
id=
"vcomment"
style=
" margin-bottom: 40px; margin-top: 80px;
...
...
src/main/resources/skins/Bubble/footer.ftl
View file @
ef31c684
...
...
@@ -35,11 +35,11 @@
<svg class="side__top" id="sideTop" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<path d="M26.562 13.958c0 0.72 0.583 1.303 1.303 1.303s1.303-0.583 1.303-1.303v0c0-0.72-0.583-1.303-1.303-1.303s-1.303 0.583-1.303 1.303v0zM23.305 10.7c0 0 0 0 0 0 0 0.72 0.583 1.303 1.303 1.303s1.303-0.583 1.303-1.303c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.72-0.583-1.303-1.303-1.303s-1.303 0.583-1.303 1.303c0 0 0 0 0 0v0zM20.022 7.417c0 0 0 0 0 0 0 0.72 0.583 1.303 1.303 1.303s1.303-0.583 1.303-1.303c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.72-0.583-1.303-1.303-1.303s-1.303 0.583-1.303 1.303c0 0 0 0 0 0v0zM29.67 0h-27.339c-0.677 0-1.228 0.551-1.228 1.228s0.551 1.228 1.228 1.228h11.151l-10.725 10.725c-0.476 0.476-0.476 1.253 0 1.729 0.226 0.226 0.551 0.351 0.852 0.351s0.626-0.125 0.852-0.351l10.074-10.074v25.936c0 0.677 0.551 1.228 1.228 1.228s1.228-0.551 1.228-1.228v-26.011c0.476 0.426 1.203 0.426 1.679-0.050s0.476-1.253 0-1.729l-0.576-0.576h11.577c0.677 0 1.228-0.551 1.228-1.228 0-0.626-0.551-1.178-1.228-1.178z"></path>
</svg>
<script type="text/javascript"
src="${staticServePath}/skins/${skinDirName}/js/circleMagic.min.js?${staticResourceVersion}"
charset="utf-8"></script>
<#include "../../common-template/label.ftl">
<script type="text/javascript"
src="${staticServePath}/skins/${skinDirName}/js/common.min.js?${staticResourceVersion}"
charset="utf-8"></script>
<script type="text/javascript"
src="${staticServePath}/skins/${skinDirName}/js/circleMagic.min.js?${staticResourceVersion}"
charset="utf-8"></script>
${plugins}
src/main/resources/skins/Bubble/js/circleMagic.min.js
View file @
ef31c684
!
function
(
t
){
t
.
fn
.
circleMagic
=
function
(
i
){
var
n
,
o
,
s
,
e
,
h
=!
0
,
a
=
[],
r
=
t
.
extend
({
color
:
"
rgba(255,255,255,.5)
"
,
radius
:
10
,
density
:.
3
,
clearOffset
:.
2
},
i
),
l
=
this
[
0
];
function
c
(){
n
=
l
.
clientWidth
,
o
=
l
.
clientHeight
,
l
.
height
=
o
+
"
px
"
,
s
.
width
=
n
,
s
.
height
=
o
}
function
d
(){
if
(
h
)
for
(
var
t
in
e
.
clearRect
(
0
,
0
,
n
,
o
),
a
)
a
[
t
].
draw
();
requestAnimationFrame
(
d
)}
function
p
(){
var
t
=
this
;
function
i
(){
t
.
pos
.
x
=
Math
.
random
()
*
n
,
t
.
pos
.
y
=
o
+
100
*
Math
.
random
(),
t
.
alpha
=
.
1
+
Math
.
random
()
*
r
.
clearOffset
,
t
.
scale
=
.
1
+
.
3
*
Math
.
random
(),
t
.
speed
=
Math
.
random
(),
"
random
"
===
r
.
color
?
t
.
color
=
"
rgba(
"
+
Math
.
floor
(
255
*
Math
.
random
())
+
"
,
"
+
Math
.
floor
(
255
*
Math
.
random
())
+
"
,
"
+
Math
.
floor
(
255
*
Math
.
random
())
+
"
,
"
+
Math
.
random
().
toPrecision
(
2
)
+
"
)
"
:
t
.
color
=
r
.
color
}
t
.
pos
=
{},
i
(),
this
.
draw
=
function
(){
t
.
alpha
<=
0
&&
i
(),
t
.
pos
.
y
-=
t
.
speed
,
t
.
alpha
-=
5
e
-
4
,
e
.
beginPath
(),
e
.
arc
(
t
.
pos
.
x
,
t
.
pos
.
y
,
t
.
scale
*
r
.
radius
,
0
,
2
*
Math
.
PI
,
!
1
),
e
.
fillStyle
=
t
.
color
,
e
.
fill
(),
e
.
closePath
()}}
!
function
(){
n
=
l
.
offsetWidth
,
o
=
l
.
offsetHeight
,
t
=
document
.
createElement
(
"
canvas
"
),
t
.
id
=
"
canvas
"
,
l
.
appendChild
(
t
),
t
.
parentElement
.
style
.
overflow
=
"
hidden
"
,(
s
=
document
.
getElementById
(
"
canvas
"
)).
width
=
n
,
s
.
height
=
o
,
s
.
style
.
position
=
"
absolute
"
,
s
.
style
.
left
=
"
0
"
,
s
.
style
.
bottom
=
"
0
"
,
e
=
s
.
getContext
(
"
2d
"
);
var
t
;
for
(
var
i
=
0
;
i
<
n
*
r
.
density
;
i
++
){
var
h
=
new
p
;
a
.
push
(
h
)}
d
()}(),
window
.
addEventListener
(
"
resize
"
,
c
,
!
1
)}}(
jQuery
),
"
object
"
==
typeof
window
&&
(
window
.
Ribbons
=
function
(){
var
t
=
window
,
i
=
document
.
body
,
n
=
document
.
documentElement
,
o
=
function
(){
if
(
1
===
arguments
.
length
){
if
(
Array
.
isArray
(
arguments
[
0
])){
var
t
=
Math
.
round
(
o
(
0
,
arguments
[
0
].
length
-
1
));
return
arguments
[
0
][
t
]}
return
o
(
0
,
arguments
[
0
])}
return
2
===
arguments
.
length
?
Math
.
random
()
*
(
arguments
[
1
]
-
arguments
[
0
])
+
arguments
[
0
]:
0
},
s
=
function
(
o
){
var
s
=
Math
.
max
(
0
,
t
.
innerWidth
||
n
.
clientWidth
||
i
.
clientWidth
||
0
),
e
=
Math
.
max
(
0
,
t
.
innerHeight
||
n
.
clientHeight
||
i
.
clientHeight
||
0
);
return
{
width
:
s
,
height
:
e
,
ratio
:
s
/
e
,
centerx
:
s
/
2
,
centery
:
e
/
2
,
scrollx
:
Math
.
max
(
0
,
t
.
pageXOffset
||
n
.
scrollLeft
||
i
.
scrollLeft
||
0
)
-
(
n
.
clientLeft
||
0
),
scrolly
:
Math
.
max
(
0
,
t
.
pageYOffset
||
n
.
scrollTop
||
i
.
scrollTop
||
0
)
-
(
n
.
clientTop
||
0
)}},
e
=
function
(
t
,
i
){
this
.
x
=
0
,
this
.
y
=
0
,
this
.
set
(
t
,
i
)};
e
.
prototype
=
{
constructor
:
e
,
set
:
function
(
t
,
i
){
this
.
x
=
t
||
0
,
this
.
y
=
i
||
0
},
copy
:
function
(
t
){
return
this
.
x
=
t
.
x
||
0
,
this
.
y
=
t
.
y
||
0
,
this
},
multiply
:
function
(
t
,
i
){
return
this
.
x
*=
t
||
1
,
this
.
y
*=
i
||
1
,
this
},
divide
:
function
(
t
,
i
){
return
this
.
x
/=
t
||
1
,
this
.
y
/=
i
||
1
,
this
},
add
:
function
(
t
,
i
){
return
this
.
x
+=
t
||
0
,
this
.
y
+=
i
||
0
,
this
},
subtract
:
function
(
t
,
i
){
return
this
.
x
-=
t
||
0
,
this
.
y
-=
i
||
0
,
this
},
clampX
:
function
(
t
,
i
){
return
this
.
x
=
Math
.
max
(
t
,
Math
.
min
(
this
.
x
,
i
)),
this
},
clampY
:
function
(
t
,
i
){
return
this
.
y
=
Math
.
max
(
t
,
Math
.
min
(
this
.
y
,
i
)),
this
},
flipX
:
function
(){
return
this
.
x
*=-
1
,
this
},
flipY
:
function
(){
return
this
.
y
*=-
1
,
this
}};
var
h
=
function
(
t
){
this
.
_canvas
=
null
,
this
.
_context
=
null
,
this
.
_sto
=
null
,
this
.
_width
=
0
,
this
.
_height
=
0
,
this
.
_scroll
=
0
,
this
.
_ribbons
=
[],
this
.
_options
=
{
colorSaturation
:
"
80%
"
,
colorBrightness
:
"
60%
"
,
colorAlpha
:.
65
,
colorCycleSpeed
:
6
,
verticalPosition
:
"
center
"
,
horizontalSpeed
:
150
,
ribbonCount
:
3
,
strokeSize
:
0
,
parallaxAmount
:
-
.
5
,
animateSections
:
!
0
},
this
.
_onDraw
=
this
.
_onDraw
.
bind
(
this
),
this
.
_onResize
=
this
.
_onResize
.
bind
(
this
),
this
.
_onScroll
=
this
.
_onScroll
.
bind
(
this
),
this
.
setOptions
(
t
),
this
.
init
()};
return
h
.
prototype
=
{
constructor
:
h
,
setOptions
:
function
(
t
){
if
(
"
object
"
==
typeof
t
)
for
(
var
i
in
t
)
t
.
hasOwnProperty
(
i
)
&&
(
this
.
_options
[
i
]
=
t
[
i
])},
init
:
function
(){
try
{
this
.
_canvas
=
document
.
createElement
(
"
canvas
"
),
this
.
_canvas
.
style
.
display
=
"
block
"
,
this
.
_canvas
.
style
.
position
=
"
fixed
"
,
this
.
_canvas
.
style
.
margin
=
"
0
"
,
this
.
_canvas
.
style
.
padding
=
"
0
"
,
this
.
_canvas
.
style
.
border
=
"
0
"
,
this
.
_canvas
.
style
.
outline
=
"
0
"
,
this
.
_canvas
.
style
.
left
=
"
0
"
,
this
.
_canvas
.
style
.
top
=
"
0
"
,
this
.
_canvas
.
style
.
width
=
"
100%
"
,
this
.
_canvas
.
style
.
height
=
"
100%
"
,
this
.
_canvas
.
style
[
"
z-index
"
]
=
"
-1
"
,
this
.
_onResize
(),
this
.
_context
=
this
.
_canvas
.
getContext
(
"
2d
"
),
this
.
_context
.
clearRect
(
0
,
0
,
this
.
_width
,
this
.
_height
),
this
.
_context
.
globalAlpha
=
this
.
_options
.
colorAlpha
,
window
.
addEventListener
(
"
resize
"
,
this
.
_onResize
),
document
.
body
.
appendChild
(
this
.
_canvas
)}
catch
(
t
){
return
void
console
.
warn
(
"
Canvas Context Error:
"
+
t
.
toString
())}
this
.
_onDraw
()},
addRibbon
:
function
(){
var
t
=
Math
.
round
(
o
(
1
,
9
))
>
5
?
"
right
"
:
"
left
"
,
i
=
1
e3
,
n
=
this
.
_width
+
200
,
s
=
0
,
h
=
0
,
a
=
"
right
"
===
t
?
-
200
:
n
,
r
=
Math
.
round
(
o
(
0
,
this
.
_height
));
/^
(
top|min
)
$/i
.
test
(
this
.
_options
.
verticalPosition
)?
r
=
200
:
/^
(
middle|center
)
$/i
.
test
(
this
.
_options
.
verticalPosition
)?
r
=
this
.
_height
/
2
:
/^
(
bottom|max
)
$/i
.
test
(
this
.
_options
.
verticalPosition
)
&&
(
r
=
this
.
_height
-
200
);
for
(
var
l
=
[],
c
=
new
e
(
a
,
r
),
d
=
new
e
(
a
,
r
),
p
=
null
,
_
=
Math
.
round
(
o
(
0
,
360
)),
u
=
0
;
!
(
i
<=
0
);){
if
(
i
--
,
s
=
Math
.
round
((
1
*
Math
.
random
()
-
.
2
)
*
this
.
_options
.
horizontalSpeed
),
h
=
Math
.
round
((
1
*
Math
.
random
()
-
.
5
)
*
(.
25
*
this
.
_height
)),(
p
=
new
e
).
copy
(
d
),
"
right
"
===
t
){
if
(
p
.
add
(
s
,
h
),
d
.
x
>=
n
)
break
}
else
if
(
"
left
"
===
t
&&
(
p
.
subtract
(
s
,
h
),
d
.
x
<=-
200
))
break
;
l
.
push
({
point1
:
new
e
(
c
.
x
,
c
.
y
),
point2
:
new
e
(
d
.
x
,
d
.
y
),
point3
:
p
,
color
:
_
,
delay
:
u
,
dir
:
t
,
alpha
:
0
,
phase
:
0
}),
c
.
copy
(
d
),
d
.
copy
(
p
),
u
+=
4
,
_
+=
this
.
_options
.
colorCycleSpeed
}
this
.
_ribbons
.
push
(
l
)},
_drawRibbonSection
:
function
(
t
){
if
(
t
){
if
(
t
.
phase
>=
1
&&
t
.
alpha
<=
0
)
return
!
0
;
if
(
t
.
delay
<=
0
){
if
(
t
.
phase
+=
.
02
,
t
.
alpha
=
1
*
Math
.
sin
(
t
.
phase
),
t
.
alpha
=
t
.
alpha
<=
0
?
0
:
t
.
alpha
,
t
.
alpha
=
t
.
alpha
>=
1
?
1
:
t
.
alpha
,
this
.
_options
.
animateSections
){
var
i
=
.
1
*
Math
.
sin
(
1
+
t
.
phase
*
Math
.
PI
/
2
);
"
right
"
===
t
.
dir
?(
t
.
point1
.
add
(
i
,
0
),
t
.
point2
.
add
(
i
,
0
),
t
.
point3
.
add
(
i
,
0
)):(
t
.
point1
.
subtract
(
i
,
0
),
t
.
point2
.
subtract
(
i
,
0
),
t
.
point3
.
subtract
(
i
,
0
)),
t
.
point1
.
add
(
0
,
i
),
t
.
point2
.
add
(
0
,
i
),
t
.
point3
.
add
(
0
,
i
)}}
else
t
.
delay
-=
.
5
;
var
n
=
this
.
_options
.
colorSaturation
,
o
=
this
.
_options
.
colorBrightness
,
s
=
"
hsla(
"
+
t
.
color
+
"
,
"
+
n
+
"
,
"
+
o
+
"
,
"
+
t
.
alpha
+
"
)
"
;
this
.
_context
.
save
(),
0
!==
this
.
_options
.
parallaxAmount
&&
this
.
_context
.
translate
(
0
,
this
.
_scroll
*
this
.
_options
.
parallaxAmount
),
this
.
_context
.
beginPath
(),
this
.
_context
.
moveTo
(
t
.
point1
.
x
,
t
.
point1
.
y
),
this
.
_context
.
lineTo
(
t
.
point2
.
x
,
t
.
point2
.
y
),
this
.
_context
.
lineTo
(
t
.
point3
.
x
,
t
.
point3
.
y
),
this
.
_context
.
fillStyle
=
s
,
this
.
_context
.
fill
(),
this
.
_options
.
strokeSize
>
0
&&
(
this
.
_context
.
lineWidth
=
this
.
_options
.
strokeSize
,
this
.
_context
.
strokeStyle
=
s
,
this
.
_context
.
lineCap
=
"
round
"
,
this
.
_context
.
stroke
()),
this
.
_context
.
restore
()}
return
!
1
},
_onDraw
:
function
(){
for
(
var
t
=
0
,
i
=
this
.
_ribbons
.
length
;
t
<
i
;
++
t
)
this
.
_ribbons
[
t
]
||
this
.
_ribbons
.
splice
(
t
,
1
);
this
.
_context
.
clearRect
(
0
,
0
,
this
.
_width
,
this
.
_height
);
for
(
var
n
=
0
;
n
<
this
.
_ribbons
.
length
;
++
n
){
for
(
var
o
=
this
.
_ribbons
[
n
],
s
=
o
.
length
,
e
=
0
,
h
=
0
;
h
<
s
;
++
h
)
this
.
_drawRibbonSection
(
o
[
h
])
&&
e
++
;
e
>=
s
&&
(
this
.
_ribbons
[
n
]
=
null
)}
this
.
_ribbons
.
length
<
this
.
_options
.
ribbonCount
&&
this
.
addRibbon
(),
requestAnimationFrame
(
this
.
_onDraw
)},
_onResize
:
function
(
t
){
var
i
=
s
();
this
.
_width
=
i
.
width
,
this
.
_height
=
i
.
height
,
this
.
_canvas
&&
(
this
.
_canvas
.
width
=
this
.
_width
,
this
.
_canvas
.
height
=
this
.
_height
,
this
.
_context
&&
(
this
.
_context
.
globalAlpha
=
this
.
_options
.
colorAlpha
))},
_onScroll
:
function
(
t
){
var
i
=
s
();
this
.
_scroll
=
i
.
scrolly
}},
h
}());
\ No newline at end of file
!
function
(
t
){
t
.
fn
.
circleMagic
=
function
(
i
){
var
n
,
o
,
s
,
e
,
h
=!
0
,
a
=
[],
r
=
t
.
extend
({
color
:
"
rgba(255,255,255,.5)
"
,
radius
:
10
,
density
:.
3
,
clearOffset
:.
2
},
i
),
l
=
this
[
0
];
function
c
(){
n
=
l
.
clientWidth
,
o
=
l
.
clientHeight
,
l
.
height
=
o
+
"
px
"
,
s
.
width
=
n
,
s
.
height
=
o
}
function
d
(){
if
(
h
)
for
(
var
t
in
e
.
clearRect
(
0
,
0
,
n
,
o
),
a
)
a
[
t
].
draw
();
requestAnimationFrame
(
d
)}
function
p
(){
var
t
=
this
;
function
i
(){
t
.
pos
.
x
=
Math
.
random
()
*
n
,
t
.
pos
.
y
=
o
+
100
*
Math
.
random
(),
t
.
alpha
=
.
1
+
Math
.
random
()
*
r
.
clearOffset
,
t
.
scale
=
.
1
+
.
3
*
Math
.
random
(),
t
.
speed
=
Math
.
random
(),
"
random
"
===
r
.
color
?
t
.
color
=
"
rgba(
"
+
Math
.
floor
(
255
*
Math
.
random
())
+
"
,
"
+
Math
.
floor
(
255
*
Math
.
random
())
+
"
,
"
+
Math
.
floor
(
255
*
Math
.
random
())
+
"
,
"
+
Math
.
random
().
toPrecision
(
2
)
+
"
)
"
:
t
.
color
=
r
.
color
}
t
.
pos
=
{},
i
(),
this
.
draw
=
function
(){
t
.
alpha
<=
0
&&
i
(),
t
.
pos
.
y
-=
t
.
speed
,
t
.
alpha
-=
5
e
-
4
,
e
.
beginPath
(),
e
.
arc
(
t
.
pos
.
x
,
t
.
pos
.
y
,
t
.
scale
*
r
.
radius
,
0
,
2
*
Math
.
PI
,
!
1
),
e
.
fillStyle
=
t
.
color
,
e
.
fill
(),
e
.
closePath
()}}
!
function
(){
n
=
l
.
offsetWidth
,
o
=
l
.
offsetHeight
,
t
=
document
.
createElement
(
"
canvas
"
),
t
.
id
=
"
canvas
"
,
l
.
appendChild
(
t
),
t
.
parentElement
.
style
.
overflow
=
"
hidden
"
,(
s
=
document
.
getElementById
(
"
canvas
"
)).
width
=
n
,
s
.
height
=
o
,
s
.
style
.
position
=
"
absolute
"
,
s
.
style
.
left
=
"
0
"
,
s
.
style
.
bottom
=
"
0
"
,
e
=
s
.
getContext
(
"
2d
"
);
var
t
;
for
(
var
i
=
0
;
i
<
n
*
r
.
density
;
i
++
){
var
h
=
new
p
;
a
.
push
(
h
)}
d
()}(),
window
.
addEventListener
(
"
resize
"
,
c
,
!
1
)}}(
$
),
"
object
"
==
typeof
window
&&
(
window
.
Ribbons
=
function
(){
var
t
=
window
,
i
=
document
.
body
,
n
=
document
.
documentElement
,
o
=
function
(){
if
(
1
===
arguments
.
length
){
if
(
Array
.
isArray
(
arguments
[
0
])){
var
t
=
Math
.
round
(
o
(
0
,
arguments
[
0
].
length
-
1
));
return
arguments
[
0
][
t
]}
return
o
(
0
,
arguments
[
0
])}
return
2
===
arguments
.
length
?
Math
.
random
()
*
(
arguments
[
1
]
-
arguments
[
0
])
+
arguments
[
0
]:
0
},
s
=
function
(
o
){
var
s
=
Math
.
max
(
0
,
t
.
innerWidth
||
n
.
clientWidth
||
i
.
clientWidth
||
0
),
e
=
Math
.
max
(
0
,
t
.
innerHeight
||
n
.
clientHeight
||
i
.
clientHeight
||
0
);
return
{
width
:
s
,
height
:
e
,
ratio
:
s
/
e
,
centerx
:
s
/
2
,
centery
:
e
/
2
,
scrollx
:
Math
.
max
(
0
,
t
.
pageXOffset
||
n
.
scrollLeft
||
i
.
scrollLeft
||
0
)
-
(
n
.
clientLeft
||
0
),
scrolly
:
Math
.
max
(
0
,
t
.
pageYOffset
||
n
.
scrollTop
||
i
.
scrollTop
||
0
)
-
(
n
.
clientTop
||
0
)}},
e
=
function
(
t
,
i
){
this
.
x
=
0
,
this
.
y
=
0
,
this
.
set
(
t
,
i
)};
e
.
prototype
=
{
constructor
:
e
,
set
:
function
(
t
,
i
){
this
.
x
=
t
||
0
,
this
.
y
=
i
||
0
},
copy
:
function
(
t
){
return
this
.
x
=
t
.
x
||
0
,
this
.
y
=
t
.
y
||
0
,
this
},
multiply
:
function
(
t
,
i
){
return
this
.
x
*=
t
||
1
,
this
.
y
*=
i
||
1
,
this
},
divide
:
function
(
t
,
i
){
return
this
.
x
/=
t
||
1
,
this
.
y
/=
i
||
1
,
this
},
add
:
function
(
t
,
i
){
return
this
.
x
+=
t
||
0
,
this
.
y
+=
i
||
0
,
this
},
subtract
:
function
(
t
,
i
){
return
this
.
x
-=
t
||
0
,
this
.
y
-=
i
||
0
,
this
},
clampX
:
function
(
t
,
i
){
return
this
.
x
=
Math
.
max
(
t
,
Math
.
min
(
this
.
x
,
i
)),
this
},
clampY
:
function
(
t
,
i
){
return
this
.
y
=
Math
.
max
(
t
,
Math
.
min
(
this
.
y
,
i
)),
this
},
flipX
:
function
(){
return
this
.
x
*=-
1
,
this
},
flipY
:
function
(){
return
this
.
y
*=-
1
,
this
}};
var
h
=
function
(
t
){
this
.
_canvas
=
null
,
this
.
_context
=
null
,
this
.
_sto
=
null
,
this
.
_width
=
0
,
this
.
_height
=
0
,
this
.
_scroll
=
0
,
this
.
_ribbons
=
[],
this
.
_options
=
{
colorSaturation
:
"
80%
"
,
colorBrightness
:
"
60%
"
,
colorAlpha
:.
65
,
colorCycleSpeed
:
6
,
verticalPosition
:
"
center
"
,
horizontalSpeed
:
150
,
ribbonCount
:
3
,
strokeSize
:
0
,
parallaxAmount
:
-
.
5
,
animateSections
:
!
0
},
this
.
_onDraw
=
this
.
_onDraw
.
bind
(
this
),
this
.
_onResize
=
this
.
_onResize
.
bind
(
this
),
this
.
_onScroll
=
this
.
_onScroll
.
bind
(
this
),
this
.
setOptions
(
t
),
this
.
init
()};
return
h
.
prototype
=
{
constructor
:
h
,
setOptions
:
function
(
t
){
if
(
"
object
"
==
typeof
t
)
for
(
var
i
in
t
)
t
.
hasOwnProperty
(
i
)
&&
(
this
.
_options
[
i
]
=
t
[
i
])},
init
:
function
(){
try
{
this
.
_canvas
=
document
.
createElement
(
"
canvas
"
),
this
.
_canvas
.
style
.
display
=
"
block
"
,
this
.
_canvas
.
style
.
position
=
"
fixed
"
,
this
.
_canvas
.
style
.
margin
=
"
0
"
,
this
.
_canvas
.
style
.
padding
=
"
0
"
,
this
.
_canvas
.
style
.
border
=
"
0
"
,
this
.
_canvas
.
style
.
outline
=
"
0
"
,
this
.
_canvas
.
style
.
left
=
"
0
"
,
this
.
_canvas
.
style
.
top
=
"
0
"
,
this
.
_canvas
.
style
.
width
=
"
100%
"
,
this
.
_canvas
.
style
.
height
=
"
100%
"
,
this
.
_canvas
.
style
[
"
z-index
"
]
=
"
-1
"
,
this
.
_onResize
(),
this
.
_context
=
this
.
_canvas
.
getContext
(
"
2d
"
),
this
.
_context
.
clearRect
(
0
,
0
,
this
.
_width
,
this
.
_height
),
this
.
_context
.
globalAlpha
=
this
.
_options
.
colorAlpha
,
window
.
addEventListener
(
"
resize
"
,
this
.
_onResize
),
document
.
body
.
appendChild
(
this
.
_canvas
)}
catch
(
t
){
return
void
console
.
warn
(
"
Canvas Context Error:
"
+
t
.
toString
())}
this
.
_onDraw
()},
addRibbon
:
function
(){
var
t
=
Math
.
round
(
o
(
1
,
9
))
>
5
?
"
right
"
:
"
left
"
,
i
=
1
e3
,
n
=
this
.
_width
+
200
,
s
=
0
,
h
=
0
,
a
=
"
right
"
===
t
?
-
200
:
n
,
r
=
Math
.
round
(
o
(
0
,
this
.
_height
));
/^
(
top|min
)
$/i
.
test
(
this
.
_options
.
verticalPosition
)?
r
=
200
:
/^
(
middle|center
)
$/i
.
test
(
this
.
_options
.
verticalPosition
)?
r
=
this
.
_height
/
2
:
/^
(
bottom|max
)
$/i
.
test
(
this
.
_options
.
verticalPosition
)
&&
(
r
=
this
.
_height
-
200
);
for
(
var
l
=
[],
c
=
new
e
(
a
,
r
),
d
=
new
e
(
a
,
r
),
p
=
null
,
_
=
Math
.
round
(
o
(
0
,
360
)),
u
=
0
;
!
(
i
<=
0
);){
if
(
i
--
,
s
=
Math
.
round
((
1
*
Math
.
random
()
-
.
2
)
*
this
.
_options
.
horizontalSpeed
),
h
=
Math
.
round
((
1
*
Math
.
random
()
-
.
5
)
*
(.
25
*
this
.
_height
)),(
p
=
new
e
).
copy
(
d
),
"
right
"
===
t
){
if
(
p
.
add
(
s
,
h
),
d
.
x
>=
n
)
break
}
else
if
(
"
left
"
===
t
&&
(
p
.
subtract
(
s
,
h
),
d
.
x
<=-
200
))
break
;
l
.
push
({
point1
:
new
e
(
c
.
x
,
c
.
y
),
point2
:
new
e
(
d
.
x
,
d
.
y
),
point3
:
p
,
color
:
_
,
delay
:
u
,
dir
:
t
,
alpha
:
0
,
phase
:
0
}),
c
.
copy
(
d
),
d
.
copy
(
p
),
u
+=
4
,
_
+=
this
.
_options
.
colorCycleSpeed
}
this
.
_ribbons
.
push
(
l
)},
_drawRibbonSection
:
function
(
t
){
if
(
t
){
if
(
t
.
phase
>=
1
&&
t
.
alpha
<=
0
)
return
!
0
;
if
(
t
.
delay
<=
0
){
if
(
t
.
phase
+=
.
02
,
t
.
alpha
=
1
*
Math
.
sin
(
t
.
phase
),
t
.
alpha
=
t
.
alpha
<=
0
?
0
:
t
.
alpha
,
t
.
alpha
=
t
.
alpha
>=
1
?
1
:
t
.
alpha
,
this
.
_options
.
animateSections
){
var
i
=
.
1
*
Math
.
sin
(
1
+
t
.
phase
*
Math
.
PI
/
2
);
"
right
"
===
t
.
dir
?(
t
.
point1
.
add
(
i
,
0
),
t
.
point2
.
add
(
i
,
0
),
t
.
point3
.
add
(
i
,
0
)):(
t
.
point1
.
subtract
(
i
,
0
),
t
.
point2
.
subtract
(
i
,
0
),
t
.
point3
.
subtract
(
i
,
0
)),
t
.
point1
.
add
(
0
,
i
),
t
.
point2
.
add
(
0
,
i
),
t
.
point3
.
add
(
0
,
i
)}}
else
t
.
delay
-=
.
5
;
var
n
=
this
.
_options
.
colorSaturation
,
o
=
this
.
_options
.
colorBrightness
,
s
=
"
hsla(
"
+
t
.
color
+
"
,
"
+
n
+
"
,
"
+
o
+
"
,
"
+
t
.
alpha
+
"
)
"
;
this
.
_context
.
save
(),
0
!==
this
.
_options
.
parallaxAmount
&&
this
.
_context
.
translate
(
0
,
this
.
_scroll
*
this
.
_options
.
parallaxAmount
),
this
.
_context
.
beginPath
(),
this
.
_context
.
moveTo
(
t
.
point1
.
x
,
t
.
point1
.
y
),
this
.
_context
.
lineTo
(
t
.
point2
.
x
,
t
.
point2
.
y
),
this
.
_context
.
lineTo
(
t
.
point3
.
x
,
t
.
point3
.
y
),
this
.
_context
.
fillStyle
=
s
,
this
.
_context
.
fill
(),
this
.
_options
.
strokeSize
>
0
&&
(
this
.
_context
.
lineWidth
=
this
.
_options
.
strokeSize
,
this
.
_context
.
strokeStyle
=
s
,
this
.
_context
.
lineCap
=
"
round
"
,
this
.
_context
.
stroke
()),
this
.
_context
.
restore
()}
return
!
1
},
_onDraw
:
function
(){
for
(
var
t
=
0
,
i
=
this
.
_ribbons
.
length
;
t
<
i
;
++
t
)
this
.
_ribbons
[
t
]
||
this
.
_ribbons
.
splice
(
t
,
1
);
this
.
_context
.
clearRect
(
0
,
0
,
this
.
_width
,
this
.
_height
);
for
(
var
n
=
0
;
n
<
this
.
_ribbons
.
length
;
++
n
){
for
(
var
o
=
this
.
_ribbons
[
n
],
s
=
o
.
length
,
e
=
0
,
h
=
0
;
h
<
s
;
++
h
)
this
.
_drawRibbonSection
(
o
[
h
])
&&
e
++
;
e
>=
s
&&
(
this
.
_ribbons
[
n
]
=
null
)}
this
.
_ribbons
.
length
<
this
.
_options
.
ribbonCount
&&
this
.
addRibbon
(),
requestAnimationFrame
(
this
.
_onDraw
)},
_onResize
:
function
(
t
){
var
i
=
s
();
this
.
_width
=
i
.
width
,
this
.
_height
=
i
.
height
,
this
.
_canvas
&&
(
this
.
_canvas
.
width
=
this
.
_width
,
this
.
_canvas
.
height
=
this
.
_height
,
this
.
_context
&&
(
this
.
_context
.
globalAlpha
=
this
.
_options
.
colorAlpha
))},
_onScroll
:
function
(
t
){
var
i
=
s
();
this
.
_scroll
=
i
.
scrolly
}},
h
}());
src/main/resources/skins/Casper/article-list.ftl
View file @
ef31c684
...
...
@@ -69,7 +69,7 @@
<img src="${article.authorThumbnailURL}" />
</a>
<#if commentable>
<a class="item__meta" href="${servePath}${article.articlePermalink}#comments">
<a class="item__meta" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<span data-uvstatcmt="${article.oId}"><span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span></span> ${commentLabel}
</a>
<#else>
...
...
src/main/resources/skins/Casper/article.ftl
View file @
ef31c684
...
...
@@ -86,6 +86,7 @@
</div>
</
#
if>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
class=
"comment__wrapper wrapper"
style=
"margin: 40px auto"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
...
...
src/main/resources/skins/Community/article-list.ftl
View file @
ef31c684
...
...
@@ -43,7 +43,7 @@
</li>
<#if commentable>
<li>
<a rel="nofollow" title="${commentLabel}" href="${servePath}${article.articlePermalink}#comments">
<a rel="nofollow" title="${commentLabel}" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
${commentLabel} (<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span>)
</a>
</li>
...
...
src/main/resources/skins/Community/article.ftl
View file @
ef31c684
...
...
@@ -64,7 +64,7 @@
</li>
<
#if
commentable
>
<li>
<a
rel=
"nofollow"
title=
"${commentLabel}"
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
rel=
"nofollow"
title=
"${commentLabel}"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
${commentLabel} (
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
)
</a>
</li>
...
...
@@ -122,9 +122,8 @@
</div>
</div>
<
#if
commentable
>
<div
id=
"vcomment"
style=
"margin-bottom: 40px;
border-top: 1px solid #dcdcdc;
padding-top: 30px;"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
style=
"margin-bottom: 40px;border-top: 1px solid #dcdcdc;padding-top: 30px;"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
<
@
comments
commentList=
articleComments
article=
article
></
@
comments>
...
...
src/main/resources/skins/Finding/article.ftl
View file @
ef31c684
...
...
@@ -102,6 +102,7 @@
<div
id=
"externalRelevantArticles"
class=
"fn-wrap"
></div>
</
#
if>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
style=
"margin-top: 100px"
class=
"fn-wrap"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
...
...
src/main/resources/skins/Jane/article-list.ftl
View file @
ef31c684
...
...
@@ -49,7 +49,7 @@
</span>
<div class="fn__right">
<#if commentable>
<a class="ft__red" href="${servePath}${article.articlePermalink}#comments"><span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${commentLabel}</a>
<a class="ft__red" href="${servePath}${article.articlePermalink}#
b3logsolo
comments"><span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${commentLabel}</a>
•
</#if>
<a class="ft__red" href="${servePath}${article.articlePermalink}"><span data-uvstaturl="${servePath}${article.articlePermalink}">${article.articleViewCount}</span> ${viewLabel}</a>
...
...
src/main/resources/skins/Jane/article.ftl
View file @
ef31c684
...
...
@@ -63,7 +63,7 @@
</span>
<div
class=
"fn__right"
>
<
#if
commentable
>
<a
class=
"ft__red"
href=
"${servePath}${article.articlePermalink}#comments"
><span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
${commentLabel}
</a>
<a
class=
"ft__red"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
><span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
${commentLabel}
</a>
•
</
#
if>
<span
data-uvstaturl=
"${servePath}${article.articlePermalink}"
>
${article.articleViewCount}
</span>
${viewLabel}
...
...
@@ -102,6 +102,7 @@
</
#
if>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
...
...
src/main/resources/skins/Medium/article-list.ftl
View file @
ef31c684
...
...
@@ -56,7 +56,7 @@
${article.articleUpdateDate?string("yyyy-MM-dd")}
</time> •
<#if commentable>
<a href="${servePath}${article.articlePermalink}#comments" class="ft-gray">
<a href="${servePath}${article.articlePermalink}#
b3logsolo
comments" class="ft-gray">
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${commentLabel}
</a> •
</#if>
...
...
src/main/resources/skins/Medium/article.ftl
View file @
ef31c684
...
...
@@ -119,6 +119,7 @@
<div
class=
"fn-flex-1"
id=
"randomArticles"
></div>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
class=
"article__comment"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
...
...
src/main/resources/skins/NeoEase/article-list.ftl
View file @
ef31c684
...
...
@@ -54,7 +54,7 @@
</div>
<div class="right article-element">
<#if commentable>
<a rel="nofollow" href="${servePath}${article.articlePermalink}#comments">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${commentLabel}
</a>
</#if>
...
...
src/main/resources/skins/NeoEase/article.ftl
View file @
ef31c684
...
...
@@ -61,7 +61,7 @@
</div>
<div
class=
"right article-element"
>
<
#if
commentable
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
${commentLabel}
</a>
</
#
if>
...
...
@@ -107,6 +107,7 @@
</div>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
style=
"margin:15px 5px 0 5px;padding: 10px;background-color: #F5F5F5;box-sizing: border-box"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
...
...
src/main/resources/skins/Pinghsu/article.ftl
View file @
ef31c684
...
...
@@ -64,7 +64,7 @@
</
#
if>
with
<span
data-uvstaturl=
"${servePath}${article.articlePermalink}"
>
${article.articleViewCount}
</span>
views
<
#if
commentable
>
and
<a
href=
"#comments"
><span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
comments
</a>
and
<a
href=
"#
b3logsolo
comments"
><span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
comments
</a>
</
#
if>
</div>
<div
class=
"item__tags"
>
...
...
@@ -91,6 +91,7 @@
<div
class=
"body--gray post__gray"
>
<div
class=
"wrapper comment"
>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
style=
"padding: 30px 0;"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
...
...
src/main/resources/skins/favourite/article-list.ftl
View file @
ef31c684
...
...
@@ -68,7 +68,7 @@
</#list>
</div>
<#if commentable>
<a rel="nofollow" href="${servePath}${article.articlePermalink}#comments" class="left">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#
b3logsolo
comments" class="left">
<span class="left articles-commentIcon" title="${commentLabel}"></span>
<span class="count" data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span>
</a>
...
...
src/main/resources/skins/favourite/article.ftl
View file @
ef31c684
...
...
@@ -89,12 +89,12 @@
</span>
</
#
list>
</div>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#comments"
class=
"left"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
class=
"left"
>
<span
class=
"left articles-commentIcon"
title=
"${commentLabel}"
></span>
<span
class=
"count"
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
</a>
<div
class=
"right"
>
<a
rel=
"nofollow"
href=
"#comments"
class=
"right"
>
<a
rel=
"nofollow"
href=
"#
b3logsolo
comments"
class=
"right"
>
${replyLabel}
</a>
</div>
...
...
@@ -120,6 +120,7 @@
<div
id=
"externalRelevantArticles"
class=
"article-relative"
></div>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
class=
"comments"
style=
"padding-top: 15px"
...
...
src/main/resources/skins/i-nove/article-list.ftl
View file @
ef31c684
...
...
@@ -49,7 +49,7 @@
</div>
<#if commentable>
<div class="right">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#comments" class="left">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#
b3logsolo
comments" class="left">
<span class="left articles-commentIcon" title="${commentLabel}"></span>
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span>
</a>
...
...
src/main/resources/skins/i-nove/article.ftl
View file @
ef31c684
...
...
@@ -62,7 +62,7 @@
</div>
<
#if
commentable
>
<div
class=
"right"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#comments"
class=
"left"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
class=
"left"
>
<span
class=
"left articles-commentIcon"
title=
"${commentLabel}"
></span>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
</a>
...
...
@@ -113,6 +113,7 @@
<div
id=
"externalRelevantArticles"
class=
"article-relative"
></div>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
class=
"comments"
style=
"padding-top: 15px"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
...
...
src/main/resources/skins/metro-hot/article-list.ftl
View file @
ef31c684
...
...
@@ -28,7 +28,7 @@
</div>
<div class="fn-right">
<#if commentable>
<a rel="nofollow" data-ico="" data-uvstatcmt="${article.oId}" href="${servePath}${article.articlePermalink}#comments">
<a rel="nofollow" data-ico="" data-uvstatcmt="${article.oId}" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
${article.articleCommentCount}
</a>
</#if>
...
...
src/main/resources/skins/metro-hot/article.ftl
View file @
ef31c684
...
...
@@ -59,7 +59,7 @@
</div>
<div
class=
"article-info"
>
<
#if
commentable
>
<a
rel=
"nofollow"
data-ico=
""
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
rel=
"nofollow"
data-ico=
""
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
</a>
</
#
if>
...
...
@@ -81,6 +81,7 @@
</
#
if>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
...
...
src/main/resources/skins/metro-hot/css/base.css
View file @
ef31c684
...
...
@@ -348,11 +348,11 @@
-webkit-animation-timing-function
:
cubic-bezier
(
0.2
,
0
,
0.13
,
1.5
);
animation-timing-function
:
cubic-bezier
(
0.2
,
0
,
0.13
,
1.5
);
}
.vditor-panel--none
{
color
:
#
4285f4
;
color
:
#
fff
;
padding
:
0
;
-webkit-animation
:
none
;
animation
:
none
;
background-color
:
#
f6f8fa
;
background-color
:
#
2c2c2c
;
min-width
:
auto
;
max-width
:
none
;
}
.vditor-panel
h1
,
.vditor-panel
h2
,
.vditor-panel
h3
,
.vditor-panel
h4
,
.vditor-panel
h5
,
.vditor-panel
h6
{
...
...
@@ -362,19 +362,19 @@
border-radius
:
3px
;
line-height
:
normal
;
}
.vditor-panel
h1
:hover
,
.vditor-panel
h2
:hover
,
.vditor-panel
h3
:hover
,
.vditor-panel
h4
:hover
,
.vditor-panel
h5
:hover
,
.vditor-panel
h6
:hover
{
background-color
:
#
4285f4
;
background-color
:
#
2c2c2c
;
color
:
#fff
;
}
.vditor-input
{
border
:
0
;
padding
:
3px
5px
;
background-color
:
#
f6f8fa
;
}
background-color
:
#
2c2c2c
;
}
.vditor-input
:focus
{
background-color
:
#fff
;
outline
:
none
;
}
.vditor-icon
{
color
:
#
58606
9
;
color
:
#
b9b9b
9
;
cursor
:
pointer
;
float
:
left
;
padding
:
2px
5px
;
...
...
@@ -384,7 +384,7 @@
border
:
0
;
box-sizing
:
border-box
;
}
.vditor-icon
:hover
,
.vditor-icon--current
{
color
:
#
4285f4
;
color
:
#
fff
;
background-color
:
transparent
;
}
.vditor-icon
:focus
{
outline
:
none
;
}
...
...
@@ -401,8 +401,8 @@
* @version 0.1.2.0, Jun 20, 2019
*/
.vditor-toolbar
{
background-color
:
#
f6f8fa
;
border-bottom
:
1px
solid
#
d1d5da
;
background-color
:
#
2c2c2c
;
border-bottom
:
1px
solid
#
fff
;
padding
:
0
5px
;
border-radius
:
3px
3px
0
0
;
}
.vditor-toolbar
>
div
{
...
...
@@ -418,9 +418,9 @@
.vditor-toolbar
>
div
>
.vditor-tooltipped
:focus
{
outline
:
none
;
}
.vditor-toolbar
.vditor-tooltipped
{
color
:
#
58606
9
;
}
color
:
#
b9b9b
9
;
}
.vditor-toolbar
.vditor-tooltipped
:hover
{
color
:
#
4285f4
;
}
color
:
#
fff
;
}
.vditor-toolbar
svg
{
fill
:
currentColor
;
display
:
inline-block
;
...
...
@@ -439,7 +439,7 @@
overflow
:
hidden
;
}
.vditor-menu--current
svg
{
color
:
#
4285f4
;
}
color
:
#
fff
;
}
.vditor-menu__divider
{
width
:
10px
;
...
...
@@ -451,7 +451,7 @@
height
:
0
!important
;
}
.vditor-menu--disabled
svg
{
color
:
rgba
(
88
,
96
,
10
5
,
0.6
);
color
:
rgba
(
185
,
185
,
18
5
,
0.6
);
cursor
:
not-allowed
;
}
.vditor-emojis
{
...
...
@@ -464,21 +464,21 @@
flex
:
1
;
width
:
200px
;
margin-right
:
10px
;
color
:
#
58606
9
;
color
:
#
b9b9b
9
;
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
overflow
:
hidden
;
}
.vditor-emojis__tail
{
margin-top
:
5px
;
font-size
:
12px
;
color
:
#
58606
9
;
color
:
#
b9b9b
9
;
display
:
-webkit-box
;
display
:
flex
;
}
.vditor-emojis__tail
a
{
text-decoration
:
none
;
color
:
#
58606
9
;
}
color
:
#
b9b9b
9
;
}
.vditor-emojis__tail
a
:hover
{
color
:
#
4285f4
;
}
color
:
#
2c2c2c
;
}
.vditor-emojis
button
{
cursor
:
pointer
;
border-radius
:
3px
;
...
...
@@ -532,7 +532,7 @@
-webkit-box-orient
:
vertical
;
-webkit-box-direction
:
normal
;
flex-direction
:
column
;
border
:
1px
solid
#
d1d5da
;
border
:
1px
solid
#
fff
;
border-radius
:
3px
;
box-sizing
:
border-box
;
font-family
:
"Helvetica Neue"
,
"Luxi Sans"
,
"DejaVu Sans"
,
Tahoma
,
"Hiragino Sans GB"
,
"Microsoft Yahei"
,
sans-serif
,
"Apple Color Emoji"
,
"Segoe UI Emoji"
,
"Noto Color Emoji"
,
"Segoe UI Symbol"
,
"Android Emoji"
,
"EmojiSymbols"
;
}
...
...
@@ -563,11 +563,11 @@
resize
:
none
;
padding
:
10px
9px
10px
10px
;
box-sizing
:
border-box
;
background-color
:
#f
afbfc
;
background-color
:
#f
ff
;
outline
:
0
none
;
font-size
:
16px
;
line-height
:
22px
;
color
:
#24292e
;
color
:
rgba
(
0
,
0
,
0
,
0.8
)
;
border-radius
:
0
0
3px
3px
;
font-variant-ligatures
:
no-common-ligatures
;
white-space
:
pre-wrap
;
...
...
@@ -580,15 +580,15 @@
background-color
:
#fff
;
}
.vditor-textarea
:empty::before
{
content
:
attr
(
placeholder
);
color
:
rgba
(
36
,
41
,
46
,
0.68
);
}
color
:
rgba
(
0
,
0
,
0
,
0.68
);
}
.vditor-preview
{
-webkit-box-flex
:
1
;
flex
:
1
;
background-color
:
#f
ff
;
background-color
:
#f
3f3f3
;
overflow
:
auto
;
margin-left
:
-1px
;
padding
:
10px
;
box-shadow
:
inset
1px
0
#
d1d5da
;
box-shadow
:
inset
1px
0
#
fff
;
box-sizing
:
border-box
;
border-radius
:
0
0
3px
0
;
}
.vditor-preview
>
div
::-webkit-scrollbar
{
...
...
@@ -597,11 +597,11 @@
margin
:
0
auto
;
}
.vditor-devtools
{
display
:
none
;
background-color
:
#f
ff
;
background-color
:
#f
3f3f3
;
overflow
:
auto
;
-webkit-box-flex
:
1
;
flex
:
1
;
box-shadow
:
inset
1px
0
#
d1d5da
;
box-shadow
:
inset
1px
0
#
fff
;
box-sizing
:
border-box
;
border-radius
:
0
0
3px
0
;
padding
:
10px
;
}
...
...
@@ -610,7 +610,7 @@
position
:
absolute
;
bottom
:
10px
;
right
:
20px
;
color
:
#24292e
;
color
:
rgba
(
0
,
0
,
0
,
0.8
)
;
background-color
:
rgba
(
255
,
255
,
255
,
0.6
);
border-radius
:
3px
;
font-size
:
12px
;
...
...
@@ -638,11 +638,11 @@
bottom
:
-3px
;
}
.vditor-resize
>
div
{
height
:
3px
;
background-color
:
#f
6f8fa
;
background-color
:
#f
3f3f3
;
-webkit-transition
:
all
0.15s
ease-in-out
;
transition
:
all
0.15s
ease-in-out
;
}
.vditor-resize
:hover
>
div
,
.vditor-resize--selected
>
div
{
background-color
:
#
4285f4
;
}
background-color
:
#
2c2c2c
;
}
.vditor-resize
:hover
svg
,
.vditor-resize--selected
svg
{
color
:
#fff
;
}
.vditor-resize
svg
{
...
...
@@ -653,7 +653,7 @@
height
:
3px
;
display
:
block
;
margin
:
0
auto
;
color
:
#
58606
9
;
}
color
:
#
b9b9b
9
;
}
.vditor-upload
{
position
:
absolute
;
height
:
3px
;
...
...
@@ -661,7 +661,7 @@
top
:
-2px
;
-webkit-transition
:
all
0.15s
ease-in-out
;
transition
:
all
0.15s
ease-in-out
;
background-color
:
rgba
(
66
,
133
,
2
44
,
0.8
);
}
background-color
:
rgba
(
44
,
44
,
44
,
0.8
);
}
.vditor-tip
{
position
:
absolute
;
font-size
:
12px
;
...
...
@@ -682,7 +682,7 @@
line-height
:
16px
;
padding
:
3px
10px
;
border-radius
:
3px
;
background
:
rgba
(
66
,
133
,
2
44
,
0.8
);
background
:
rgba
(
44
,
44
,
44
,
0.8
);
position
:
relative
;
margin-left
:
-50%
;
}
.vditor-tip__content
ul
{
...
...
@@ -690,13 +690,83 @@
padding
:
0
0
0
18px
;
}
.vditor-tip__close
{
position
:
absolute
;
color
:
#
58606
9
;
color
:
#
b9b9b
9
;
top
:
-7px
;
right
:
-15px
;
font-weight
:
bold
;
cursor
:
pointer
;
}
.vditor-tip__close
:hover
{
color
:
#4285f4
;
}
color
:
#fff
;
}
.vditor-wysiwyg
{
background-color
:
#fff
;
box-sizing
:
border-box
;
-webkit-box-flex
:
1
;
flex
:
1
;
margin
:
0
;
white-space
:
pre-wrap
;
position
:
relative
;
}
.vditor-wysiwyg
[
contenteditable
=
"false"
]
{
opacity
:
0.3
;
cursor
:
not-allowed
;
}
.vditor-wysiwyg
:focus
{
outline
:
none
;
background-color
:
#fff
;
}
.vditor-wysiwyg
blockquote
:empty::before
,
.vditor-wysiwyg
pre
>
code
:empty::before
{
content
:
' '
;
}
.vditor-wysiwyg__block
[
data-type
=
"html-block"
]
>
pre
,
.vditor-wysiwyg__block
[
data-type
=
"math-block"
]
>
pre
{
margin-bottom
:
0
;
}
.vditor-wysiwyg__block
>
pre
{
margin-bottom
:
-1em
;
}
.vditor-wysiwyg__block
>
pre
>
code
{
background-color
:
#fff
!important
;
border
:
1px
solid
#fff
;
overflow
:
auto
!important
;
}
.vditor-wysiwyg__block
[
data-type
=
html-inline
]
.vditor-wysiwyg__preview
svg
{
fill
:
rgba
(
185
,
185
,
185
,
0.36
);
height
:
12px
;
cursor
:
pointer
;
width
:
12px
;
}
.vditor-wysiwyg__preview
{
cursor
:
pointer
;
white-space
:
initial
;
min-height
:
27px
;
}
.vditor-wysiwyg__preview
pre
{
margin-bottom
:
1em
!important
;
}
.vditor-wysiwyg
h1
:before
,
.vditor-wysiwyg
h2
:before
,
.vditor-wysiwyg
h3
:before
,
.vditor-wysiwyg
h4
:before
,
.vditor-wysiwyg
h5
:before
,
.vditor-wysiwyg
h6
:before
,
.vditor-wysiwyg
div
.vditor-wysiwyg__block
:before
{
float
:
left
;
padding-right
:
4px
;
margin-left
:
-29px
;
content
:
'h1'
;
font-size
:
0.85rem
;
font-weight
:
normal
;
text-transform
:
uppercase
;
color
:
rgba
(
185
,
185
,
185
,
0.36
);
}
.vditor-wysiwyg
h2
:before
{
content
:
'h2'
;
}
.vditor-wysiwyg
h3
:before
{
content
:
'h3'
;
}
.vditor-wysiwyg
h4
:before
{
content
:
'h4'
;
}
.vditor-wysiwyg
h5
:before
{
content
:
'h5'
;
}
.vditor-wysiwyg
h6
:before
{
content
:
'h6'
;
}
.vditor-wysiwyg
div
.vditor-wysiwyg__block
:before
{
content
:
"</>"
;
}
.vditor-wysiwyg
details
{
white-space
:
initial
;
}
.vditor-wysiwyg
span
[
data-type
=
"backslash"
]
>
span
{
display
:
none
;
color
:
rgba
(
185
,
185
,
185
,
0.36
);
}
.vditor-hint
{
background-color
:
#fff
;
...
...
@@ -707,7 +777,7 @@
z-index
:
4
;
line-height
:
20px
;
list-style
:
none
;
color
:
#24292e
;
color
:
rgba
(
0
,
0
,
0
,
0.8
)
;
font-size
:
12px
;
margin
:
0
;
max-width
:
250px
;
...
...
@@ -717,7 +787,7 @@
display
:
block
;
padding
:
3px
10px
;
border
:
0
;
border-bottom
:
1px
solid
#
d1d5da
;
border-bottom
:
1px
solid
#
fff
;
line-height
:
20px
;
width
:
100%
;
box-sizing
:
border-box
;
...
...
@@ -728,7 +798,7 @@
border-bottom
:
0
;
}
.vditor-hint--current
,
.vditor-hint
button
:hover
{
background-color
:
#
4285f4
!important
;
background-color
:
#
2c2c2c
!important
;
color
:
#fff
;
}
.vditor-hint__emoji
{
font-size
:
16px
;
...
...
@@ -833,7 +903,7 @@
.vditor-reset
ins
>
iframe
{
border
:
0
;
}
.vditor-reset
iframe
{
border
:
1px
solid
#
d1d5da
;
border
:
1px
solid
#
fff
;
max-width
:
100%
;
box-sizing
:
border-box
;
}
.vditor-reset
iframe
.iframe__video
{
...
...
@@ -892,7 +962,7 @@
color
:
#555
;
vertical-align
:
middle
;
background-color
:
#fcfcfc
;
border
:
solid
1px
#
d1d5da
;
border
:
solid
1px
#
fff
;
border-bottom-color
:
#bbb
;
border-radius
:
3px
;
box-shadow
:
inset
0
-1px
0
#bbb
;
}
...
...
@@ -937,11 +1007,11 @@
height
:
14px
;
width
:
14px
;
display
:
block
;
background-color
:
#
f6f8fa
;
background-color
:
#
2c2c2c
;
border-radius
:
3px
;
padding
:
3px
;
}
.vditor-copy
svg
{
color
:
#
58606
9
;
color
:
#
b9b9b
9
;
height
:
14px
;
width
:
14px
!important
;
display
:
block
;
...
...
@@ -976,14 +1046,14 @@
.vditor-speech
{
position
:
absolute
;
display
:
none
;
background-color
:
#
f6f8fa
;
border
:
1px
solid
#
d1d5da
;
background-color
:
#
2c2c2c
;
border
:
1px
solid
#
fff
;
border-radius
:
3px
;
padding
:
3px
;
cursor
:
pointer
;
color
:
#
58606
9
;
}
color
:
#
b9b9b
9
;
}
.vditor-speech
:hover
,
.vditor-speech--current
{
color
:
#
4285f4
;
}
color
:
#
fff
;
}
.vditor-speech
svg
{
height
:
14px
;
width
:
14px
;
...
...
@@ -1012,7 +1082,7 @@
padding
:
0
10px
;
}
.vditor-linkcard
a
{
border-radius
:
3px
;
background-color
:
#
f6f8fa
;
background-color
:
#
2c2c2c
;
overflow
:
hidden
;
max-height
:
250px
;
display
:
-webkit-box
;
...
...
@@ -1024,7 +1094,7 @@
box-shadow
:
0
0
3px
rgba
(
0
,
0
,
0
,
0.13
),
0
3px
6px
rgba
(
0
,
0
,
0
,
0.26
);
text-decoration
:
none
;
}
.vditor-linkcard
a
:visited
.vditor-linkcard__abstract
{
color
:
rgba
(
88
,
96
,
10
5
,
0.6
);
}
color
:
rgba
(
185
,
185
,
18
5
,
0.6
);
}
.vditor-linkcard__info
{
padding
:
10px
;
min-width
:
200px
;
...
...
@@ -1034,7 +1104,7 @@
.vditor-linkcard__title
{
font-size
:
14px
;
font-weight
:
400
;
color
:
#24292e
;
color
:
rgba
(
0
,
0
,
0
,
0.8
)
;
display
:
-webkit-box
;
display
:
flex
;
-webkit-box-align
:
center
;
...
...
@@ -1055,11 +1125,11 @@
-webkit-box-orient
:
vertical
;
display
:
-webkit-box
;
font-size
:
13px
;
color
:
#
58606
9
;
color
:
#
b9b9b
9
;
margin
:
5px
0
;
}
.vditor-linkcard__site
{
font-size
:
12px
;
color
:
#
4285f4
;
}
color
:
#
fff
;
}
.vditor-linkcard__image
{
background-size
:
cover
;
background-repeat
:
no-repeat
;
...
...
@@ -1069,76 +1139,6 @@
cursor
:
pointer
;
background-color
:
#fff
;
}
.vditor-wysiwyg
{
background-color
:
#fafbfc
;
box-sizing
:
border-box
;
-webkit-box-flex
:
1
;
flex
:
1
;
margin
:
0
;
white-space
:
pre-wrap
;
position
:
relative
;
}
.vditor-wysiwyg
[
contenteditable
=
"false"
]
{
opacity
:
0.3
;
cursor
:
not-allowed
;
}
.vditor-wysiwyg
:focus
{
outline
:
none
;
background-color
:
#fff
;
}
.vditor-wysiwyg
blockquote
:empty::before
,
.vditor-wysiwyg
pre
>
code
:empty::before
{
content
:
' '
;
}
.vditor-wysiwyg__block
[
data-type
=
"html-block"
]
>
pre
,
.vditor-wysiwyg__block
[
data-type
=
"math-block"
]
>
pre
{
margin-bottom
:
0
;
}
.vditor-wysiwyg__block
>
pre
{
margin-bottom
:
-1em
;
}
.vditor-wysiwyg__block
>
pre
>
code
{
background-color
:
#fff
!important
;
border
:
1px
solid
#d1d5da
;
overflow
:
auto
!important
;
}
.vditor-wysiwyg__block
[
data-type
=
html-inline
]
.vditor-wysiwyg__preview
svg
{
fill
:
rgba
(
88
,
96
,
105
,
0.36
);
height
:
12px
;
cursor
:
pointer
;
width
:
12px
;
}
.vditor-wysiwyg__preview
{
cursor
:
pointer
;
white-space
:
initial
;
min-height
:
27px
;
}
.vditor-wysiwyg__preview
pre
{
margin-bottom
:
1em
!important
;
}
.vditor-wysiwyg
h1
:before
,
.vditor-wysiwyg
h2
:before
,
.vditor-wysiwyg
h3
:before
,
.vditor-wysiwyg
h4
:before
,
.vditor-wysiwyg
h5
:before
,
.vditor-wysiwyg
h6
:before
,
.vditor-wysiwyg
div
.vditor-wysiwyg__block
:before
{
float
:
left
;
padding-right
:
4px
;
margin-left
:
-29px
;
content
:
'h1'
;
font-size
:
0.85rem
;
font-weight
:
normal
;
text-transform
:
uppercase
;
color
:
rgba
(
88
,
96
,
105
,
0.36
);
}
.vditor-wysiwyg
h2
:before
{
content
:
'h2'
;
}
.vditor-wysiwyg
h3
:before
{
content
:
'h3'
;
}
.vditor-wysiwyg
h4
:before
{
content
:
'h4'
;
}
.vditor-wysiwyg
h5
:before
{
content
:
'h5'
;
}
.vditor-wysiwyg
h6
:before
{
content
:
'h6'
;
}
.vditor-wysiwyg
div
.vditor-wysiwyg__block
:before
{
content
:
"</>"
;
}
.vditor-wysiwyg
details
{
white-space
:
initial
;
}
.vditor-wysiwyg
span
[
data-type
=
"backslash"
]
>
span
{
display
:
none
;
color
:
rgba
(
88
,
96
,
105
,
0.36
);
}
.vditor-reset
pre
>
code
{
background-color
:
rgba
(
255
,
255
,
255
,
0.04
);
}
...
...
src/main/resources/skins/metro-hot/css/base.scss
View file @
ef31c684
...
...
@@ -25,7 +25,7 @@
@import
"../../../scss/toc"
;
@import
"../../../scss/usite"
;
@import
"../../../scss/function"
;
@import
"vditor/src/assets/scss/
classic
"
;
@import
"vditor/src/assets/scss/
dark
"
;
.vditor-reset
pre
>
code
{
background-color
:
rgba
(
255
,
255
,
255
,
0
.04
);
...
...
src/main/resources/skins/next/article-list.ftl
View file @
ef31c684
...
...
@@ -53,7 +53,7 @@
<#if commentable>
<span>
|
<a href="${servePath}${article.articlePermalink}#comments">
<a href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${cmtLabel}</a>
</span>
</#if>
...
...
src/main/resources/skins/next/article.ftl
View file @
ef31c684
...
...
@@ -63,7 +63,7 @@
<
#if
commentable
>
<span
class=
"post-comments-count"
>
|
<a
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
${cmtLabel}
</a>
</span>
</
#
if>
...
...
@@ -108,6 +108,7 @@
</article>
</div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
>
...
...
src/main/resources/skins/next/css/base.css
View file @
ef31c684
...
...
@@ -1321,7 +1321,7 @@ img {
padding
:
5px
;
background
:
#222
;
line-height
:
0
;
z-index
:
1050
;
z-index
:
21
;
cursor
:
pointer
;
-webkit-transform
:
translateZ
(
0
);
}
...
...
@@ -1380,7 +1380,7 @@ img {
position
:
fixed
;
bottom
:
19px
;
right
:
50px
;
z-index
:
1050
;
z-index
:
22
;
width
:
15px
;
height
:
13px
;
padding
:
5px
;
...
...
@@ -1408,7 +1408,7 @@ img {
right
:
-320px
;
top
:
0
;
bottom
:
0
;
z-index
:
104
0
;
z-index
:
2
0
;
box-shadow
:
inset
0
2px
6px
#000
;
background
:
#222
;
-webkit-transform
:
translateZ
(
0
);
...
...
src/main/resources/skins/next/css/base.scss
View file @
ef31c684
...
...
@@ -345,7 +345,7 @@ img {
padding
:
5px
;
background
:
#222
;
line-height
:
0
;
z-index
:
1050
;
z-index
:
21
;
cursor
:
pointer
;
-webkit-transform
:
translateZ
(
0
);
}
...
...
@@ -407,7 +407,7 @@ img {
position
:
fixed
;
bottom
:
19px
;
right
:
50px
;
z-index
:
1050
;
z-index
:
22
;
width
:
15px
;
height
:
13px
;
padding
:
5px
;
...
...
@@ -438,7 +438,7 @@ img {
right
:
-320px
;
top
:
0
;
bottom
:
0
;
z-index
:
104
0
;
z-index
:
2
0
;
box-shadow
:
inset
0
2px
6px
#000
;
background
:
#222
;
-webkit-transform
:
translateZ
(
0
);
...
...
src/main/resources/skins/nijigen/article-list.ftl
View file @
ef31c684
...
...
@@ -57,7 +57,7 @@
</#list>
</span>
<#if commentable>
<a class="tag" href="${servePath}${article.articlePermalink}#comments">
<a class="tag" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<i class="icon__comments"></i> <span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span> ${commentLabel}
</a>
</#if>
...
...
src/main/resources/skins/nijigen/article.ftl
View file @
ef31c684
...
...
@@ -73,7 +73,7 @@
</
#
list>
</span>
<
#if
commentable
>
<a
class=
"tag"
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
class=
"tag"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
<i
class=
"icon__comments"
></i>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
${commentLabel}
</a>
</
#
if>
...
...
@@ -133,6 +133,7 @@
</div>
</
#
if>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
class=
"module__content"
style=
"border-radius: 5px;margin-bottom: 30px;box-shadow: 1px 1px 3px 1px rgba(0,0,0,0.2);transition: all .3s;"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
...
...
src/main/resources/skins/owmx-3.0/article-list.ftl
View file @
ef31c684
...
...
@@ -48,7 +48,7 @@
<a rel="nofollow" href="${servePath}${article.articlePermalink}">
<span data-uvstaturl="${servePath}${article.articlePermalink}">${article.articleViewCount}</span>
</a><#if commentable> | ${commentCount1Label}
<a rel="nofollow" href="${servePath}${article.articlePermalink}#comments">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<span class="left articles-commentIcon" title="${commentLabel}"></span>
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span>
</a>
...
...
src/main/resources/skins/owmx-3.0/article.ftl
View file @
ef31c684
...
...
@@ -62,7 +62,7 @@ ${topBarReplacement}
<span
data-uvstaturl=
"${servePath}${article.articlePermalink}"
>
${article.articleViewCount}
</span>
</a>
<
#if
commentable
>
| ${commentCount1Label}
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
<span
class=
"left articles-commentIcon"
title=
"${commentLabel}"
></span>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
</a>
...
...
@@ -104,6 +104,7 @@ ${topBarReplacement}
<div
id=
"randomArticles"
></div>
<div
id=
"externalRelevantArticles"
></div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
class=
"comments"
style=
"padding-top: 15px;"
...
...
src/main/resources/skins/timeline/article-list.ftl
View file @
ef31c684
...
...
@@ -57,7 +57,7 @@
<a rel="author" href="${servePath}/authors/${article.authorId}">${article.authorName}</a>
</span>
<span class="ico-comment ico" title="${commentLabel}">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#comments">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span>
</a>
</span>
...
...
src/main/resources/skins/timeline/article.ftl
View file @
ef31c684
...
...
@@ -79,7 +79,7 @@ ${topBarReplacement}
</span>
<
#if
commentable
>
<span
class=
"ico-comment ico"
title=
"${commentLabel}"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#comments"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
</a>
</span>
...
...
@@ -118,6 +118,7 @@ ${topBarReplacement}
<div
id=
"externalRelevantArticles"
></div>
</
#
if>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
class=
"module"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
<div
id=
"soloComments"
style=
"display: none;"
class=
"module"
>
...
...
src/main/resources/skins/timeline/index.ftl
View file @
ef31c684
...
...
@@ -93,7 +93,7 @@
</span>
<
#if
commentable
>
<span
class=
"ico-comment ico"
title=
"${commentLabel}"
>
<a
rel=
"nofollow"
data-uvstatcmt=
"${article.oId} href="
${
servePath
}${
article
.
articlePermalink
}
#comments
"
>
<a
rel=
"nofollow"
data-uvstatcmt=
"${article.oId} href="
${
servePath
}${
article
.
articlePermalink
}
#
b3logsolo
comments
"
>
${article.articleCommentCount}
</a>
</span>
...
...
src/main/resources/skins/timeline/js/common.js
View file @
ef31c684
...
...
@@ -310,7 +310,7 @@ window.timeline = {
+
'
<a rel="author" href="
'
+
Label
.
servePath
+
'
/authors/
'
+
article
.
authorId
+
'
">
'
+
article
.
authorName
+
'
</a></span> <span class="ico-comment ico" title="
'
+
Label
.
commentLabel
+
'
"><a rel="nofollow" href="
'
+
Label
.
servePath
+
article
.
articlePermalink
+
'
#comments" data-uvstatcmt="
'
+
article
.
oId
+
'
">
'
+
article
.
articleCommentCount
+
'
#
b3logsolo
comments" data-uvstatcmt="
'
+
article
.
oId
+
'
">
'
+
article
.
articleCommentCount
+
'
</a></span> <span class="ico-view ico" title="
'
+
Label
.
viewLabel
+
'
">
'
+
'
<a rel="nofollow" href="${servePath}${article.articlePermalink}">
'
+
'
<span data-uvstaturl="
'
+
Label
.
servePath
+
article
.
articlePermalink
+
'
">
'
+
article
.
articleViewCount
+
'
</span>
'
...
...
src/main/resources/skins/timeline/js/common.min.js
View file @
ef31c684
...
...
@@ -173,7 +173,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque
/***/
(
function
(
module
,
__webpack_exports__
,
__webpack_require__
)
{
"
use strict
"
;
eval
(
"
__webpack_require__.r(__webpack_exports__);
\n
/* harmony import */ var _js_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../js/common */
\"
./src/main/resources/js/common.js
\"
);
\n
/*
\n
* Solo - A small and beautiful blogging system written in Java.
\n
* Copyright (c) 2010-present, b3log.org
\n
*
\n
* This program is free software: you can redistribute it and/or modify
\n
* it under the terms of the GNU Affero General Public License as published by
\n
* the Free Software Foundation, either version 3 of the License, or
\n
* (at your option) any later version.
\n
*
\n
* This program is distributed in the hope that it will be useful,
\n
* but WITHOUT ANY WARRANTY; without even the implied warranty of
\n
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\n
* GNU Affero General Public License for more details.
\n
*
\n
* You should have received a copy of the GNU Affero General Public License
\n
* along with this program. If not, see <https://www.gnu.org/licenses/>.
\n
*/
\n
/**
\n
* @fileoverview timeline js.
\n
*
\n
* @author <a href=
\"
http://vanessa.b3log.org
\"
>Liyuan Li</a>
\n
* @version 1.0.0.0, Jan 18, 2019
\n
*/
\n\n\n\n
window.timeline = {
\n
_COLHA: 0,
\n
_COLHB: 20,
\n
/**
\n
* @description 时间戳转化为时间格式
\n
* @param {String} time 时间
\n
* @param {String} format 格式化后日期格式
\n
* @returns {String} 格式化后的时间
\n
*/
\n
toDate: function (time, format) {
\n
var dateTime = new Date(time)
\n
var o = {
\n
'M+': dateTime.getMonth() + 1, //month
\n
'd+': dateTime.getDate(), //day
\n
'H+': dateTime.getHours(), //hour
\n
'm+': dateTime.getMinutes(), //minute
\n
's+': dateTime.getSeconds(), //second
\n
'q+': Math.floor((dateTime.getMonth() + 3) / 3), //quarter
\n
'S': dateTime.getMilliseconds(), //millisecond
\n
}
\n\n
if (/(y+)/.test(format)) {
\n
format = format.replace(RegExp.$1,
\n
(dateTime.getFullYear() + '').substr(4 - RegExp.$1.length))
\n
}
\n\n
for (var k in o) {
\n
if (new RegExp('(' + k + ')').test(format)) {
\n
format = format.replace(RegExp.$1,
\n
RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(
\n
('' + o[k]).length))
\n
}
\n
}
\n
return format
\n
},
\n
_initArticleList: function() {
\n
var $articles = $(
\"
.articles
\"
);
\n
if ($articles.length === 0 || $(
\"
.articles > .fn-clear
\"
).length > 0) {
\n
return;
\n
}
\n\n
$(window).resize(function() {
\n
if ($(
\"
#hideTop
\"
).css(
\"
top
\"
) ===
\"
auto
\"
) {
\n
var colH = [timeline._COLHA, timeline._COLHB];
\n
$articles.find(
\"
article
\"
).each(function() {
\n
var $it = $(this),
\n
isLeft = colH[1] > colH[0],
\n
top = isLeft ? colH[0] : colH[1];
\n
if (parseInt($it.css(
\"
top
\"
)) !== top || top === 0) {
\n
$it.css({
\n
\"
top
\"
: top +
\"
px
\"
,
\n
\"
position
\"
:
\"
absolute
\"\n
});
\n\n
if (isLeft) {
\n
this.className =
\"
l
\"
;
\n
} else {
\n
this.className =
\"
r
\"
;
\n
}
\n
}
\n
colH[(isLeft ? '0' : '1')] += parseInt($it.outerHeight(true));
\n
});
\n\n
$articles.height(colH[0] > colH[1] ? colH[0] : colH[1]);
\n
} else {
\n
$articles.find(
\"
article
\"
).each(function() {
\n
$(this).css({
\n
\"
position
\"
:
\"
inherit
\"
,
\n
\"
top
\"
:
\"
auto
\"\n
}).removeClass(
\"
r l
\"
);
\n
});
\n
$articles.css(
\"
height
\"
,
\"
auto
\"
);
\n
}
\n
});
\n\n
$(window).resize();
\n
$(
\"
.module img
\"
).imagesLoaded(function() {
\n
$(window).resize();
\n
});
\n
},
\n
_initIndexList: function() {
\n
var $archives = $(
\"
.articles > .fn-clear
\"
);
\n
if ($archives.length === 0) {
\n
return;
\n
}
\n\n
// 如果为 index 页面,重构 archives 结构,使其可收缩
\n
var year = 0;
\n
$(
\"
.nav-abs li
\"
).each(function(i) {
\n
var $this = $(this);
\n
$this.hide();
\n
if (year !== $this.data(
\"
year
\"
)) {
\n
year = $this.data(
\"
year
\"
);
\n
$this.before(
\"
<li class='close year' onclick='timeline.toggleArchives(this,
\"
+
\n
year +
\"
)'>
\"
+ year +
\"
</li>
\"
);
\n
}
\n
});
\n\n
// 首次加载时,当没有下一页时,使用 js 隐藏
\"
更多
\"
按钮
\n
if ($(
\"
.article-more
\"
).parent().data(
\"
count
\"
) <= $(
\"
.article-more
\"
).parent().find(
\"
article
\"
).length) {
\n
$(
\"
.article-more
\"
).remove();
\n
}
\n\n
$(window).resize(function() {
\n
$archives.each(function() {
\n
if ($(
\"
#hideTop
\"
).css(
\"
top
\"
) ===
\"
auto
\"
) {
\n
var colH = [timeline._COLHA + 60, timeline._COLHB * 4];
\n\n
var $articles = $(this).find(
\"
article
\"
);
\n
if ($articles.length === 0) {
\n
$(this).find(
\"
h2
\"
).remove();
\n
$(this).css(
\"
margin-bottom
\"
, 0);
\n
} else {
\n
$articles.each(function() {
\n
var $it = $(this),
\n
isLeft = colH[1] > colH[0],
\n
top = isLeft ? colH[0] : colH[1];
\n\n
if (parseInt($it.css(
\"
top
\"
)) !== top || top === 0) {
\n
$it.css({
\n
\"
top
\"
: top +
\"
px
\"
,
\n
\"
position
\"
:
\"
absolute
\"\n
});
\n\n
if (isLeft) {
\n
this.className =
\"
l
\"
;
\n
} else {
\n
this.className =
\"
r
\"
;
\n
}
\n
}
\n
colH[(isLeft ? '0' : '1')] += parseInt($it.outerHeight(true));
\n
});
\n
$(this).height(colH[0] > colH[1] ? colH[0] : colH[1]);
\n
}
\n
} else {
\n
var $articles = $(this).find(
\"
article
\"
);
\n
if ($articles.length === 0) {
\n
$(this).find(
\"
h2
\"
).remove();
\n
$(this).css(
\"
margin-bottom
\"
, 0);
\n
} else {
\n
$articles.each(function() {
\n
$(this).css({
\n
\"
position
\"
:
\"
inherit
\"
,
\n
\"
top
\"
:
\"
auto
\"\n
}).removeClass(
\"
r l
\"
);
\n
});
\n
$(this).css(
\"
height
\"
,
\"
auto
\"
);
\n
}
\n
}
\n
});
\n
});
\n\n
$(window).resize();
\n
$(
\"
.module img
\"
).imagesLoaded(function() {
\n
$(window).resize();
\n
});
\n
},
\n
_setNavCurrent: function() {
\n
$(
\"
.header li a
\"
).each(function() {
\n
if ($(this).prop(
\"
href
\"
) === location.href.split(
\"
#
\"
)[0]) {
\n
this.className =
\"
current
\"
;
\n
} else {
\n
this.className =
\"\"
;
\n
}
\n
})
\n
},
\n
init: function() {
\n
$(window).scroll(function() {
\n
if ($(window).scrollTop() > 60) {
\n
$(
\"
.ico-top
\"
).show();
\n
} else {
\n
$(
\"
.ico-top
\"
).hide();
\n
}
\n
});
\n
timeline._initIndexList();
\n
timeline._initArticleList();
\n
timeline._setNavCurrent();
\n\n
// init header list
\n
$(
\"
.ico-list
\"
).click(function() {
\n
if ($(
\"
.header > .container > form
\"
).css(
\"
height
\"
) ===
\"
0px
\"
) {
\n
$(
\"
.header > .container > ul, .header > .container > form
\"
).css({
\n
\"
height
\"
:
\"
auto
\"\n
});
\n
} else {
\n
$(
\"
.header > .container > ul, .header > .container > form
\"
).animate({
\n
\"
height
\"
:
\"
0px
\"\n
});
\n
}
\n
});
\n
},
\n
translate: function() {
\n
window.open(
\"
http://translate.google.com/translate?sl=auto&tl=auto&u=
\"
+ location.href);
\n
},
\n
getArchive: function(year, month, monthName) {
\n
var archiveDate = year + month,
\n
archive = year +
\"
/
\"
+ month;
\n
window.location.hash =
\"
#
\"
+ archiveDate;
\n
if ($(
\"
#
\"
+ archiveDate +
\"
> article
\"
).length === 0) {
\n
var archiveDataTitle = year +
\"
\"
+ Label.yearLabel +
\"
\"
+ month +
\"
\"
+ Label.monthLabel;
\n
if (Label.localeString.substring(0, 2) ===
\"
en
\"
) {
\n
archiveDataTitle = monthName +
\"
\"
+ year;
\n
}
\n
var archiveHTML = '<h2><span class=
\"
article-archive
\"
>' + archiveDataTitle + '</span></h2>'
\n
+ '<div class=
\"
article-more
\"
onclick=
\"
timeline.getNextPage(this,
\\
''
\n
+ archive + '
\\
')
\"
data-page=
\"
0
\"
>' + Label.moreLabel + '</div>';
\n\n
$(
\"
#
\"
+ archiveDate).html(archiveHTML).css(
\"
margin-bottom
\"
,
\"
50px
\"
);
\n
timeline.getNextPage($(
\"
#
\"
+ archiveDate).find(
\"
.article-more
\"
)[0], archive);
\n
}
\n
},
\n
getNextPage: function(it, archive) {
\n
var $more = $(it),
\n
currentPage = $more.data(
\"
page
\"
) + 1,
\n
path =
\"
/articles/
\"
;
\n
if ($(
\"
#tag
\"
).length === 1) {
\n
var pathnames = location.pathname.split(
\"
/
\"
);
\n
path =
\"
/articles/tags/
\"
+ pathnames[pathnames.length - 1];
\n
} else if ($(
\"
#author
\"
).length === 1) {
\n
var pathnames = location.pathname.split(
\"
/
\"
);
\n
path =
\"
/articles/authors/
\"
+ pathnames[pathnames.length - 1];
\n
} else if ($(
\"
#category
\"
).length === 1) {
\n
var pathnames = location.pathname.split(
\"
/
\"
);
\n
path =
\"
/articles/category/
\"
+ pathnames[pathnames.length - 1];
\n
} else if (archive) {
\n
path =
\"
/articles/archives/
\"
+ archive;
\n
}
\n
$.ajax({
\n
url: Label.servePath + path + '?p=' + currentPage,
\n
type:
\"
GET
\"
,
\n
beforeSend: function() {
\n
$more.css(
\"
background
\"
,
\n
\"
url(
\"
+ Label.staticServePath
\n
+
\"
/skins/timeline/images/ajax-loader.gif) no-repeat scroll center center #60829F
\"
).text(
\"\"
);
\n
},
\n
success: function(result, textStatus) {
\n
if (!result.sc) {
\n
$more.css(
\"
background
\"
,
\"
none #60829F
\"
).text(
\"
Error
\"
);
\n
return;
\n
}
\n\n
if (result.rslts.articles.length === 0) {
\n
$more.remove();
\n
return;
\n
}
\n\n
var articlesHTML =
\"\"
,
\n
pagination = result.rslts.pagination;
\n\n
// append articles
\n
for (var i = 0; i < result.rslts.articles.length; i++) {
\n
var article = result.rslts.articles[i];
\n\n
articlesHTML += '<article><div class=
\"
module
\"
><div class=
\"
dot
\"
></div>'
\n
+ '<div class=
\"
arrow
\"
></div><time class=
\"
article-time
\"
><span>'
\n
+ timeline.toDate(article.articleCreateTime, 'yy-MM-dd HH:mm')
\n
+ '</span></time><h3 class=
\"
article-title
\"
><a rel=
\"
bookmark
\"
href=
\"
'
\n
+ Label.servePath + article.articlePermalink + '
\"
>'
\n
+ article.articleTitle + '</a>';
\n\n
if (article.articlePutTop) {
\n
articlesHTML += '<sup>' + Label.topArticleLabel + '</sup>';
\n
}
\n\n
if (article.hasUpdated) {
\n
articlesHTML += '<sup><a href=
\"
'
\n
+ Label.servePath + article.articlePermalink + '
\"
>' + Label.updatedLabel + '</a></sup>';
\n
}
\n\n
articlesHTML += '</h3><p>' + article.articleAbstract + '</p>'
\n
+ '<span class=
\"
ico-tags ico
\"
title=
\"
' + Label.tagLabel + '
\"
>';
\n\n
var articleTags = article.articleTags.split(
\"
,
\"
);
\n
for (var j = 0; j < articleTags.length; j++) {
\n
articlesHTML += '<a rel=
\"
category tag
\"
href=
\"
' + Label.servePath
\n
+ '/tags/' + encodeURIComponent(articleTags[j]) + '
\"
>' + articleTags[j] + '</a>';
\n\n
if (j < articleTags.length - 1) {
\n
articlesHTML +=
\"
,
\"
;
\n
}
\n
}
\n\n
articlesHTML += '</span> <span class=
\"
ico-author ico
\"
title=
\"
' + Label.authorLabel + '
\"
>'
\n
+ '<a rel=
\"
author
\"
href=
\"
' + Label.servePath + '/authors/' + article.authorId + '
\"
>'
\n
+ article.authorName + '</a></span> <span class=
\"
ico-comment ico
\"
title=
\"
'
\n
+ Label.commentLabel + '
\"
><a rel=
\"
nofollow
\"
href=
\"
' + Label.servePath + article.articlePermalink
\n
+ '#comments
\"
data-uvstatcmt=
\"
' + article.oId + '
\"
>' + article.articleCommentCount
\n
+ '</a></span> <span class=
\"
ico-view ico
\"
title=
\"
' + Label.viewLabel + '
\"
>'
\n
+ '<a rel=
\"
nofollow
\"
href=
\"
${servePath}${article.articlePermalink}
\"
>'
\n
+ '<span data-uvstaturl=
\"
' + Label.servePath + article.articlePermalink + '
\"
>' + article.articleViewCount + '</span>'
\n
+ '</a></span></div></article>';
\n
}
\n\n
$more.before(articlesHTML).data(
\"
page
\"
, currentPage);
\n
// 最后一页处理
\n
if (pagination.paginationPageCount <= currentPage) {
\n
$more.remove();
\n
} else {
\n
$more.css(
\"
background
\"
,
\"
none #60829F
\"
).text(Label.moreLabel);
\n
}
\n\n
$(window).resize();
\n
$(
\"
.module img
\"
).imagesLoaded(function() {
\n
$(window).resize();
\n
});
\n\n
Util.uvstat.renderStat()
\n
Util.uvstat.renderCmtStat()
\n
}
\n
});
\n
},
\n
toggleArchives: function(it, year) {
\n
$(
\"
.nav-abs li
\"
).each(function(i) {
\n
var $it = $(this);
\n
if (!$it.hasClass(
\"
year
\"
)) {
\n
$it.hide();
\n
if (year === $it.data(
\"
year
\"
) && $(it).hasClass(
\"
close
\"
)) {
\n
$it.show();
\n
}
\n
}
\n
});
\n\n
$(
\"
.nav-abs li.year
\"
).each(function() {
\n
if (parseInt($(this).text()) === year) {
\n
if ($(it).hasClass(
\"
close
\"
)) {
\n
it.className =
\"
year open
\"
;
\n
} else {
\n
it.className =
\"
year close
\"
;
\n
}
\n
} else {
\n
this.className =
\"
year close
\"
;
\n
}
\n
});
\n
}
\n
};
\n\n
/*!
\n
* jQuery imagesLoaded plugin v2.1.1
\n
* http://github.com/desandro/imagesloaded
\n
*
\n
* MIT License. by Paul Irish et al.
\n
*/
\n\n
/*jshint curly: true, eqeqeq: true, noempty: true, strict: true, undef: true, browser: true */
\n
/*global jQuery: false */
\n\n
;
\n
(function($, undefined) {
\n
'use strict';
\n\n
// blank image data-uri bypasses webkit log warning (thx doug jones)
\n
var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
\n\n
$.fn.imagesLoaded = function(callback) {
\n
var $this = this,
\n
deferred = $.isFunction($.Deferred) ? $.Deferred() : 0,
\n
hasNotify = $.isFunction(deferred.notify),
\n
$images = $this.find('img').add($this.filter('img')),
\n
loaded = [],
\n
proper = [],
\n
broken = [];
\n\n
// Register deferred callbacks
\n
if ($.isPlainObject(callback)) {
\n
$.each(callback, function(key, value) {
\n
if (key === 'callback') {
\n
callback = value;
\n
} else if (deferred) {
\n
deferred[key](value);
\n
}
\n
});
\n
}
\n\n
function doneLoading() {
\n
var $proper = $(proper),
\n
$broken = $(broken);
\n\n
if (deferred) {
\n
if (broken.length) {
\n
deferred.reject($images, $proper, $broken);
\n
} else {
\n
deferred.resolve($images);
\n
}
\n
}
\n\n
if ($.isFunction(callback)) {
\n
callback.call($this, $images, $proper, $broken);
\n
}
\n
}
\n\n
function imgLoadedHandler(event) {
\n
imgLoaded(event.target, event.type === 'error');
\n
}
\n\n
function imgLoaded(img, isBroken) {
\n
// don't proceed if BLANK image, or image is already loaded
\n
if (img.src === BLANK || $.inArray(img, loaded) !== -1) {
\n
return;
\n
}
\n\n
// store element in loaded images array
\n
loaded.push(img);
\n\n
// keep track of broken and properly loaded images
\n
if (isBroken) {
\n
broken.push(img);
\n
} else {
\n
proper.push(img);
\n
}
\n\n
// cache image and its state for future calls
\n
$.data(img, 'imagesLoaded', {
\n
isBroken: isBroken,
\n
src: img.src
\n
});
\n\n
// trigger deferred progress method if present
\n
if (hasNotify) {
\n
deferred.notifyWith($(img), [isBroken, $images, $(proper), $(broken)]);
\n
}
\n\n
// call doneLoading and clean listeners if all images are loaded
\n
if ($images.length === loaded.length) {
\n
setTimeout(doneLoading);
\n
$images.unbind('.imagesLoaded', imgLoadedHandler);
\n
}
\n
}
\n\n
// if no images, trigger immediately
\n
if (!$images.length) {
\n
doneLoading();
\n
} else {
\n
$images.bind('load.imagesLoaded error.imagesLoaded', imgLoadedHandler)
\n
.each(function(i, el) {
\n
var src = el.src;
\n\n
// find out if this image has been already checked for status
\n
// if it was, and src has not changed, call imgLoaded on it
\n
var cached = $.data(el, 'imagesLoaded');
\n
if (cached && cached.src === src) {
\n
imgLoaded(el, cached.isBroken);
\n
return;
\n
}
\n\n
// if complete is true and browser supports natural sizes, try
\n
// to check for image status manually
\n
if (el.complete && el.naturalWidth !== undefined) {
\n
imgLoaded(el, el.naturalWidth === 0 || el.naturalHeight === 0);
\n
return;
\n
}
\n\n
// cached images don't fire load sometimes, so we reset src, but only when
\n
// dealing with IE, or image is complete (loaded) and failed manual check
\n
// webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
\n
if (el.readyState || el.complete) {
\n
el.src = BLANK;
\n
el.src = src;
\n
}
\n
});
\n
}
\n\n
return deferred ? deferred.promise($this) : $this;
\n
};
\n\n
})($);
\n\n
(function() {
\n
Util.setTopBar()
\n
Util.buildTags(
\"
tagsSide
\"
);
\n\n
timeline.init();
\n
})();
\n\n\n
//# sourceURL=webpack:///./src/main/resources/skins/timeline/js/common.js?
"
);
eval
(
"
__webpack_require__.r(__webpack_exports__);
\n
/* harmony import */ var _js_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../js/common */
\"
./src/main/resources/js/common.js
\"
);
\n
/*
\n
* Solo - A small and beautiful blogging system written in Java.
\n
* Copyright (c) 2010-present, b3log.org
\n
*
\n
* This program is free software: you can redistribute it and/or modify
\n
* it under the terms of the GNU Affero General Public License as published by
\n
* the Free Software Foundation, either version 3 of the License, or
\n
* (at your option) any later version.
\n
*
\n
* This program is distributed in the hope that it will be useful,
\n
* but WITHOUT ANY WARRANTY; without even the implied warranty of
\n
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\n
* GNU Affero General Public License for more details.
\n
*
\n
* You should have received a copy of the GNU Affero General Public License
\n
* along with this program. If not, see <https://www.gnu.org/licenses/>.
\n
*/
\n
/**
\n
* @fileoverview timeline js.
\n
*
\n
* @author <a href=
\"
http://vanessa.b3log.org
\"
>Liyuan Li</a>
\n
* @version 1.0.0.0, Jan 18, 2019
\n
*/
\n\n\n\n
window.timeline = {
\n
_COLHA: 0,
\n
_COLHB: 20,
\n
/**
\n
* @description 时间戳转化为时间格式
\n
* @param {String} time 时间
\n
* @param {String} format 格式化后日期格式
\n
* @returns {String} 格式化后的时间
\n
*/
\n
toDate: function (time, format) {
\n
var dateTime = new Date(time)
\n
var o = {
\n
'M+': dateTime.getMonth() + 1, //month
\n
'd+': dateTime.getDate(), //day
\n
'H+': dateTime.getHours(), //hour
\n
'm+': dateTime.getMinutes(), //minute
\n
's+': dateTime.getSeconds(), //second
\n
'q+': Math.floor((dateTime.getMonth() + 3) / 3), //quarter
\n
'S': dateTime.getMilliseconds(), //millisecond
\n
}
\n\n
if (/(y+)/.test(format)) {
\n
format = format.replace(RegExp.$1,
\n
(dateTime.getFullYear() + '').substr(4 - RegExp.$1.length))
\n
}
\n\n
for (var k in o) {
\n
if (new RegExp('(' + k + ')').test(format)) {
\n
format = format.replace(RegExp.$1,
\n
RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(
\n
('' + o[k]).length))
\n
}
\n
}
\n
return format
\n
},
\n
_initArticleList: function() {
\n
var $articles = $(
\"
.articles
\"
);
\n
if ($articles.length === 0 || $(
\"
.articles > .fn-clear
\"
).length > 0) {
\n
return;
\n
}
\n\n
$(window).resize(function() {
\n
if ($(
\"
#hideTop
\"
).css(
\"
top
\"
) ===
\"
auto
\"
) {
\n
var colH = [timeline._COLHA, timeline._COLHB];
\n
$articles.find(
\"
article
\"
).each(function() {
\n
var $it = $(this),
\n
isLeft = colH[1] > colH[0],
\n
top = isLeft ? colH[0] : colH[1];
\n
if (parseInt($it.css(
\"
top
\"
)) !== top || top === 0) {
\n
$it.css({
\n
\"
top
\"
: top +
\"
px
\"
,
\n
\"
position
\"
:
\"
absolute
\"\n
});
\n\n
if (isLeft) {
\n
this.className =
\"
l
\"
;
\n
} else {
\n
this.className =
\"
r
\"
;
\n
}
\n
}
\n
colH[(isLeft ? '0' : '1')] += parseInt($it.outerHeight(true));
\n
});
\n\n
$articles.height(colH[0] > colH[1] ? colH[0] : colH[1]);
\n
} else {
\n
$articles.find(
\"
article
\"
).each(function() {
\n
$(this).css({
\n
\"
position
\"
:
\"
inherit
\"
,
\n
\"
top
\"
:
\"
auto
\"\n
}).removeClass(
\"
r l
\"
);
\n
});
\n
$articles.css(
\"
height
\"
,
\"
auto
\"
);
\n
}
\n
});
\n\n
$(window).resize();
\n
$(
\"
.module img
\"
).imagesLoaded(function() {
\n
$(window).resize();
\n
});
\n
},
\n
_initIndexList: function() {
\n
var $archives = $(
\"
.articles > .fn-clear
\"
);
\n
if ($archives.length === 0) {
\n
return;
\n
}
\n\n
// 如果为 index 页面,重构 archives 结构,使其可收缩
\n
var year = 0;
\n
$(
\"
.nav-abs li
\"
).each(function(i) {
\n
var $this = $(this);
\n
$this.hide();
\n
if (year !== $this.data(
\"
year
\"
)) {
\n
year = $this.data(
\"
year
\"
);
\n
$this.before(
\"
<li class='close year' onclick='timeline.toggleArchives(this,
\"
+
\n
year +
\"
)'>
\"
+ year +
\"
</li>
\"
);
\n
}
\n
});
\n\n
// 首次加载时,当没有下一页时,使用 js 隐藏
\"
更多
\"
按钮
\n
if ($(
\"
.article-more
\"
).parent().data(
\"
count
\"
) <= $(
\"
.article-more
\"
).parent().find(
\"
article
\"
).length) {
\n
$(
\"
.article-more
\"
).remove();
\n
}
\n\n
$(window).resize(function() {
\n
$archives.each(function() {
\n
if ($(
\"
#hideTop
\"
).css(
\"
top
\"
) ===
\"
auto
\"
) {
\n
var colH = [timeline._COLHA + 60, timeline._COLHB * 4];
\n\n
var $articles = $(this).find(
\"
article
\"
);
\n
if ($articles.length === 0) {
\n
$(this).find(
\"
h2
\"
).remove();
\n
$(this).css(
\"
margin-bottom
\"
, 0);
\n
} else {
\n
$articles.each(function() {
\n
var $it = $(this),
\n
isLeft = colH[1] > colH[0],
\n
top = isLeft ? colH[0] : colH[1];
\n\n
if (parseInt($it.css(
\"
top
\"
)) !== top || top === 0) {
\n
$it.css({
\n
\"
top
\"
: top +
\"
px
\"
,
\n
\"
position
\"
:
\"
absolute
\"\n
});
\n\n
if (isLeft) {
\n
this.className =
\"
l
\"
;
\n
} else {
\n
this.className =
\"
r
\"
;
\n
}
\n
}
\n
colH[(isLeft ? '0' : '1')] += parseInt($it.outerHeight(true));
\n
});
\n
$(this).height(colH[0] > colH[1] ? colH[0] : colH[1]);
\n
}
\n
} else {
\n
var $articles = $(this).find(
\"
article
\"
);
\n
if ($articles.length === 0) {
\n
$(this).find(
\"
h2
\"
).remove();
\n
$(this).css(
\"
margin-bottom
\"
, 0);
\n
} else {
\n
$articles.each(function() {
\n
$(this).css({
\n
\"
position
\"
:
\"
inherit
\"
,
\n
\"
top
\"
:
\"
auto
\"\n
}).removeClass(
\"
r l
\"
);
\n
});
\n
$(this).css(
\"
height
\"
,
\"
auto
\"
);
\n
}
\n
}
\n
});
\n
});
\n\n
$(window).resize();
\n
$(
\"
.module img
\"
).imagesLoaded(function() {
\n
$(window).resize();
\n
});
\n
},
\n
_setNavCurrent: function() {
\n
$(
\"
.header li a
\"
).each(function() {
\n
if ($(this).prop(
\"
href
\"
) === location.href.split(
\"
#
\"
)[0]) {
\n
this.className =
\"
current
\"
;
\n
} else {
\n
this.className =
\"\"
;
\n
}
\n
})
\n
},
\n
init: function() {
\n
$(window).scroll(function() {
\n
if ($(window).scrollTop() > 60) {
\n
$(
\"
.ico-top
\"
).show();
\n
} else {
\n
$(
\"
.ico-top
\"
).hide();
\n
}
\n
});
\n
timeline._initIndexList();
\n
timeline._initArticleList();
\n
timeline._setNavCurrent();
\n\n
// init header list
\n
$(
\"
.ico-list
\"
).click(function() {
\n
if ($(
\"
.header > .container > form
\"
).css(
\"
height
\"
) ===
\"
0px
\"
) {
\n
$(
\"
.header > .container > ul, .header > .container > form
\"
).css({
\n
\"
height
\"
:
\"
auto
\"\n
});
\n
} else {
\n
$(
\"
.header > .container > ul, .header > .container > form
\"
).animate({
\n
\"
height
\"
:
\"
0px
\"\n
});
\n
}
\n
});
\n
},
\n
translate: function() {
\n
window.open(
\"
http://translate.google.com/translate?sl=auto&tl=auto&u=
\"
+ location.href);
\n
},
\n
getArchive: function(year, month, monthName) {
\n
var archiveDate = year + month,
\n
archive = year +
\"
/
\"
+ month;
\n
window.location.hash =
\"
#
\"
+ archiveDate;
\n
if ($(
\"
#
\"
+ archiveDate +
\"
> article
\"
).length === 0) {
\n
var archiveDataTitle = year +
\"
\"
+ Label.yearLabel +
\"
\"
+ month +
\"
\"
+ Label.monthLabel;
\n
if (Label.localeString.substring(0, 2) ===
\"
en
\"
) {
\n
archiveDataTitle = monthName +
\"
\"
+ year;
\n
}
\n
var archiveHTML = '<h2><span class=
\"
article-archive
\"
>' + archiveDataTitle + '</span></h2>'
\n
+ '<div class=
\"
article-more
\"
onclick=
\"
timeline.getNextPage(this,
\\
''
\n
+ archive + '
\\
')
\"
data-page=
\"
0
\"
>' + Label.moreLabel + '</div>';
\n\n
$(
\"
#
\"
+ archiveDate).html(archiveHTML).css(
\"
margin-bottom
\"
,
\"
50px
\"
);
\n
timeline.getNextPage($(
\"
#
\"
+ archiveDate).find(
\"
.article-more
\"
)[0], archive);
\n
}
\n
},
\n
getNextPage: function(it, archive) {
\n
var $more = $(it),
\n
currentPage = $more.data(
\"
page
\"
) + 1,
\n
path =
\"
/articles/
\"
;
\n
if ($(
\"
#tag
\"
).length === 1) {
\n
var pathnames = location.pathname.split(
\"
/
\"
);
\n
path =
\"
/articles/tags/
\"
+ pathnames[pathnames.length - 1];
\n
} else if ($(
\"
#author
\"
).length === 1) {
\n
var pathnames = location.pathname.split(
\"
/
\"
);
\n
path =
\"
/articles/authors/
\"
+ pathnames[pathnames.length - 1];
\n
} else if ($(
\"
#category
\"
).length === 1) {
\n
var pathnames = location.pathname.split(
\"
/
\"
);
\n
path =
\"
/articles/category/
\"
+ pathnames[pathnames.length - 1];
\n
} else if (archive) {
\n
path =
\"
/articles/archives/
\"
+ archive;
\n
}
\n
$.ajax({
\n
url: Label.servePath + path + '?p=' + currentPage,
\n
type:
\"
GET
\"
,
\n
beforeSend: function() {
\n
$more.css(
\"
background
\"
,
\n
\"
url(
\"
+ Label.staticServePath
\n
+
\"
/skins/timeline/images/ajax-loader.gif) no-repeat scroll center center #60829F
\"
).text(
\"\"
);
\n
},
\n
success: function(result, textStatus) {
\n
if (!result.sc) {
\n
$more.css(
\"
background
\"
,
\"
none #60829F
\"
).text(
\"
Error
\"
);
\n
return;
\n
}
\n\n
if (result.rslts.articles.length === 0) {
\n
$more.remove();
\n
return;
\n
}
\n\n
var articlesHTML =
\"\"
,
\n
pagination = result.rslts.pagination;
\n\n
// append articles
\n
for (var i = 0; i < result.rslts.articles.length; i++) {
\n
var article = result.rslts.articles[i];
\n\n
articlesHTML += '<article><div class=
\"
module
\"
><div class=
\"
dot
\"
></div>'
\n
+ '<div class=
\"
arrow
\"
></div><time class=
\"
article-time
\"
><span>'
\n
+ timeline.toDate(article.articleCreateTime, 'yy-MM-dd HH:mm')
\n
+ '</span></time><h3 class=
\"
article-title
\"
><a rel=
\"
bookmark
\"
href=
\"
'
\n
+ Label.servePath + article.articlePermalink + '
\"
>'
\n
+ article.articleTitle + '</a>';
\n\n
if (article.articlePutTop) {
\n
articlesHTML += '<sup>' + Label.topArticleLabel + '</sup>';
\n
}
\n\n
if (article.hasUpdated) {
\n
articlesHTML += '<sup><a href=
\"
'
\n
+ Label.servePath + article.articlePermalink + '
\"
>' + Label.updatedLabel + '</a></sup>';
\n
}
\n\n
articlesHTML += '</h3><p>' + article.articleAbstract + '</p>'
\n
+ '<span class=
\"
ico-tags ico
\"
title=
\"
' + Label.tagLabel + '
\"
>';
\n\n
var articleTags = article.articleTags.split(
\"
,
\"
);
\n
for (var j = 0; j < articleTags.length; j++) {
\n
articlesHTML += '<a rel=
\"
category tag
\"
href=
\"
' + Label.servePath
\n
+ '/tags/' + encodeURIComponent(articleTags[j]) + '
\"
>' + articleTags[j] + '</a>';
\n\n
if (j < articleTags.length - 1) {
\n
articlesHTML +=
\"
,
\"
;
\n
}
\n
}
\n\n
articlesHTML += '</span> <span class=
\"
ico-author ico
\"
title=
\"
' + Label.authorLabel + '
\"
>'
\n
+ '<a rel=
\"
author
\"
href=
\"
' + Label.servePath + '/authors/' + article.authorId + '
\"
>'
\n
+ article.authorName + '</a></span> <span class=
\"
ico-comment ico
\"
title=
\"
'
\n
+ Label.commentLabel + '
\"
><a rel=
\"
nofollow
\"
href=
\"
' + Label.servePath + article.articlePermalink
\n
+ '#
b3logsolo
comments
\"
data-uvstatcmt=
\"
' + article.oId + '
\"
>' + article.articleCommentCount
\n
+ '</a></span> <span class=
\"
ico-view ico
\"
title=
\"
' + Label.viewLabel + '
\"
>'
\n
+ '<a rel=
\"
nofollow
\"
href=
\"
${servePath}${article.articlePermalink}
\"
>'
\n
+ '<span data-uvstaturl=
\"
' + Label.servePath + article.articlePermalink + '
\"
>' + article.articleViewCount + '</span>'
\n
+ '</a></span></div></article>';
\n
}
\n\n
$more.before(articlesHTML).data(
\"
page
\"
, currentPage);
\n
// 最后一页处理
\n
if (pagination.paginationPageCount <= currentPage) {
\n
$more.remove();
\n
} else {
\n
$more.css(
\"
background
\"
,
\"
none #60829F
\"
).text(Label.moreLabel);
\n
}
\n\n
$(window).resize();
\n
$(
\"
.module img
\"
).imagesLoaded(function() {
\n
$(window).resize();
\n
});
\n\n
Util.uvstat.renderStat()
\n
Util.uvstat.renderCmtStat()
\n
}
\n
});
\n
},
\n
toggleArchives: function(it, year) {
\n
$(
\"
.nav-abs li
\"
).each(function(i) {
\n
var $it = $(this);
\n
if (!$it.hasClass(
\"
year
\"
)) {
\n
$it.hide();
\n
if (year === $it.data(
\"
year
\"
) && $(it).hasClass(
\"
close
\"
)) {
\n
$it.show();
\n
}
\n
}
\n
});
\n\n
$(
\"
.nav-abs li.year
\"
).each(function() {
\n
if (parseInt($(this).text()) === year) {
\n
if ($(it).hasClass(
\"
close
\"
)) {
\n
it.className =
\"
year open
\"
;
\n
} else {
\n
it.className =
\"
year close
\"
;
\n
}
\n
} else {
\n
this.className =
\"
year close
\"
;
\n
}
\n
});
\n
}
\n
};
\n\n
/*!
\n
* jQuery imagesLoaded plugin v2.1.1
\n
* http://github.com/desandro/imagesloaded
\n
*
\n
* MIT License. by Paul Irish et al.
\n
*/
\n\n
/*jshint curly: true, eqeqeq: true, noempty: true, strict: true, undef: true, browser: true */
\n
/*global jQuery: false */
\n\n
;
\n
(function($, undefined) {
\n
'use strict';
\n\n
// blank image data-uri bypasses webkit log warning (thx doug jones)
\n
var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
\n\n
$.fn.imagesLoaded = function(callback) {
\n
var $this = this,
\n
deferred = $.isFunction($.Deferred) ? $.Deferred() : 0,
\n
hasNotify = $.isFunction(deferred.notify),
\n
$images = $this.find('img').add($this.filter('img')),
\n
loaded = [],
\n
proper = [],
\n
broken = [];
\n\n
// Register deferred callbacks
\n
if ($.isPlainObject(callback)) {
\n
$.each(callback, function(key, value) {
\n
if (key === 'callback') {
\n
callback = value;
\n
} else if (deferred) {
\n
deferred[key](value);
\n
}
\n
});
\n
}
\n\n
function doneLoading() {
\n
var $proper = $(proper),
\n
$broken = $(broken);
\n\n
if (deferred) {
\n
if (broken.length) {
\n
deferred.reject($images, $proper, $broken);
\n
} else {
\n
deferred.resolve($images);
\n
}
\n
}
\n\n
if ($.isFunction(callback)) {
\n
callback.call($this, $images, $proper, $broken);
\n
}
\n
}
\n\n
function imgLoadedHandler(event) {
\n
imgLoaded(event.target, event.type === 'error');
\n
}
\n\n
function imgLoaded(img, isBroken) {
\n
// don't proceed if BLANK image, or image is already loaded
\n
if (img.src === BLANK || $.inArray(img, loaded) !== -1) {
\n
return;
\n
}
\n\n
// store element in loaded images array
\n
loaded.push(img);
\n\n
// keep track of broken and properly loaded images
\n
if (isBroken) {
\n
broken.push(img);
\n
} else {
\n
proper.push(img);
\n
}
\n\n
// cache image and its state for future calls
\n
$.data(img, 'imagesLoaded', {
\n
isBroken: isBroken,
\n
src: img.src
\n
});
\n\n
// trigger deferred progress method if present
\n
if (hasNotify) {
\n
deferred.notifyWith($(img), [isBroken, $images, $(proper), $(broken)]);
\n
}
\n\n
// call doneLoading and clean listeners if all images are loaded
\n
if ($images.length === loaded.length) {
\n
setTimeout(doneLoading);
\n
$images.unbind('.imagesLoaded', imgLoadedHandler);
\n
}
\n
}
\n\n
// if no images, trigger immediately
\n
if (!$images.length) {
\n
doneLoading();
\n
} else {
\n
$images.bind('load.imagesLoaded error.imagesLoaded', imgLoadedHandler)
\n
.each(function(i, el) {
\n
var src = el.src;
\n\n
// find out if this image has been already checked for status
\n
// if it was, and src has not changed, call imgLoaded on it
\n
var cached = $.data(el, 'imagesLoaded');
\n
if (cached && cached.src === src) {
\n
imgLoaded(el, cached.isBroken);
\n
return;
\n
}
\n\n
// if complete is true and browser supports natural sizes, try
\n
// to check for image status manually
\n
if (el.complete && el.naturalWidth !== undefined) {
\n
imgLoaded(el, el.naturalWidth === 0 || el.naturalHeight === 0);
\n
return;
\n
}
\n\n
// cached images don't fire load sometimes, so we reset src, but only when
\n
// dealing with IE, or image is complete (loaded) and failed manual check
\n
// webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
\n
if (el.readyState || el.complete) {
\n
el.src = BLANK;
\n
el.src = src;
\n
}
\n
});
\n
}
\n\n
return deferred ? deferred.promise($this) : $this;
\n
};
\n\n
})($);
\n\n
(function() {
\n
Util.setTopBar()
\n
Util.buildTags(
\"
tagsSide
\"
);
\n\n
timeline.init();
\n
})();
\n\n\n
//# sourceURL=webpack:///./src/main/resources/skins/timeline/js/common.js?
"
);
/***/
})
...
...
src/main/resources/skins/tree-house/article-list.ftl
View file @
ef31c684
...
...
@@ -42,7 +42,7 @@
</div>
<#if commentable>
<div class="article-comment">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#comments">
<a rel="nofollow" href="${servePath}${article.articlePermalink}#
b3logsolo
comments">
${commentLabel}(<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span>)
</a>
</div>
...
...
src/main/resources/skins/tree-house/article.ftl
View file @
ef31c684
...
...
@@ -87,7 +87,7 @@
</div>
<div
class=
"right"
>
<
#if
commentable
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#comments"
class=
"left"
>
<a
rel=
"nofollow"
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
class=
"left"
>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
${commentLabel}
</a>
</
#
if>
...
...
@@ -103,6 +103,7 @@
</div>
<div
class=
"line right"
></div>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
style=
"margin: 88px 100px 0 99px;background-color: #effdff;border-radius: 10px;padding: 10px;"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
...
...
src/main/resources/skins/yilia/article-list.ftl
View file @
ef31c684
...
...
@@ -59,7 +59,7 @@
</div>
<span> </span>
<#if commentable>
<a href="${servePath}${article.articlePermalink}#comments"
<a href="${servePath}${article.articlePermalink}#
b3logsolo
comments"
class="vditor-tooltipped__n vditor-tooltipped link fn__flex-center"
aria-label="${commentLabel}">
<span data-uvstatcmt="${article.oId}">${article.articleCommentCount}</span>
...
...
src/main/resources/skins/yilia/article.ftl
View file @
ef31c684
...
...
@@ -62,7 +62,7 @@
</div>
<span>
</span>
<
#if
commentable
>
<a
href=
"${servePath}${article.articlePermalink}#comments"
<a
href=
"${servePath}${article.articlePermalink}#
b3logsolo
comments"
class=
"vditor-tooltipped__n vditor-tooltipped link fn__flex-center"
aria-label=
"${commentLabel}"
>
<span
data-uvstatcmt=
"${article.oId}"
>
${article.articleCommentCount}
</span>
...
...
@@ -132,6 +132,7 @@
<br>
</article>
<
#if
commentable
>
<div
id=
"b3logsolocomments"
></div>
<div
id=
"vcomment"
style=
"padding: 30px 60px 30px 50px;"
data-name=
"${article.authorName}"
data-postId=
"${article.oId}"
></div>
<
#if
!
staticSite
>
...
...
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