Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
Tsinghua
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Model registry
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
2024 Competition
Tsinghua
Commits
87c5edec
Commit
87c5edec
authored
6 months ago
by
HouTeng Chan
Browse files
Options
Downloads
Patches
Plain Diff
Update file model.html
parent
acd424f9
No related branches found
No related tags found
No related merge requests found
Pipeline
#517857
passed
6 months ago
Stage: build
Stage: deploy
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
wiki/pages/model.html
+4
-9
4 additions, 9 deletions
wiki/pages/model.html
with
4 additions
and
9 deletions
wiki/pages/model.html
+
4
−
9
View file @
87c5edec
...
...
@@ -12,15 +12,10 @@
</script>
<title>
Tsinghua - IGEM 2024
</title>
<script
type=
"text/x-mathjax-config"
>
MathJax
.
Hub
.
Config
({
root
:
'
/static/MathJax
'
,
extensions
:
[
"
tex2jax.js
"
],
jax
:
[
"
input/TeX
"
,
"
output/HTML-CSS
"
],
tex2jax
:
{
inlineMath
:
[[
"
$
"
,
"
$
"
],[
"
\\
(
"
,
"
\\
)
"
]]}
});
</script>
<script
src=
"/static/MathJax/Mathjax.js"
></script>
<script>
if
(
document
.
getElementById
&&
document
.
childNodes
&&
document
.
createElement
){
if
(
!
(
window
.
MathJax
&&
MathJax
.
Hub
)){
if
(
window
.
MathJax
){
window
.
MathJax
=
{
AuthorConfig
:
window
.
MathJax
}}
else
{
window
.
MathJax
=
{}}
MathJax
.
isPacked
=
true
;
MathJax
.
version
=
"
2.7.7
"
;
MathJax
.
fileversion
=
"
2.7.7
"
;
MathJax
.
cdnVersion
=
"
2.7.7
"
;
MathJax
.
cdnFileVersions
=
{};(
function
(
d
){
var
b
=
window
[
d
];
if
(
!
b
){
b
=
window
[
d
]
=
{}}
var
e
=
[];
var
c
=
function
(
f
){
var
g
=
f
.
constructor
;
if
(
!
g
){
g
=
function
(){}}
for
(
var
h
in
f
){
if
(
h
!==
"
constructor
"
&&
f
.
hasOwnProperty
(
h
)){
g
[
h
]
=
f
[
h
]}}
return
g
};
var
a
=
function
(){
return
function
(){
return
arguments
.
callee
.
Init
.
call
(
this
,
arguments
)}};
b
.
Object
=
c
({
constructor
:
a
(),
Subclass
:
function
(
f
,
h
){
var
g
=
a
();
g
.
SUPER
=
this
;
g
.
Init
=
this
.
Init
;
g
.
Subclass
=
this
.
Subclass
;
g
.
Augment
=
this
.
Augment
;
g
.
protoFunction
=
this
.
protoFunction
;
g
.
can
=
this
.
can
;
g
.
has
=
this
.
has
;
g
.
isa
=
this
.
isa
;
g
.
prototype
=
new
this
(
e
);
g
.
prototype
.
constructor
=
g
;
g
.
Augment
(
f
,
h
);
return
g
},
Init
:
function
(
f
){
var
g
=
this
;
if
(
f
.
length
===
1
&&
f
[
0
]
===
e
){
return
g
}
if
(
!
(
g
instanceof
f
.
callee
)){
g
=
new
f
.
callee
(
e
)}
return
g
.
Init
.
apply
(
g
,
f
)
||
g
},
Augment
:
function
(
f
,
g
){
var
h
;
if
(
f
!=
null
){
for
(
h
in
f
){
if
(
f
.
hasOwnProperty
(
h
)){
this
.
protoFunction
(
h
,
f
[
h
])}}
if
(
f
.
toString
!==
this
.
prototype
.
toString
&&
f
.
toString
!==
{}.
toString
){
this
.
protoFunction
(
"
toString
"
,
f
.
toString
)}}
if
(
g
!=
null
){
for
(
h
in
g
){
if
(
g
.
hasOwnProperty
(
h
)){
this
[
h
]
=
g
[
h
]}}}
return
this
},
protoFunction
:
function
(
g
,
f
){
this
.
prototype
[
g
]
=
f
;
if
(
typeof
f
===
"
function
"
){
f
.
SUPER
=
this
.
SUPER
.
prototype
}},
prototype
:{
Init
:
function
(){},
SUPER
:
function
(
f
){
return
f
.
callee
.
SUPER
},
can
:
function
(
f
){
return
typeof
(
this
[
f
])
===
"
function
"
},
has
:
function
(
f
){
return
typeof
(
this
[
f
])
!==
"
undefined
"
},
isa
:
function
(
f
){
return
(
f
instanceof
Object
)
&&
(
this
instanceof
f
)}},
can
:
function
(
f
){
return
this
.
prototype
.
can
.
call
(
this
,
f
)},
has
:
function
(
f
){
return
this
.
prototype
.
has
.
call
(
this
,
f
)},
isa
:
function
(
g
){
var
f
=
this
;
while
(
f
){
if
(
f
===
g
){
return
true
}
else
{
f
=
f
.
SUPER
}}
return
false
},
SimpleSUPER
:
c
({
constructor
:
function
(
f
){
return
this
.
SimpleSUPER
.
define
(
f
)},
define
:
function
(
f
){
var
h
=
{};
if
(
f
!=
null
){
for
(
var
g
in
f
){
if
(
f
.
hasOwnProperty
(
g
)){
h
[
g
]
=
this
.
wrap
(
g
,
f
[
g
])}}
if
(
f
.
toString
!==
this
.
prototype
.
toString
&&
f
.
toString
!==
{}.
toString
){
h
.
toString
=
this
.
wrap
(
"
toString
"
,
f
.
toString
)}}
return
h
},
wrap
:
function
(
i
,
h
){
if
(
typeof
(
h
)
!==
"
function
"
||!
h
.
toString
().
match
(
/
\.\s
*SUPER
\s
*
\(
/
)){
return
h
}
var
g
=
function
(){
this
.
SUPER
=
g
.
SUPER
[
i
];
try
{
var
f
=
h
.
apply
(
this
,
arguments
)}
catch
(
j
){
delete
this
.
SUPER
;
throw
j
}
delete
this
.
SUPER
;
return
f
};
g
.
toString
=
function
(){
return
h
.
toString
.
apply
(
h
,
arguments
)};
return
g
}})});
b
.
Object
.
isArray
=
Array
.
isArray
||
function
(
f
){
return
Object
.
prototype
.
toString
.
call
(
f
)
===
"
[object Array]
"
};
b
.
Object
.
Array
=
Array
})(
"
MathJax
"
);(
function
(
BASENAME
){
var
BASE
=
window
[
BASENAME
];
if
(
!
BASE
){
BASE
=
window
[
BASENAME
]
=
{}}
var
isArray
=
BASE
.
Object
.
isArray
;
var
CALLBACK
=
function
(
data
){
var
cb
=
function
(){
return
arguments
.
callee
.
execute
.
apply
(
arguments
.
callee
,
arguments
)};
for
(
var
id
in
CALLBACK
.
prototype
){
if
(
CALLBACK
.
prototype
.
hasOwnProperty
(
id
)){
if
(
typeof
(
data
[
id
])
!==
"
undefined
"
){
cb
[
id
]
=
data
[
id
]}
else
{
cb
[
id
]
=
CALLBACK
.
prototype
[
id
]}}}
cb
.
toString
=
CALLBACK
.
prototype
.
toString
;
return
cb
};
CALLBACK
.
prototype
=
{
isCallback
:
true
,
hook
:
function
(){},
data
:[],
object
:
window
,
execute
:
function
(){
if
(
!
this
.
called
||
this
.
autoReset
){
this
.
called
=!
this
.
autoReset
;
return
this
.
hook
.
apply
(
this
.
object
,
this
.
data
.
concat
([].
slice
.
call
(
arguments
,
0
)))}},
reset
:
function
(){
delete
this
.
called
},
toString
:
function
(){
return
this
.
hook
.
toString
.
apply
(
this
.
hook
,
arguments
)}};
var
ISCALLBACK
=
function
(
f
){
return
(
typeof
(
f
)
===
"
function
"
&&
f
.
isCallback
)};
var
EVAL
=
function
(
code
){
return
eval
.
call
(
window
,
code
)};
var
TESTEVAL
=
function
(){
EVAL
(
"
var __TeSt_VaR__ = 1
"
);
if
(
window
.
__TeSt_VaR__
){
try
{
delete
window
.
__TeSt_VaR__
}
catch
(
error
){
window
.
__TeSt_VaR__
=
null
}}
else
{
if
(
window
.
execScript
){
EVAL
=
function
(
code
){
BASE
.
__code
=
code
;
code
=
"
try {
"
+
BASENAME
+
"
.__result = eval(
"
+
BASENAME
+
"
.__code)} catch(err) {
"
+
BASENAME
+
"
.__result = err}
"
;
window
.
execScript
(
code
);
var
result
=
BASE
.
__result
;
delete
BASE
.
__result
;
delete
BASE
.
__code
;
if
(
result
instanceof
Error
){
throw
result
}
return
result
}}
else
{
EVAL
=
function
(
code
){
BASE
.
__code
=
code
;
code
=
"
try {
"
+
BASENAME
+
"
.__result = eval(
"
+
BASENAME
+
"
.__code)} catch(err) {
"
+
BASENAME
+
"
.__result = err}
"
;
var
head
=
(
document
.
getElementsByTagName
(
"
head
"
))[
0
];
if
(
!
head
){
head
=
document
.
body
}
var
script
=
document
.
createElement
(
"
script
"
);
script
.
appendChild
(
document
.
createTextNode
(
code
));
head
.
appendChild
(
script
);
head
.
removeChild
(
script
);
var
result
=
BASE
.
__result
;
delete
BASE
.
__result
;
delete
BASE
.
__code
;
if
(
result
instanceof
Error
){
throw
result
}
return
result
}}}
TESTEVAL
=
null
};
var
USING
=
function
(
args
,
i
){
if
(
arguments
.
length
>
1
){
if
(
arguments
.
length
===
2
&&!
(
typeof
arguments
[
0
]
===
"
function
"
)
&&
arguments
[
0
]
instanceof
Object
&&
typeof
arguments
[
1
]
===
"
number
"
){
args
=
[].
slice
.
call
(
args
,
i
)}
else
{
args
=
[].
slice
.
call
(
arguments
,
0
)}}
if
(
isArray
(
args
)
&&
args
.
length
===
1
&&
typeof
(
args
[
0
])
===
"
function
"
){
args
=
args
[
0
]}
if
(
typeof
args
===
"
function
"
){
if
(
args
.
execute
===
CALLBACK
.
prototype
.
execute
){
return
args
}
return
CALLBACK
({
hook
:
args
})}
else
{
if
(
isArray
(
args
)){
if
(
typeof
(
args
[
0
])
===
"
string
"
&&
args
[
1
]
instanceof
Object
&&
typeof
args
[
1
][
args
[
0
]]
===
"
function
"
){
return
CALLBACK
({
hook
:
args
[
1
][
args
[
0
]],
object
:
args
[
1
],
data
:
args
.
slice
(
2
)})}
else
{
if
(
typeof
args
[
0
]
===
"
function
"
){
return
CALLBACK
({
hook
:
args
[
0
],
data
:
args
.
slice
(
1
)})}
else
{
if
(
typeof
args
[
1
]
===
"
function
"
){
return
CALLBACK
({
hook
:
args
[
1
],
object
:
args
[
0
],
data
:
args
.
slice
(
2
)})}}}}
else
{
if
(
typeof
(
args
)
===
"
string
"
){
if
(
TESTEVAL
){
TESTEVAL
()}
return
CALLBACK
({
hook
:
EVAL
,
data
:[
args
]})}
else
{
if
(
args
instanceof
Object
){
return
CALLBACK
(
args
)}
else
{
if
(
typeof
(
args
)
===
"
undefined
"
){
return
CALLBACK
({})}}}}}
throw
Error
(
"
Can't make callback from given data
"
)};
var
DELAY
=
function
(
time
,
callback
){
callback
=
USING
(
callback
);
callback
.
timeout
=
setTimeout
(
callback
,
time
);
return
callback
};
var
WAITFOR
=
function
(
callback
,
signal
){
callback
=
USING
(
callback
);
if
(
!
callback
.
called
){
WAITSIGNAL
(
callback
,
signal
);
signal
.
pending
++
}};
var
WAITEXECUTE
=
function
(){
var
signals
=
this
.
signal
;
delete
this
.
signal
;
this
.
execute
=
this
.
oldExecute
;
delete
this
.
oldExecute
;
var
result
=
this
.
execute
.
apply
(
this
,
arguments
);
if
(
ISCALLBACK
(
result
)
&&!
result
.
called
){
WAITSIGNAL
(
result
,
signals
)}
else
{
for
(
var
i
=
0
,
m
=
signals
.
length
;
i
<
m
;
i
++
){
signals
[
i
].
pending
--
;
if
(
signals
[
i
].
pending
<=
0
){
signals
[
i
].
call
()}}}};
var
WAITSIGNAL
=
function
(
callback
,
signals
){
if
(
!
isArray
(
signals
)){
signals
=
[
signals
]}
if
(
!
callback
.
signal
){
callback
.
oldExecute
=
callback
.
execute
;
callback
.
execute
=
WAITEXECUTE
;
callback
.
signal
=
signals
}
else
{
if
(
signals
.
length
===
1
){
callback
.
signal
.
push
(
signals
[
0
])}
else
{
callback
.
signal
=
callback
.
signal
.
concat
(
signals
)}}};
var
AFTER
=
function
(
callback
){
callback
=
USING
(
callback
);
callback
.
pending
=
0
;
for
(
var
i
=
1
,
m
=
arguments
.
length
;
i
<
m
;
i
++
){
if
(
arguments
[
i
]){
WAITFOR
(
arguments
[
i
],
callback
)}}
if
(
callback
.
pending
===
0
){
var
result
=
callback
();
if
(
ISCALLBACK
(
result
)){
callback
=
result
}}
return
callback
};
var
HOOKS
=
MathJax
.
Object
.
Subclass
({
Init
:
function
(
reset
){
this
.
hooks
=
[];
this
.
remove
=
[];
this
.
reset
=
reset
;
this
.
running
=
false
},
Add
:
function
(
hook
,
priority
){
if
(
priority
==
null
){
priority
=
10
}
if
(
!
ISCALLBACK
(
hook
)){
hook
=
USING
(
hook
)}
hook
.
priority
=
priority
;
var
i
=
this
.
hooks
.
length
;
while
(
i
>
0
&&
priority
<
this
.
hooks
[
i
-
1
].
priority
){
i
--
}
this
.
hooks
.
splice
(
i
,
0
,
hook
);
return
hook
},
Remove
:
function
(
hook
){
for
(
var
i
=
0
,
m
=
this
.
hooks
.
length
;
i
<
m
;
i
++
){
if
(
this
.
hooks
[
i
]
===
hook
){
if
(
this
.
running
){
this
.
remove
.
push
(
i
)}
else
{
this
.
hooks
.
splice
(
i
,
1
)}
return
}}},
Execute
:
function
(){
var
callbacks
=
[{}];
this
.
running
=
true
;
for
(
var
i
=
0
,
m
=
this
.
hooks
.
length
;
i
<
m
;
i
++
){
if
(
this
.
reset
){
this
.
hooks
[
i
].
reset
()}
var
result
=
this
.
hooks
[
i
].
apply
(
window
,
arguments
);
if
(
ISCALLBACK
(
result
)
&&!
result
.
called
){
callbacks
.
push
(
result
)}}
this
.
running
=
false
;
if
(
this
.
remove
.
length
){
this
.
RemovePending
()}
if
(
callbacks
.
length
===
1
){
return
null
}
if
(
callbacks
.
length
===
2
){
return
callbacks
[
1
]}
return
AFTER
.
apply
({},
callbacks
)},
RemovePending
:
function
(){
this
.
remove
=
this
.
remove
.
sort
();
for
(
var
i
=
this
.
remove
.
length
-
1
;
i
>=
0
;
i
--
){
this
.
hooks
.
splice
(
i
,
1
)}
this
.
remove
=
[]}});
var
EXECUTEHOOKS
=
function
(
hooks
,
data
,
reset
){
if
(
!
hooks
){
return
null
}
if
(
!
isArray
(
hooks
)){
hooks
=
[
hooks
]}
if
(
!
isArray
(
data
)){
data
=
(
data
==
null
?[]:[
data
])}
var
handler
=
HOOKS
(
reset
);
for
(
var
i
=
0
,
m
=
hooks
.
length
;
i
<
m
;
i
++
){
handler
.
Add
(
hooks
[
i
])}
return
handler
.
Execute
.
apply
(
handler
,
data
)};
var
QUEUE
=
BASE
.
Object
.
Subclass
({
Init
:
function
(){
this
.
pending
=
this
.
running
=
0
;
this
.
queue
=
[];
this
.
Push
.
apply
(
this
,
arguments
)},
Push
:
function
(){
var
callback
;
for
(
var
i
=
0
,
m
=
arguments
.
length
;
i
<
m
;
i
++
){
callback
=
USING
(
arguments
[
i
]);
if
(
callback
===
arguments
[
i
]
&&!
callback
.
called
){
callback
=
USING
([
"
wait
"
,
this
,
callback
])}
this
.
queue
.
push
(
callback
)}
if
(
!
this
.
running
&&!
this
.
pending
){
this
.
Process
()}
return
callback
},
Process
:
function
(
queue
){
while
(
!
this
.
running
&&!
this
.
pending
&&
this
.
queue
.
length
){
var
callback
=
this
.
queue
[
0
];
queue
=
this
.
queue
.
slice
(
1
);
this
.
queue
=
[];
this
.
Suspend
();
var
result
=
callback
();
this
.
Resume
();
if
(
queue
.
length
){
this
.
queue
=
queue
.
concat
(
this
.
queue
)}
if
(
ISCALLBACK
(
result
)
&&!
result
.
called
){
WAITFOR
(
result
,
this
)}}},
Suspend
:
function
(){
this
.
running
++
},
Resume
:
function
(){
if
(
this
.
running
){
this
.
running
--
}},
call
:
function
(){
this
.
Process
.
apply
(
this
,
arguments
)},
wait
:
function
(
callback
){
return
callback
}});
var
SIGNAL
=
QUEUE
.
Subclass
({
Init
:
function
(
name
){
QUEUE
.
prototype
.
Init
.
call
(
this
);
this
.
name
=
name
;
this
.
posted
=
[];
this
.
listeners
=
HOOKS
(
true
);
this
.
posting
=
false
;
this
.
callback
=
null
},
Post
:
function
(
message
,
callback
,
forget
){
callback
=
USING
(
callback
);
if
(
this
.
posting
||
this
.
pending
){
this
.
Push
([
"
Post
"
,
this
,
message
,
callback
,
forget
])}
else
{
this
.
callback
=
callback
;
callback
.
reset
();
if
(
!
forget
){
this
.
posted
.
push
(
message
)}
this
.
Suspend
();
this
.
posting
=
true
;
var
result
=
this
.
listeners
.
Execute
(
message
);
if
(
ISCALLBACK
(
result
)
&&!
result
.
called
){
WAITFOR
(
result
,
this
)}
this
.
Resume
();
this
.
posting
=
false
;
if
(
!
this
.
pending
){
this
.
call
()}}
return
callback
},
Clear
:
function
(
callback
){
callback
=
USING
(
callback
);
if
(
this
.
posting
||
this
.
pending
){
callback
=
this
.
Push
([
"
Clear
"
,
this
,
callback
])}
else
{
this
.
posted
=
[];
callback
()}
return
callback
},
call
:
function
(){
this
.
callback
(
this
);
this
.
Process
()},
Interest
:
function
(
callback
,
ignorePast
,
priority
){
callback
=
USING
(
callback
);
this
.
listeners
.
Add
(
callback
,
priority
);
if
(
!
ignorePast
){
for
(
var
i
=
0
,
m
=
this
.
posted
.
length
;
i
<
m
;
i
++
){
callback
.
reset
();
var
result
=
callback
(
this
.
posted
[
i
]);
if
(
ISCALLBACK
(
result
)
&&
i
===
this
.
posted
.
length
-
1
){
WAITFOR
(
result
,
this
)}}}
return
callback
},
NoInterest
:
function
(
callback
){
this
.
listeners
.
Remove
(
callback
)},
MessageHook
:
function
(
msg
,
callback
,
priority
){
callback
=
USING
(
callback
);
if
(
!
this
.
hooks
){
this
.
hooks
=
{};
this
.
Interest
([
"
ExecuteHooks
"
,
this
])}
if
(
!
this
.
hooks
[
msg
]){
this
.
hooks
[
msg
]
=
HOOKS
(
true
)}
this
.
hooks
[
msg
].
Add
(
callback
,
priority
);
for
(
var
i
=
0
,
m
=
this
.
posted
.
length
;
i
<
m
;
i
++
){
if
(
this
.
posted
[
i
]
==
msg
){
callback
.
reset
();
callback
(
this
.
posted
[
i
])}}
callback
.
msg
=
msg
;
return
callback
},
ExecuteHooks
:
function
(
msg
){
var
type
=
(
isArray
(
msg
)?
msg
[
0
]:
msg
);
if
(
!
this
.
hooks
[
type
]){
return
null
}
return
this
.
hooks
[
type
].
Execute
(
msg
)},
RemoveHook
:
function
(
hook
){
this
.
hooks
[
hook
.
msg
].
Remove
(
hook
)}},{
signals
:{},
find
:
function
(
name
){
if
(
!
SIGNAL
.
signals
[
name
]){
SIGNAL
.
signals
[
name
]
=
new
SIGNAL
(
name
)}
return
SIGNAL
.
signals
[
name
]}});
BASE
.
Callback
=
BASE
.
CallBack
=
USING
;
BASE
.
Callback
.
Delay
=
DELAY
;
BASE
.
Callback
.
After
=
AFTER
;
BASE
.
Callback
.
Queue
=
QUEUE
;
BASE
.
Callback
.
Signal
=
SIGNAL
.
find
;
BASE
.
Callback
.
Hooks
=
HOOKS
;
BASE
.
Callback
.
ExecuteHooks
=
EXECUTEHOOKS
})(
"
MathJax
"
);(
function
(
e
){
var
a
=
window
[
e
];
if
(
!
a
){
a
=
window
[
e
]
=
{}}
var
d
=
(
navigator
.
vendor
===
"
Apple Computer, Inc.
"
&&
typeof
navigator
.
vendorSub
===
"
undefined
"
);
var
g
=
0
;
var
h
=
function
(
i
){
if
(
document
.
styleSheets
&&
document
.
styleSheets
.
length
>
g
){
g
=
document
.
styleSheets
.
length
}
if
(
!
i
){
i
=
document
.
head
||
((
document
.
getElementsByTagName
(
"
head
"
))[
0
]);
if
(
!
i
){
i
=
document
.
body
}}
return
i
};
var
f
=
[];
var
c
=
function
(){
for
(
var
k
=
0
,
j
=
f
.
length
;
k
<
j
;
k
++
){
a
.
Ajax
.
head
.
removeChild
(
f
[
k
])}
f
=
[]};
var
b
=
{};
b
[
e
]
=
""
;
b
.
a11y
=
"
[MathJax]/extensions/a11y
"
;
b
.
Contrib
=
"
https://cdn.mathjax.org/mathjax/contrib
"
;
a
.
Ajax
=
{
loaded
:{},
loading
:{},
loadHooks
:{},
timeout
:
15
*
1000
,
styleDelay
:
1
,
config
:{
root
:
""
,
path
:
b
},
params
:{},
STATUS
:{
OK
:
1
,
ERROR
:
-
1
},
fileURL
:
function
(
j
){
var
i
;
while
((
i
=
j
.
match
(
/^
\[([
-._a-z0-9
]
+
)\]
/i
))
&&
b
.
hasOwnProperty
(
i
[
1
])){
j
=
(
b
[
i
[
1
]]
||
this
.
config
.
root
)
+
j
.
substr
(
i
[
1
].
length
+
2
)}
return
j
},
fileName
:
function
(
j
){
var
i
=
this
.
config
.
root
;
if
(
j
.
substr
(
0
,
i
.
length
)
===
i
){
j
=
"
[
"
+
e
+
"
]
"
+
j
.
substr
(
i
.
length
)}
do
{
var
k
=
false
;
for
(
var
l
in
b
){
if
(
b
.
hasOwnProperty
(
l
)
&&
b
[
l
]){
if
(
j
.
substr
(
0
,
b
[
l
].
length
)
===
b
[
l
]){
j
=
"
[
"
+
l
+
"
]
"
+
j
.
substr
(
b
[
l
].
length
);
k
=
true
;
break
}}}}
while
(
k
);
return
j
},
fileRev
:
function
(
j
){
var
i
=
a
.
cdnFileVersions
[
j
]
||
a
.
cdnVersion
||
""
;
if
(
i
){
i
=
"
?V=
"
+
i
}
return
i
},
urlRev
:
function
(
i
){
return
this
.
fileURL
(
i
)
+
this
.
fileRev
(
i
)},
Require
:
function
(
k
,
n
){
n
=
a
.
Callback
(
n
);
var
l
;
if
(
k
instanceof
Object
){
for
(
var
j
in
k
){
if
(
k
.
hasOwnProperty
(
j
)){
l
=
j
.
toUpperCase
();
k
=
k
[
j
]}}}
else
{
l
=
k
.
split
(
/
\.
/
).
pop
().
toUpperCase
()}
if
(
this
.
params
.
noContrib
&&
k
.
substr
(
0
,
9
)
===
"
[Contrib]
"
){
n
(
this
.
STATUS
.
ERROR
)}
else
{
k
=
this
.
fileURL
(
k
);
if
(
this
.
loaded
[
k
]){
n
(
this
.
loaded
[
k
])}
else
{
var
m
=
{};
m
[
l
]
=
k
;
this
.
Load
(
m
,
n
)}}
return
n
},
Load
:
function
(
k
,
m
){
m
=
a
.
Callback
(
m
);
var
l
;
if
(
k
instanceof
Object
){
for
(
var
j
in
k
){
if
(
k
.
hasOwnProperty
(
j
)){
l
=
j
.
toUpperCase
();
k
=
k
[
j
]}}}
else
{
l
=
k
.
split
(
/
\.
/
).
pop
().
toUpperCase
()}
k
=
this
.
fileURL
(
k
);
if
(
this
.
loading
[
k
]){
this
.
addHook
(
k
,
m
)}
else
{
this
.
head
=
h
(
this
.
head
);
if
(
this
.
loader
[
l
]){
this
.
loader
[
l
].
call
(
this
,
k
,
m
)}
else
{
throw
Error
(
"
Can't load files of type
"
+
l
)}}
return
m
},
LoadHook
:
function
(
l
,
m
,
k
){
m
=
a
.
Callback
(
m
);
if
(
l
instanceof
Object
){
for
(
var
j
in
l
){
if
(
l
.
hasOwnProperty
(
j
)){
l
=
l
[
j
]}}}
l
=
this
.
fileURL
(
l
);
if
(
this
.
loaded
[
l
]){
m
(
this
.
loaded
[
l
])}
else
{
this
.
addHook
(
l
,
m
,
k
)}
return
m
},
addHook
:
function
(
j
,
k
,
i
){
if
(
!
this
.
loadHooks
[
j
]){
this
.
loadHooks
[
j
]
=
MathJax
.
Callback
.
Hooks
()}
this
.
loadHooks
[
j
].
Add
(
k
,
i
);
k
.
file
=
j
},
removeHook
:
function
(
i
){
if
(
this
.
loadHooks
[
i
.
file
]){
this
.
loadHooks
[
i
.
file
].
Remove
(
i
);
if
(
!
this
.
loadHooks
[
i
.
file
].
hooks
.
length
){
delete
this
.
loadHooks
[
i
.
file
]}}},
Preloading
:
function
(){
for
(
var
l
=
0
,
j
=
arguments
.
length
;
l
<
j
;
l
++
){
var
k
=
this
.
fileURL
(
arguments
[
l
]);
if
(
!
this
.
loading
[
k
]){
this
.
loading
[
k
]
=
{
preloaded
:
true
}}}},
loader
:{
JS
:
function
(
k
,
m
){
var
j
=
this
.
fileName
(
k
);
var
i
=
document
.
createElement
(
"
script
"
);
var
l
=
a
.
Callback
([
"
loadTimeout
"
,
this
,
k
]);
this
.
loading
[
k
]
=
{
callback
:
m
,
timeout
:
setTimeout
(
l
,
this
.
timeout
),
status
:
this
.
STATUS
.
OK
,
script
:
i
};
this
.
loading
[
k
].
message
=
a
.
Message
.
File
(
j
);
i
.
onerror
=
l
;
i
.
type
=
"
text/javascript
"
;
i
.
src
=
k
+
this
.
fileRev
(
j
);
this
.
head
.
appendChild
(
i
)},
CSS
:
function
(
j
,
l
){
var
i
=
this
.
fileName
(
j
);
var
k
=
document
.
createElement
(
"
link
"
);
k
.
rel
=
"
stylesheet
"
;
k
.
type
=
"
text/css
"
;
k
.
href
=
j
+
this
.
fileRev
(
i
);
this
.
loading
[
j
]
=
{
callback
:
l
,
message
:
a
.
Message
.
File
(
i
),
status
:
this
.
STATUS
.
OK
};
this
.
head
.
appendChild
(
k
);
this
.
timer
.
create
.
call
(
this
,[
this
.
timer
.
file
,
j
],
k
)}},
timer
:{
create
:
function
(
j
,
i
){
j
=
a
.
Callback
(
j
);
if
(
i
.
nodeName
===
"
STYLE
"
&&
i
.
styleSheet
&&
typeof
(
i
.
styleSheet
.
cssText
)
!==
"
undefined
"
){
j
(
this
.
STATUS
.
OK
)}
else
{
if
(
window
.
chrome
&&
i
.
nodeName
===
"
LINK
"
){
j
(
this
.
STATUS
.
OK
)}
else
{
if
(
d
){
this
.
timer
.
start
(
this
,[
this
.
timer
.
checkSafari2
,
g
++
,
j
],
this
.
styleDelay
)}
else
{
this
.
timer
.
start
(
this
,[
this
.
timer
.
checkLength
,
i
,
j
],
this
.
styleDelay
)}}}
return
j
},
start
:
function
(
j
,
i
,
k
,
l
){
i
=
a
.
Callback
(
i
);
i
.
execute
=
this
.
execute
;
i
.
time
=
this
.
time
;
i
.
STATUS
=
j
.
STATUS
;
i
.
timeout
=
l
||
j
.
timeout
;
i
.
delay
=
i
.
total
=
k
||
0
;
if
(
k
){
setTimeout
(
i
,
k
)}
else
{
i
()}},
time
:
function
(
i
){
this
.
total
+=
this
.
delay
;
this
.
delay
=
Math
.
floor
(
this
.
delay
*
1.05
+
5
);
if
(
this
.
total
>=
this
.
timeout
){
i
(
this
.
STATUS
.
ERROR
);
return
1
}
return
0
},
file
:
function
(
j
,
i
){
if
(
i
<
0
){
a
.
Ajax
.
loadTimeout
(
j
)}
else
{
a
.
Ajax
.
loadComplete
(
j
)}},
execute
:
function
(){
this
.
hook
.
call
(
this
.
object
,
this
,
this
.
data
[
0
],
this
.
data
[
1
])},
checkSafari2
:
function
(
i
,
j
,
k
){
if
(
i
.
time
(
k
)){
return
}
if
(
document
.
styleSheets
.
length
>
j
&&
document
.
styleSheets
[
j
].
cssRules
&&
document
.
styleSheets
[
j
].
cssRules
.
length
){
k
(
i
.
STATUS
.
OK
)}
else
{
setTimeout
(
i
,
i
.
delay
)}},
checkLength
:
function
(
i
,
l
,
n
){
if
(
i
.
time
(
n
)){
return
}
var
m
=
0
;
var
j
=
(
l
.
sheet
||
l
.
styleSheet
);
try
{
if
((
j
.
cssRules
||
j
.
rules
||
[]).
length
>
0
){
m
=
1
}}
catch
(
k
){
if
(
k
.
message
.
match
(
/protected variable|restricted URI/
)){
m
=
1
}
else
{
if
(
k
.
message
.
match
(
/Security error/
)){
m
=
1
}}}
if
(
m
){
setTimeout
(
a
.
Callback
([
n
,
i
.
STATUS
.
OK
]),
0
)}
else
{
setTimeout
(
i
,
i
.
delay
)}}},
loadComplete
:
function
(
i
){
i
=
this
.
fileURL
(
i
);
var
j
=
this
.
loading
[
i
];
if
(
j
&&!
j
.
preloaded
){
a
.
Message
.
Clear
(
j
.
message
);
clearTimeout
(
j
.
timeout
);
if
(
j
.
script
){
if
(
f
.
length
===
0
){
setTimeout
(
c
,
0
)}
f
.
push
(
j
.
script
)}
this
.
loaded
[
i
]
=
j
.
status
;
delete
this
.
loading
[
i
];
this
.
addHook
(
i
,
j
.
callback
)}
else
{
if
(
j
){
delete
this
.
loading
[
i
]}
this
.
loaded
[
i
]
=
this
.
STATUS
.
OK
;
j
=
{
status
:
this
.
STATUS
.
OK
}}
if
(
!
this
.
loadHooks
[
i
]){
return
null
}
return
this
.
loadHooks
[
i
].
Execute
(
j
.
status
)},
loadTimeout
:
function
(
i
){
if
(
this
.
loading
[
i
].
timeout
){
clearTimeout
(
this
.
loading
[
i
].
timeout
)}
this
.
loading
[
i
].
status
=
this
.
STATUS
.
ERROR
;
this
.
loadError
(
i
);
this
.
loadComplete
(
i
)},
loadError
:
function
(
i
){
a
.
Message
.
Set
([
"
LoadFailed
"
,
"
File failed to load: %1
"
,
i
],
null
,
2000
);
a
.
Hub
.
signal
.
Post
([
"
file load error
"
,
i
])},
Styles
:
function
(
k
,
l
){
var
i
=
this
.
StyleString
(
k
);
if
(
i
===
""
){
l
=
a
.
Callback
(
l
);
l
()}
else
{
var
j
=
document
.
createElement
(
"
style
"
);
j
.
type
=
"
text/css
"
;
this
.
head
=
h
(
this
.
head
);
this
.
head
.
appendChild
(
j
);
if
(
j
.
styleSheet
&&
typeof
(
j
.
styleSheet
.
cssText
)
!==
"
undefined
"
){
j
.
styleSheet
.
cssText
=
i
}
else
{
j
.
appendChild
(
document
.
createTextNode
(
i
))}
l
=
this
.
timer
.
create
.
call
(
this
,
l
,
j
)}
return
l
},
StyleString
:
function
(
n
){
if
(
typeof
(
n
)
===
"
string
"
){
return
n
}
var
k
=
""
,
o
,
m
;
for
(
o
in
n
){
if
(
n
.
hasOwnProperty
(
o
)){
if
(
typeof
n
[
o
]
===
"
string
"
){
k
+=
o
+
"
{
"
+
n
[
o
]
+
"
}
\n
"
}
else
{
if
(
a
.
Object
.
isArray
(
n
[
o
])){
for
(
var
l
=
0
;
l
<
n
[
o
].
length
;
l
++
){
m
=
{};
m
[
o
]
=
n
[
o
][
l
];
k
+=
this
.
StyleString
(
m
)}}
else
{
if
(
o
.
substr
(
0
,
6
)
===
"
@media
"
){
k
+=
o
+
"
{
"
+
this
.
StyleString
(
n
[
o
])
+
"
}
\n
"
}
else
{
if
(
n
[
o
]
!=
null
){
m
=
[];
for
(
var
j
in
n
[
o
]){
if
(
n
[
o
].
hasOwnProperty
(
j
)){
if
(
n
[
o
][
j
]
!=
null
){
m
[
m
.
length
]
=
j
+
"
:
"
+
n
[
o
][
j
]}}}
k
+=
o
+
"
{
"
+
m
.
join
(
"
;
"
)
+
"
}
\n
"
}}}}}}
return
k
}}})(
"
MathJax
"
);
MathJax
.
HTML
=
{
Element
:
function
(
d
,
f
,
e
){
var
g
=
document
.
createElement
(
d
),
h
;
if
(
f
){
if
(
f
.
hasOwnProperty
(
"
style
"
)){
var
c
=
f
.
style
;
f
.
style
=
{};
for
(
h
in
c
){
if
(
c
.
hasOwnProperty
(
h
)){
f
.
style
[
h
.
replace
(
/-
([
a-z
])
/g
,
this
.
ucMatch
)]
=
c
[
h
]}}}
MathJax
.
Hub
.
Insert
(
g
,
f
);
for
(
h
in
f
){
if
(
h
===
"
role
"
||
h
.
substr
(
0
,
5
)
===
"
aria-
"
){
g
.
setAttribute
(
h
,
f
[
h
])}}}
if
(
e
){
if
(
!
MathJax
.
Object
.
isArray
(
e
)){
e
=
[
e
]}
for
(
var
b
=
0
,
a
=
e
.
length
;
b
<
a
;
b
++
){
if
(
MathJax
.
Object
.
isArray
(
e
[
b
])){
g
.
appendChild
(
this
.
Element
(
e
[
b
][
0
],
e
[
b
][
1
],
e
[
b
][
2
]))}
else
{
if
(
d
===
"
script
"
){
this
.
setScript
(
g
,
e
[
b
])}
else
{
g
.
appendChild
(
document
.
createTextNode
(
e
[
b
]))}}}}
return
g
},
ucMatch
:
function
(
a
,
b
){
return
b
.
toUpperCase
()},
addElement
:
function
(
b
,
a
,
d
,
c
){
return
b
.
appendChild
(
this
.
Element
(
a
,
d
,
c
))},
TextNode
:
function
(
a
){
return
document
.
createTextNode
(
a
)},
addText
:
function
(
a
,
b
){
return
a
.
appendChild
(
this
.
TextNode
(
b
))},
setScript
:
function
(
a
,
b
){
if
(
this
.
setScriptBug
){
a
.
text
=
b
}
else
{
while
(
a
.
firstChild
){
a
.
removeChild
(
a
.
firstChild
)}
this
.
addText
(
a
,
b
)}},
getScript
:
function
(
a
){
var
b
=
(
a
.
text
===
""
?
a
.
innerHTML
:
a
.
text
);
return
b
.
replace
(
/^
\s
+/
,
""
).
replace
(
/
\s
+$/
,
""
)},
Cookie
:{
prefix
:
"
mjx
"
,
expires
:
365
,
Set
:
function
(
a
,
e
){
var
d
=
[];
if
(
e
){
for
(
var
g
in
e
){
if
(
e
.
hasOwnProperty
(
g
)){
d
.
push
(
g
+
"
:
"
+
e
[
g
].
toString
().
replace
(
/&/g
,
"
&&
"
))}}}
var
b
=
this
.
prefix
+
"
.
"
+
a
+
"
=
"
+
escape
(
d
.
join
(
"
&;
"
));
if
(
this
.
expires
){
var
f
=
new
Date
();
f
.
setDate
(
f
.
getDate
()
+
this
.
expires
);
b
+=
"
; expires=
"
+
f
.
toGMTString
()}
try
{
document
.
cookie
=
b
+
"
; path=/
"
}
catch
(
c
){}},
Get
:
function
(
a
,
d
){
if
(
!
d
){
d
=
{}}
var
g
=
new
RegExp
(
"
(?:^|;
\\
s*)
"
+
this
.
prefix
+
"
\\
.
"
+
a
+
"
=([^;]*)(?:;|$)
"
);
var
f
;
try
{
f
=
g
.
exec
(
document
.
cookie
)}
catch
(
c
){}
if
(
f
&&
f
[
1
]
!==
""
){
var
j
=
unescape
(
f
[
1
]).
split
(
"
&;
"
);
for
(
var
e
=
0
,
b
=
j
.
length
;
e
<
b
;
e
++
){
f
=
j
[
e
].
match
(
/
([^
:
]
+
)
:
(
.*
)
/
);
var
h
=
f
[
2
].
replace
(
/&&/g
,
"
&
"
);
if
(
h
===
"
true
"
){
h
=
true
}
else
{
if
(
h
===
"
false
"
){
h
=
false
}
else
{
if
(
h
.
match
(
/^-
?(\d
+
(\.\d
+
)?
|
\.\d
+
)
$/
)){
h
=
parseFloat
(
h
)}}}
d
[
f
[
1
]]
=
h
}}
return
d
}}};
MathJax
.
Localization
=
{
locale
:
"
en
"
,
directory
:
"
[MathJax]/localization
"
,
strings
:{
ar
:{
menuTitle
:
"
\
u0627
\
u0644
\
u0639
\
u0631
\
u0628
\
u064A
\
u0629
"
},
ast
:{
menuTitle
:
"
asturianu
"
},
bg
:{
menuTitle
:
"
\
u0431
\
u044A
\
u043B
\
u0433
\
u0430
\
u0440
\
u0441
\
u043A
\
u0438
"
},
bcc
:{
menuTitle
:
"
\
u0628
\
u0644
\
u0648
\
u0686
\
u06CC
"
},
br
:{
menuTitle
:
"
brezhoneg
"
},
ca
:{
menuTitle
:
"
catal
\
u00E0
"
},
cdo
:{
menuTitle
:
"
M
\
u00ECng-d
\
u0115
\
u0324ng-ng
\
u1E73
\
u0304
"
},
cs
:{
menuTitle
:
"
\
u010De
\
u0161tina
"
},
da
:{
menuTitle
:
"
dansk
"
},
de
:{
menuTitle
:
"
Deutsch
"
},
diq
:{
menuTitle
:
"
Zazaki
"
},
en
:{
menuTitle
:
"
English
"
,
isLoaded
:
true
},
eo
:{
menuTitle
:
"
Esperanto
"
},
es
:{
menuTitle
:
"
espa
\
u00F1ol
"
},
fa
:{
menuTitle
:
"
\
u0641
\
u0627
\
u0631
\
u0633
\
u06CC
"
},
fi
:{
menuTitle
:
"
suomi
"
},
fr
:{
menuTitle
:
"
fran
\
u00E7ais
"
},
gl
:{
menuTitle
:
"
galego
"
},
he
:{
menuTitle
:
"
\
u05E2
\
u05D1
\
u05E8
\
u05D9
\
u05EA
"
},
ia
:{
menuTitle
:
"
interlingua
"
},
it
:{
menuTitle
:
"
italiano
"
},
ja
:{
menuTitle
:
"
\
u65E5
\
u672C
\
u8A9E
"
},
kn
:{
menuTitle
:
"
\
u0C95
\
u0CA8
\
u0CCD
\
u0CA8
\
u0CA1
"
},
ko
:{
menuTitle
:
"
\
uD55C
\
uAD6D
\
uC5B4
"
},
lb
:{
menuTitle
:
"
L
\
u00EBtzebuergesch
"
},
lki
:{
menuTitle
:
"
\
u0644
\
u06D5
\
u06A9
\
u06CC
"
},
lt
:{
menuTitle
:
"
lietuvi
\
u0173
"
},
mk
:{
menuTitle
:
"
\
u043C
\
u0430
\
u043A
\
u0435
\
u0434
\
u043E
\
u043D
\
u0441
\
u043A
\
u0438
"
},
nl
:{
menuTitle
:
"
Nederlands
"
},
oc
:{
menuTitle
:
"
occitan
"
},
pl
:{
menuTitle
:
"
polski
"
},
pt
:{
menuTitle
:
"
portugu
\
u00EAs
"
},
"
pt-br
"
:{
menuTitle
:
"
portugu
\
u00EAs do Brasil
"
},
ru
:{
menuTitle
:
"
\
u0440
\
u0443
\
u0441
\
u0441
\
u043A
\
u0438
\
u0439
"
},
sco
:{
menuTitle
:
"
Scots
"
},
scn
:{
menuTitle
:
"
sicilianu
"
},
sk
:{
menuTitle
:
"
sloven
\
u010Dina
"
},
sl
:{
menuTitle
:
"
sloven
\
u0161
\
u010Dina
"
},
sv
:{
menuTitle
:
"
svenska
"
},
th
:{
menuTitle
:
"
\
u0E44
\
u0E17
\
u0E22
"
},
tr
:{
menuTitle
:
"
T
\
u00FCrk
\
u00E7e
"
},
uk
:{
menuTitle
:
"
\
u0443
\
u043A
\
u0440
\
u0430
\
u0457
\
u043D
\
u0441
\
u044C
\
u043A
\
u0430
"
},
vi
:{
menuTitle
:
"
Ti
\
u1EBFng Vi
\
u1EC7t
"
},
"
zh-hans
"
:{
menuTitle
:
"
\
u4E2D
\
u6587
\
uFF08
\
u7B80
\
u4F53
\
uFF09
"
},
"
zh-hant
"
:{
menuTitle
:
"
\
u6C49
\
u8BED
"
}},
pattern
:
/%
(\d
+|
\{\d
+
\}
|
\{[
a-z
]
+:
\%\d
+
(?:\|(?:
%
\{\d
+
\}
|%.|
[^\}])
*
)
+
\}
|.
)
/g
,
SPLIT
:(
"
axb
"
.
split
(
/
(
x
)
/
).
length
===
3
?
function
(
a
,
b
){
return
a
.
split
(
b
)}:
function
(
c
,
e
){
var
a
=
[],
b
,
d
=
0
;
e
.
lastIndex
=
0
;
while
((
b
=
e
.
exec
(
c
))){
a
.
push
(
c
.
substr
(
d
,
b
.
index
-
d
));
a
.
push
.
apply
(
a
,
b
.
slice
(
1
));
d
=
b
.
index
+
b
[
0
].
length
}
a
.
push
(
c
.
substr
(
d
));
return
a
}),
_
:
function
(
b
,
a
){
if
(
MathJax
.
Object
.
isArray
(
a
)){
return
this
.
processSnippet
(
b
,
a
)}
return
this
.
processString
(
this
.
lookupPhrase
(
b
,
a
),[].
slice
.
call
(
arguments
,
2
))},
processString
:
function
(
l
,
p
,
g
){
var
j
,
e
,
o
=
MathJax
.
Object
.
isArray
;
for
(
j
=
0
,
e
=
p
.
length
;
j
<
e
;
j
++
){
if
(
g
&&
o
(
p
[
j
])){
p
[
j
]
=
this
.
processSnippet
(
g
,
p
[
j
])}}
var
f
=
this
.
SPLIT
(
l
,
this
.
pattern
);
for
(
j
=
1
,
e
=
f
.
length
;
j
<
e
;
j
+=
2
){
var
q
=
f
[
j
].
charAt
(
0
);
if
(
q
>=
"
0
"
&&
q
<=
"
9
"
){
f
[
j
]
=
p
[
f
[
j
]
-
1
];
if
(
typeof
f
[
j
]
===
"
number
"
){
f
[
j
]
=
this
.
number
(
f
[
j
])}}
else
{
if
(
q
===
"
{
"
){
q
=
f
[
j
].
substr
(
1
);
if
(
q
>=
"
0
"
&&
q
<=
"
9
"
){
f
[
j
]
=
p
[
f
[
j
].
substr
(
1
,
f
[
j
].
length
-
2
)
-
1
];
if
(
typeof
f
[
j
]
===
"
number
"
){
f
[
j
]
=
this
.
number
(
f
[
j
])}}
else
{
var
k
=
f
[
j
].
match
(
/^
\{([
a-z
]
+
)
:%
(\d
+
)\|(
.*
)\}
$/
);
if
(
k
){
if
(
k
[
1
]
===
"
plural
"
){
var
d
=
p
[
k
[
2
]
-
1
];
if
(
typeof
d
===
"
undefined
"
){
f
[
j
]
=
"
???
"
}
else
{
d
=
this
.
plural
(
d
)
-
1
;
var
h
=
k
[
3
].
replace
(
/
(
^|
[^
%
])(
%%
)
*%
\|
/g
,
"
$1$2%
\
uEFEF
"
).
split
(
/
\|
/
);
if
(
d
>=
0
&&
d
<
h
.
length
){
f
[
j
]
=
this
.
processString
(
h
[
d
].
replace
(
/
\u
EFEF/g
,
"
|
"
),
p
,
g
)}
else
{
f
[
j
]
=
"
???
"
}}}
else
{
f
[
j
]
=
"
%
"
+
f
[
j
]}}}}}
if
(
f
[
j
]
==
null
){
f
[
j
]
=
"
???
"
}}
if
(
!
g
){
return
f
.
join
(
""
)}
var
a
=
[],
b
=
""
;
for
(
j
=
0
;
j
<
e
;
j
++
){
b
+=
f
[
j
];
j
++
;
if
(
j
<
e
){
if
(
o
(
f
[
j
])){
a
.
push
(
b
);
a
=
a
.
concat
(
f
[
j
]);
b
=
""
}
else
{
b
+=
f
[
j
]}}}
if
(
b
!==
""
){
a
.
push
(
b
)}
return
a
},
processSnippet
:
function
(
g
,
e
){
var
c
=
[];
for
(
var
d
=
0
,
b
=
e
.
length
;
d
<
b
;
d
++
){
if
(
MathJax
.
Object
.
isArray
(
e
[
d
])){
var
f
=
e
[
d
];
if
(
typeof
f
[
1
]
===
"
string
"
){
var
h
=
f
[
0
];
if
(
!
MathJax
.
Object
.
isArray
(
h
)){
h
=
[
g
,
h
]}
var
a
=
this
.
lookupPhrase
(
h
,
f
[
1
]);
c
=
c
.
concat
(
this
.
processMarkdown
(
a
,
f
.
slice
(
2
),
g
))}
else
{
if
(
MathJax
.
Object
.
isArray
(
f
[
1
])){
c
=
c
.
concat
(
this
.
processSnippet
.
apply
(
this
,
f
))}
else
{
if
(
f
.
length
>=
3
){
c
.
push
([
f
[
0
],
f
[
1
],
this
.
processSnippet
(
g
,
f
[
2
])])}
else
{
c
.
push
(
e
[
d
])}}}}
else
{
c
.
push
(
e
[
d
])}}
return
c
},
markdownPattern
:
/
(
%.
)
|
(\*{1,3})((?:
%.|.
)
+
?)\2
|
(
`+
)((?:
%.|.
)
+
?)\4
|
\[((?:
%.|.
)
+
?)\]\(([^\s\)]
+
)\)
/
,
processMarkdown
:
function
(
b
,
h
,
d
){
var
j
=
[],
e
;
var
c
=
b
.
split
(
this
.
markdownPattern
);
var
g
=
c
[
0
];
for
(
var
f
=
1
,
a
=
c
.
length
;
f
<
a
;
f
+=
8
){
if
(
c
[
f
+
1
]){
e
=
this
.
processString
(
c
[
f
+
2
],
h
,
d
);
if
(
!
MathJax
.
Object
.
isArray
(
e
)){
e
=
[
e
]}
e
=
[[
"
b
"
,
"
i
"
,
"
i
"
][
c
[
f
+
1
].
length
-
1
],{},
e
];
if
(
c
[
f
+
1
].
length
===
3
){
e
=
[
"
b
"
,{},
e
]}}
else
{
if
(
c
[
f
+
3
]){
e
=
this
.
processString
(
c
[
f
+
4
].
replace
(
/^
\s
/
,
""
).
replace
(
/
\s
$/
,
""
),
h
,
d
);
if
(
!
MathJax
.
Object
.
isArray
(
e
)){
e
=
[
e
]}
e
=
[
"
code
"
,{},
e
]}
else
{
if
(
c
[
f
+
5
]){
e
=
this
.
processString
(
c
[
f
+
5
],
h
,
d
);
if
(
!
MathJax
.
Object
.
isArray
(
e
)){
e
=
[
e
]}
e
=
[
"
a
"
,{
href
:
this
.
processString
(
c
[
f
+
6
],
h
),
target
:
"
_blank
"
},
e
]}
else
{
g
+=
c
[
f
];
e
=
null
}}}
if
(
e
){
j
=
this
.
concatString
(
j
,
g
,
h
,
d
);
j
.
push
(
e
);
g
=
""
}
if
(
c
[
f
+
7
]
!==
""
){
g
+=
c
[
f
+
7
]}}
j
=
this
.
concatString
(
j
,
g
,
h
,
d
);
return
j
},
concatString
:
function
(
a
,
c
,
b
,
d
){
if
(
c
!=
""
){
c
=
this
.
processString
(
c
,
b
,
d
);
if
(
!
MathJax
.
Object
.
isArray
(
c
)){
c
=
[
c
]}
a
=
a
.
concat
(
c
)}
return
a
},
lookupPhrase
:
function
(
f
,
a
,
d
){
if
(
!
d
){
d
=
"
_
"
}
if
(
MathJax
.
Object
.
isArray
(
f
)){
d
=
(
f
[
0
]
||
"
_
"
);
f
=
(
f
[
1
]
||
""
)}
var
c
=
this
.
loadDomain
(
d
);
if
(
c
){
MathJax
.
Hub
.
RestartAfter
(
c
)}
var
b
=
this
.
strings
[
this
.
locale
];
if
(
b
){
if
(
b
.
domains
&&
d
in
b
.
domains
){
var
e
=
b
.
domains
[
d
];
if
(
e
.
strings
&&
f
in
e
.
strings
){
a
=
e
.
strings
[
f
]}}}
return
a
},
loadFile
:
function
(
b
,
d
,
e
){
e
=
MathJax
.
Callback
(
e
);
b
=
(
d
.
file
||
b
);
if
(
!
b
.
match
(
/
\.
js$/
)){
b
+=
"
.js
"
}
if
(
!
b
.
match
(
/^
([
a-z
]
+:|
\[
MathJax
\])
/
)){
var
a
=
(
this
.
strings
[
this
.
locale
].
directory
||
this
.
directory
+
"
/
"
+
this
.
locale
||
"
[MathJax]/localization/
"
+
this
.
locale
);
b
=
a
+
"
/
"
+
b
}
var
c
=
MathJax
.
Ajax
.
Require
(
b
,
function
(){
d
.
isLoaded
=
true
;
return
e
()});
return
(
c
.
called
?
null
:
c
)},
loadDomain
:
function
(
c
,
e
){
var
b
,
a
=
this
.
strings
[
this
.
locale
];
if
(
a
){
if
(
!
a
.
isLoaded
){
b
=
this
.
loadFile
(
this
.
locale
,
a
);
if
(
b
){
return
MathJax
.
Callback
.
Queue
(
b
,[
"
loadDomain
"
,
this
,
c
]).
Push
(
e
||
{})}}
if
(
a
.
domains
&&
c
in
a
.
domains
){
var
d
=
a
.
domains
[
c
];
if
(
!
d
.
isLoaded
){
b
=
this
.
loadFile
(
c
,
d
);
if
(
b
){
return
MathJax
.
Callback
.
Queue
(
b
).
Push
(
e
)}}}}
return
MathJax
.
Callback
(
e
)()},
Try
:
function
(
a
){
a
=
MathJax
.
Callback
(
a
);
a
.
autoReset
=
true
;
try
{
a
()}
catch
(
b
){
if
(
!
b
.
restart
){
throw
b
}
MathJax
.
Callback
.
After
([
"
Try
"
,
this
,
a
],
b
.
restart
)}},
resetLocale
:
function
(
a
){
if
(
!
a
){
return
}
a
=
a
.
toLowerCase
();
while
(
!
this
.
strings
[
a
]){
var
c
=
a
.
lastIndexOf
(
"
-
"
);
if
(
c
===-
1
){
return
}
a
=
a
.
substring
(
0
,
c
)}
var
b
=
this
.
strings
[
a
].
remap
;
this
.
locale
=
b
?
b
:
a
;
MathJax
.
Callback
.
Signal
(
"
Hub
"
).
Post
([
"
Locale Reset
"
,
this
.
locale
])},
setLocale
:
function
(
a
){
this
.
resetLocale
(
a
);
if
(
MathJax
.
Menu
){
this
.
loadDomain
(
"
MathMenu
"
)}},
addTranslation
:
function
(
b
,
e
,
c
){
var
d
=
this
.
strings
[
b
],
a
=
false
;
if
(
!
d
){
d
=
this
.
strings
[
b
]
=
{};
a
=
true
}
if
(
!
d
.
domains
){
d
.
domains
=
{}}
if
(
e
){
if
(
!
d
.
domains
[
e
]){
d
.
domains
[
e
]
=
{}}
d
=
d
.
domains
[
e
]}
MathJax
.
Hub
.
Insert
(
d
,
c
);
if
(
a
&&
MathJax
.
Menu
.
menu
){
MathJax
.
Menu
.
CreateLocaleMenu
()}},
setCSS
:
function
(
b
){
var
a
=
this
.
strings
[
this
.
locale
];
if
(
a
){
if
(
a
.
fontFamily
){
b
.
style
.
fontFamily
=
a
.
fontFamily
}
if
(
a
.
fontDirection
){
b
.
style
.
direction
=
a
.
fontDirection
;
if
(
a
.
fontDirection
===
"
rtl
"
){
b
.
style
.
textAlign
=
"
right
"
}}}
return
b
},
fontFamily
:
function
(){
var
a
=
this
.
strings
[
this
.
locale
];
return
(
a
?
a
.
fontFamily
:
null
)},
fontDirection
:
function
(){
var
a
=
this
.
strings
[
this
.
locale
];
return
(
a
?
a
.
fontDirection
:
null
)},
plural
:
function
(
b
){
var
a
=
this
.
strings
[
this
.
locale
];
if
(
a
&&
a
.
plural
){
return
a
.
plural
(
b
)}
if
(
b
==
1
){
return
1
}
return
2
},
number
:
function
(
b
){
var
a
=
this
.
strings
[
this
.
locale
];
if
(
a
&&
a
.
number
){
return
a
.
number
(
b
)}
return
b
}};
MathJax
.
Message
=
{
ready
:
false
,
log
:[{}],
current
:
null
,
textNodeBug
:(
navigator
.
vendor
===
"
Apple Computer, Inc.
"
&&
typeof
navigator
.
vendorSub
===
"
undefined
"
)
||
(
window
.
hasOwnProperty
&&
window
.
hasOwnProperty
(
"
konqueror
"
)),
styles
:{
"
#MathJax_Message
"
:{
position
:
"
fixed
"
,
left
:
"
1px
"
,
bottom
:
"
2px
"
,
"
background-color
"
:
"
#E6E6E6
"
,
border
:
"
1px solid #959595
"
,
margin
:
"
0px
"
,
padding
:
"
2px 8px
"
,
"
z-index
"
:
"
102
"
,
color
:
"
black
"
,
"
font-size
"
:
"
80%
"
,
width
:
"
auto
"
,
"
white-space
"
:
"
nowrap
"
},
"
#MathJax_MSIE_Frame
"
:{
position
:
"
absolute
"
,
top
:
0
,
left
:
0
,
width
:
"
0px
"
,
"
z-index
"
:
101
,
border
:
"
0px
"
,
margin
:
"
0px
"
,
padding
:
"
0px
"
}},
browsers
:{
MSIE
:
function
(
a
){
MathJax
.
Message
.
msieFixedPositionBug
=
((
document
.
documentMode
||
0
)
<
7
);
if
(
MathJax
.
Message
.
msieFixedPositionBug
){
MathJax
.
Hub
.
config
.
styles
[
"
#MathJax_Message
"
].
position
=
"
absolute
"
}
MathJax
.
Message
.
quirks
=
(
document
.
compatMode
===
"
BackCompat
"
)},
Chrome
:
function
(
a
){
MathJax
.
Hub
.
config
.
styles
[
"
#MathJax_Message
"
].
bottom
=
"
1.5em
"
;
MathJax
.
Hub
.
config
.
styles
[
"
#MathJax_Message
"
].
left
=
"
1em
"
}},
Init
:
function
(
a
){
if
(
a
){
this
.
ready
=
true
}
if
(
!
document
.
body
||!
this
.
ready
){
return
false
}
if
(
this
.
div
&&
this
.
div
.
parentNode
==
null
){
this
.
div
=
document
.
getElementById
(
"
MathJax_Message
"
);
this
.
text
=
(
this
.
div
?
this
.
div
.
firstChild
:
null
)}
if
(
!
this
.
div
){
var
b
=
document
.
body
;
if
(
this
.
msieFixedPositionBug
&&
window
.
attachEvent
){
b
=
this
.
frame
=
this
.
addDiv
(
document
.
body
);
b
.
removeAttribute
(
"
id
"
);
b
.
style
.
position
=
"
absolute
"
;
b
.
style
.
border
=
b
.
style
.
margin
=
b
.
style
.
padding
=
"
0px
"
;
b
.
style
.
zIndex
=
"
101
"
;
b
.
style
.
height
=
"
0px
"
;
b
=
this
.
addDiv
(
b
);
b
.
id
=
"
MathJax_MSIE_Frame
"
;
window
.
attachEvent
(
"
onscroll
"
,
this
.
MoveFrame
);
window
.
attachEvent
(
"
onresize
"
,
this
.
MoveFrame
);
this
.
MoveFrame
()}
this
.
div
=
this
.
addDiv
(
b
);
this
.
div
.
style
.
display
=
"
none
"
}
if
(
!
this
.
text
){
this
.
text
=
this
.
div
.
appendChild
(
document
.
createTextNode
(
""
))}
return
true
},
addDiv
:
function
(
a
){
var
b
=
document
.
createElement
(
"
div
"
);
b
.
id
=
"
MathJax_Message
"
;
if
(
a
.
firstChild
){
a
.
insertBefore
(
b
,
a
.
firstChild
)}
else
{
a
.
appendChild
(
b
)}
return
b
},
MoveFrame
:
function
(){
var
a
=
(
MathJax
.
Message
.
quirks
?
document
.
body
:
document
.
documentElement
);
var
b
=
MathJax
.
Message
.
frame
;
b
.
style
.
left
=
a
.
scrollLeft
+
"
px
"
;
b
.
style
.
top
=
a
.
scrollTop
+
"
px
"
;
b
.
style
.
width
=
a
.
clientWidth
+
"
px
"
;
b
=
b
.
firstChild
;
b
.
style
.
height
=
a
.
clientHeight
+
"
px
"
},
localize
:
function
(
a
){
return
MathJax
.
Localization
.
_
(
a
,
a
)},
filterText
:
function
(
a
,
c
,
b
){
if
(
MathJax
.
Hub
.
config
.
messageStyle
===
"
simple
"
){
if
(
b
===
"
LoadFile
"
){
if
(
!
this
.
loading
){
this
.
loading
=
this
.
localize
(
"
Loading
"
)
+
"
"
}
a
=
this
.
loading
;
this
.
loading
+=
"
.
"
}
else
{
if
(
b
===
"
ProcessMath
"
){
if
(
!
this
.
processing
){
this
.
processing
=
this
.
localize
(
"
Processing
"
)
+
"
"
}
a
=
this
.
processing
;
this
.
processing
+=
"
.
"
}
else
{
if
(
b
===
"
TypesetMath
"
){
if
(
!
this
.
typesetting
){
this
.
typesetting
=
this
.
localize
(
"
Typesetting
"
)
+
"
"
}
a
=
this
.
typesetting
;
this
.
typesetting
+=
"
.
"
}}}}
return
a
},
clearCounts
:
function
(){
delete
this
.
loading
;
delete
this
.
processing
;
delete
this
.
typesetting
},
Set
:
function
(
c
,
e
,
b
){
if
(
e
==
null
){
e
=
this
.
log
.
length
;
this
.
log
[
e
]
=
{}}
var
d
=
""
;
if
(
MathJax
.
Object
.
isArray
(
c
)){
d
=
c
[
0
];
if
(
MathJax
.
Object
.
isArray
(
d
)){
d
=
d
[
1
]}
try
{
c
=
MathJax
.
Localization
.
_
.
apply
(
MathJax
.
Localization
,
c
)}
catch
(
a
){
if
(
!
a
.
restart
){
throw
a
}
if
(
!
a
.
restart
.
called
){
if
(
this
.
log
[
e
].
restarted
==
null
){
this
.
log
[
e
].
restarted
=
0
}
this
.
log
[
e
].
restarted
++
;
delete
this
.
log
[
e
].
cleared
;
MathJax
.
Callback
.
After
([
"
Set
"
,
this
,
c
,
e
,
b
],
a
.
restart
);
return
e
}}}
if
(
this
.
timer
){
clearTimeout
(
this
.
timer
);
delete
this
.
timer
}
this
.
log
[
e
].
text
=
c
;
this
.
log
[
e
].
filteredText
=
c
=
this
.
filterText
(
c
,
e
,
d
);
if
(
typeof
(
this
.
log
[
e
].
next
)
===
"
undefined
"
){
this
.
log
[
e
].
next
=
this
.
current
;
if
(
this
.
current
!=
null
){
this
.
log
[
this
.
current
].
prev
=
e
}
this
.
current
=
e
}
if
(
this
.
current
===
e
&&
MathJax
.
Hub
.
config
.
messageStyle
!==
"
none
"
){
if
(
this
.
Init
()){
if
(
this
.
textNodeBug
){
this
.
div
.
innerHTML
=
c
}
else
{
this
.
text
.
nodeValue
=
c
}
this
.
div
.
style
.
display
=
""
;
if
(
this
.
status
){
window
.
status
=
""
;
delete
this
.
status
}}
else
{
window
.
status
=
c
;
this
.
status
=
true
}}
if
(
this
.
log
[
e
].
restarted
){
if
(
this
.
log
[
e
].
cleared
){
b
=
0
}
if
(
--
this
.
log
[
e
].
restarted
===
0
){
delete
this
.
log
[
e
].
cleared
}}
if
(
b
){
setTimeout
(
MathJax
.
Callback
([
"
Clear
"
,
this
,
e
]),
b
)}
else
{
if
(
b
==
0
){
this
.
Clear
(
e
,
0
)}}
return
e
},
Clear
:
function
(
b
,
a
){
if
(
this
.
log
[
b
].
prev
!=
null
){
this
.
log
[
this
.
log
[
b
].
prev
].
next
=
this
.
log
[
b
].
next
}
if
(
this
.
log
[
b
].
next
!=
null
){
this
.
log
[
this
.
log
[
b
].
next
].
prev
=
this
.
log
[
b
].
prev
}
if
(
this
.
current
===
b
){
this
.
current
=
this
.
log
[
b
].
next
;
if
(
this
.
text
){
if
(
this
.
div
.
parentNode
==
null
){
this
.
Init
()}
if
(
this
.
current
==
null
){
if
(
this
.
timer
){
clearTimeout
(
this
.
timer
);
delete
this
.
timer
}
if
(
a
==
null
){
a
=
600
}
if
(
a
===
0
){
this
.
Remove
()}
else
{
this
.
timer
=
setTimeout
(
MathJax
.
Callback
([
"
Remove
"
,
this
]),
a
)}}
else
{
if
(
MathJax
.
Hub
.
config
.
messageStyle
!==
"
none
"
){
if
(
this
.
textNodeBug
){
this
.
div
.
innerHTML
=
this
.
log
[
this
.
current
].
filteredText
}
else
{
this
.
text
.
nodeValue
=
this
.
log
[
this
.
current
].
filteredText
}}}
if
(
this
.
status
){
window
.
status
=
""
;
delete
this
.
status
}}
else
{
if
(
this
.
status
){
window
.
status
=
(
this
.
current
==
null
?
""
:
this
.
log
[
this
.
current
].
text
)}}}
delete
this
.
log
[
b
].
next
;
delete
this
.
log
[
b
].
prev
;
delete
this
.
log
[
b
].
filteredText
;
if
(
this
.
log
[
b
].
restarted
){
this
.
log
[
b
].
cleared
=
true
}},
Remove
:
function
(){
this
.
text
.
nodeValue
=
""
;
this
.
div
.
style
.
display
=
"
none
"
},
File
:
function
(
a
){
return
this
.
Set
([
"
LoadFile
"
,
"
Loading %1
"
,
a
],
null
,
null
)},
Log
:
function
(){
var
b
=
[];
for
(
var
c
=
1
,
a
=
this
.
log
.
length
;
c
<
a
;
c
++
){
b
[
c
]
=
this
.
log
[
c
].
text
}
return
b
.
join
(
"
\n
"
)}};
MathJax
.
Hub
=
{
config
:{
root
:
""
,
config
:[],
styleSheets
:[],
styles
:{
"
.MathJax_Preview
"
:{
color
:
"
#888
"
}},
jax
:[],
extensions
:[],
preJax
:
null
,
postJax
:
null
,
displayAlign
:
"
center
"
,
displayIndent
:
"
0
"
,
preRemoveClass
:
"
MathJax_Preview
"
,
showProcessingMessages
:
true
,
messageStyle
:
"
normal
"
,
delayStartupUntil
:
"
none
"
,
skipStartupTypeset
:
false
,
elements
:[],
positionToHash
:
true
,
showMathMenu
:
true
,
showMathMenuMSIE
:
true
,
menuSettings
:{
zoom
:
"
None
"
,
CTRL
:
false
,
ALT
:
false
,
CMD
:
false
,
Shift
:
false
,
discoverable
:
false
,
zscale
:
"
200%
"
,
renderer
:
null
,
font
:
"
Auto
"
,
context
:
"
MathJax
"
,
locale
:
null
,
mpContext
:
false
,
mpMouse
:
false
,
texHints
:
true
,
FastPreview
:
null
,
assistiveMML
:
null
,
inTabOrder
:
true
,
semantics
:
false
},
errorSettings
:{
message
:[
"
[
"
,[
"
MathProcessingError
"
,
"
Math Processing Error
"
],
"
]
"
],
style
:{
color
:
"
#CC0000
"
,
"
font-style
"
:
"
italic
"
}},
ignoreMMLattributes
:{}},
preProcessors
:
MathJax
.
Callback
.
Hooks
(
true
),
inputJax
:{},
outputJax
:{
order
:{}},
processSectionDelay
:
50
,
processUpdateTime
:
250
,
processUpdateDelay
:
10
,
signal
:
MathJax
.
Callback
.
Signal
(
"
Hub
"
),
Config
:
function
(
a
){
this
.
Insert
(
this
.
config
,
a
);
if
(
this
.
config
.
Augment
){
this
.
Augment
(
this
.
config
.
Augment
)}},
CombineConfig
:
function
(
c
,
f
){
var
b
=
this
.
config
,
g
,
e
;
c
=
c
.
split
(
/
\.
/
);
for
(
var
d
=
0
,
a
=
c
.
length
;
d
<
a
;
d
++
){
g
=
c
[
d
];
if
(
!
b
[
g
]){
b
[
g
]
=
{}}
e
=
b
;
b
=
b
[
g
]}
e
[
g
]
=
b
=
this
.
Insert
(
f
,
b
);
return
b
},
Register
:{
PreProcessor
:
function
(){
return
MathJax
.
Hub
.
preProcessors
.
Add
.
apply
(
MathJax
.
Hub
.
preProcessors
,
arguments
)},
MessageHook
:
function
(){
return
MathJax
.
Hub
.
signal
.
MessageHook
.
apply
(
MathJax
.
Hub
.
signal
,
arguments
)},
StartupHook
:
function
(){
return
MathJax
.
Hub
.
Startup
.
signal
.
MessageHook
.
apply
(
MathJax
.
Hub
.
Startup
.
signal
,
arguments
)},
LoadHook
:
function
(){
return
MathJax
.
Ajax
.
LoadHook
.
apply
(
MathJax
.
Ajax
,
arguments
)}},
UnRegister
:{
PreProcessor
:
function
(
a
){
MathJax
.
Hub
.
preProcessors
.
Remove
(
a
)},
MessageHook
:
function
(
a
){
MathJax
.
Hub
.
signal
.
RemoveHook
(
a
)},
StartupHook
:
function
(
a
){
MathJax
.
Hub
.
Startup
.
signal
.
RemoveHook
(
a
)},
LoadHook
:
function
(
a
){
MathJax
.
Ajax
.
removeHook
(
a
)}},
getAllJax
:
function
(
e
){
var
c
=
[],
b
=
this
.
elementScripts
(
e
);
for
(
var
d
=
0
,
a
=
b
.
length
;
d
<
a
;
d
++
){
if
(
b
[
d
].
MathJax
&&
b
[
d
].
MathJax
.
elementJax
){
c
.
push
(
b
[
d
].
MathJax
.
elementJax
)}}
return
c
},
getJaxByType
:
function
(
f
,
e
){
var
c
=
[],
b
=
this
.
elementScripts
(
e
);
for
(
var
d
=
0
,
a
=
b
.
length
;
d
<
a
;
d
++
){
if
(
b
[
d
].
MathJax
&&
b
[
d
].
MathJax
.
elementJax
&&
b
[
d
].
MathJax
.
elementJax
.
mimeType
===
f
){
c
.
push
(
b
[
d
].
MathJax
.
elementJax
)}}
return
c
},
getJaxByInputType
:
function
(
f
,
e
){
var
c
=
[],
b
=
this
.
elementScripts
(
e
);
for
(
var
d
=
0
,
a
=
b
.
length
;
d
<
a
;
d
++
){
if
(
b
[
d
].
MathJax
&&
b
[
d
].
MathJax
.
elementJax
&&
b
[
d
].
type
&&
b
[
d
].
type
.
replace
(
/ *;
(
.|
\s)
*/
,
""
)
===
f
){
c
.
push
(
b
[
d
].
MathJax
.
elementJax
)}}
return
c
},
getJaxFor
:
function
(
a
){
if
(
typeof
(
a
)
===
"
string
"
){
a
=
document
.
getElementById
(
a
)}
if
(
a
&&
a
.
MathJax
){
return
a
.
MathJax
.
elementJax
}
if
(
this
.
isMathJaxNode
(
a
)){
if
(
!
a
.
isMathJax
){
a
=
a
.
firstChild
}
while
(
a
&&!
a
.
jaxID
){
a
=
a
.
parentNode
}
if
(
a
){
return
MathJax
.
OutputJax
[
a
.
jaxID
].
getJaxFromMath
(
a
)}}
return
null
},
isJax
:
function
(
a
){
if
(
typeof
(
a
)
===
"
string
"
){
a
=
document
.
getElementById
(
a
)}
if
(
this
.
isMathJaxNode
(
a
)){
return
1
}
if
(
a
&&
(
a
.
tagName
||
""
).
toLowerCase
()
===
"
script
"
){
if
(
a
.
MathJax
){
return
(
a
.
MathJax
.
state
===
MathJax
.
ElementJax
.
STATE
.
PROCESSED
?
1
:
-
1
)}
if
(
a
.
type
&&
this
.
inputJax
[
a
.
type
.
replace
(
/ *;
(
.|
\s)
*/
,
""
)]){
return
-
1
}}
return
0
},
isMathJaxNode
:
function
(
a
){
return
!!
a
&&
(
a
.
isMathJax
||
(
a
.
className
||
""
)
===
"
MathJax_MathML
"
)},
setRenderer
:
function
(
d
,
c
){
if
(
!
d
){
return
}
var
e
=
MathJax
.
OutputJax
[
d
];
if
(
!
e
){
MathJax
.
OutputJax
[
d
]
=
MathJax
.
OutputJax
({
id
:
"
unknown
"
,
version
:
"
1.0.0
"
,
isUnknown
:
true
});
this
.
config
.
menuSettings
.
renderer
=
""
;
var
b
=
"
[MathJax]/jax/output/
"
+
d
+
"
/config.js
"
;
return
MathJax
.
Ajax
.
Require
(
b
,[
"
setRenderer
"
,
this
,
d
,
c
])}
else
{
this
.
config
.
menuSettings
.
renderer
=
d
;
if
(
c
==
null
){
c
=
"
jax/mml
"
}
if
(
e
.
isUnknown
){
e
.
Register
(
c
)}
var
a
=
this
.
outputJax
;
if
(
a
[
c
]
&&
a
[
c
].
length
){
if
(
d
!==
a
[
c
][
0
].
id
){
a
[
c
].
unshift
(
e
);
return
this
.
signal
.
Post
([
"
Renderer Selected
"
,
d
])}}
return
null
}},
Queue
:
function
(){
return
this
.
queue
.
Push
.
apply
(
this
.
queue
,
arguments
)},
Typeset
:
function
(
c
,
d
){
if
(
!
MathJax
.
isReady
){
return
null
}
var
b
=
this
.
elementCallback
(
c
,
d
);
if
(
b
.
count
){
var
a
=
MathJax
.
Callback
.
Queue
([
"
PreProcess
"
,
this
,
b
.
elements
],[
"
Process
"
,
this
,
b
.
elements
])}
return
a
.
Push
(
b
.
callback
)},
PreProcess
:
function
(
e
,
g
){
var
c
=
this
.
elementCallback
(
e
,
g
);
var
b
=
MathJax
.
Callback
.
Queue
();
if
(
c
.
count
){
var
f
=
(
c
.
count
===
1
?[
c
.
elements
]:
c
.
elements
);
b
.
Push
([
"
Post
"
,
this
.
signal
,[
"
Begin PreProcess
"
,
c
.
elements
]]);
for
(
var
d
=
0
,
a
=
f
.
length
;
d
<
a
;
d
++
){
if
(
f
[
d
]){
b
.
Push
([
"
Execute
"
,
this
.
preProcessors
,
f
[
d
]])}}
b
.
Push
([
"
Post
"
,
this
.
signal
,[
"
End PreProcess
"
,
c
.
elements
]])}
return
b
.
Push
(
c
.
callback
)},
Process
:
function
(
a
,
b
){
return
this
.
takeAction
(
"
Process
"
,
a
,
b
)},
Update
:
function
(
a
,
b
){
return
this
.
takeAction
(
"
Update
"
,
a
,
b
)},
Reprocess
:
function
(
a
,
b
){
return
this
.
takeAction
(
"
Reprocess
"
,
a
,
b
)},
Rerender
:
function
(
a
,
b
){
return
this
.
takeAction
(
"
Rerender
"
,
a
,
b
)},
takeAction
:
function
(
g
,
d
,
h
){
var
c
=
this
.
elementCallback
(
d
,
h
);
var
f
=
c
.
elements
;
var
a
=
MathJax
.
Callback
.
Queue
([
"
Clear
"
,
this
.
signal
]);
var
e
=
{
scripts
:[],
start
:
new
Date
().
getTime
(),
i
:
0
,
j
:
0
,
jax
:{},
jaxIDs
:[]};
if
(
c
.
count
){
var
b
=
[
"
Delay
"
,
MathJax
.
Callback
,
this
.
processSectionDelay
];
if
(
!
b
[
2
]){
b
=
{}}
a
.
Push
([
"
clearCounts
"
,
MathJax
.
Message
],[
"
Post
"
,
this
.
signal
,[
"
Begin
"
+
g
,
f
]],[
"
Post
"
,
this
.
signal
,[
"
Begin Math
"
,
f
,
g
]],[
"
prepareScripts
"
,
this
,
g
,
f
,
e
],[
"
Post
"
,
this
.
signal
,[
"
Begin Math Input
"
,
f
,
g
]],[
"
processInput
"
,
this
,
e
],[
"
Post
"
,
this
.
signal
,[
"
End Math Input
"
,
f
,
g
]],
b
,[
"
prepareOutput
"
,
this
,
e
,
"
preProcess
"
],
b
,[
"
Post
"
,
this
.
signal
,[
"
Begin Math Output
"
,
f
,
g
]],[
"
processOutput
"
,
this
,
e
],[
"
Post
"
,
this
.
signal
,[
"
End Math Output
"
,
f
,
g
]],
b
,[
"
prepareOutput
"
,
this
,
e
,
"
postProcess
"
],
b
,[
"
Post
"
,
this
.
signal
,[
"
End Math
"
,
f
,
g
]],[
"
Post
"
,
this
.
signal
,[
"
End
"
+
g
,
f
]],[
"
clearCounts
"
,
MathJax
.
Message
])}
return
a
.
Push
(
c
.
callback
)},
scriptAction
:{
Process
:
function
(
a
){},
Update
:
function
(
b
){
var
a
=
b
.
MathJax
.
elementJax
;
if
(
a
&&
a
.
needsUpdate
()){
a
.
Remove
(
true
);
b
.
MathJax
.
state
=
a
.
STATE
.
UPDATE
}
else
{
b
.
MathJax
.
state
=
a
.
STATE
.
PROCESSED
}},
Reprocess
:
function
(
b
){
var
a
=
b
.
MathJax
.
elementJax
;
if
(
a
){
a
.
Remove
(
true
);
b
.
MathJax
.
state
=
a
.
STATE
.
UPDATE
}},
Rerender
:
function
(
b
){
var
a
=
b
.
MathJax
.
elementJax
;
if
(
a
){
a
.
Remove
(
true
);
b
.
MathJax
.
state
=
a
.
STATE
.
OUTPUT
}}},
prepareScripts
:
function
(
h
,
e
,
g
){
if
(
arguments
.
callee
.
disabled
){
return
}
var
b
=
this
.
elementScripts
(
e
);
var
f
=
MathJax
.
ElementJax
.
STATE
;
for
(
var
d
=
0
,
a
=
b
.
length
;
d
<
a
;
d
++
){
var
c
=
b
[
d
];
if
(
c
.
type
&&
this
.
inputJax
[
c
.
type
.
replace
(
/ *;
(
.|
\n)
*/
,
""
)]){
if
(
c
.
MathJax
){
if
(
c
.
MathJax
.
elementJax
&&
c
.
MathJax
.
elementJax
.
hover
){
MathJax
.
Extension
.
MathEvents
.
Hover
.
ClearHover
(
c
.
MathJax
.
elementJax
)}
if
(
c
.
MathJax
.
state
!==
f
.
PENDING
){
this
.
scriptAction
[
h
](
c
)}}
if
(
!
c
.
MathJax
){
c
.
MathJax
=
{
state
:
f
.
PENDING
}}
if
(
c
.
MathJax
.
error
){
delete
c
.
MathJax
.
error
}
if
(
c
.
MathJax
.
state
!==
f
.
PROCESSED
){
g
.
scripts
.
push
(
c
)}}}},
checkScriptSiblings
:
function
(
a
){
if
(
a
.
MathJax
.
checked
){
return
}
var
b
=
this
.
config
,
f
=
a
.
previousSibling
;
if
(
f
&&
f
.
nodeName
===
"
#text
"
){
var
d
,
e
,
c
=
a
.
nextSibling
;
if
(
c
&&
c
.
nodeName
!==
"
#text
"
){
c
=
null
}
if
(
b
.
preJax
){
if
(
typeof
(
b
.
preJax
)
===
"
string
"
){
b
.
preJax
=
new
RegExp
(
b
.
preJax
+
"
$
"
)}
d
=
f
.
nodeValue
.
match
(
b
.
preJax
)}
if
(
b
.
postJax
&&
c
){
if
(
typeof
(
b
.
postJax
)
===
"
string
"
){
b
.
postJax
=
new
RegExp
(
"
^
"
+
b
.
postJax
)}
e
=
c
.
nodeValue
.
match
(
b
.
postJax
)}
if
(
d
&&
(
!
b
.
postJax
||
e
)){
f
.
nodeValue
=
f
.
nodeValue
.
replace
(
b
.
preJax
,(
d
.
length
>
1
?
d
[
1
]:
""
));
f
=
null
}
if
(
e
&&
(
!
b
.
preJax
||
d
)){
c
.
nodeValue
=
c
.
nodeValue
.
replace
(
b
.
postJax
,(
e
.
length
>
1
?
e
[
1
]:
""
))}
if
(
f
&&!
f
.
nodeValue
.
match
(
/
\S
/
)){
f
=
f
.
previousSibling
}}
if
(
b
.
preRemoveClass
&&
f
&&
f
.
className
===
b
.
preRemoveClass
){
a
.
MathJax
.
preview
=
f
}
a
.
MathJax
.
checked
=
1
},
processInput
:
function
(
a
){
var
b
,
i
=
MathJax
.
ElementJax
.
STATE
;
var
h
,
e
,
d
=
a
.
scripts
.
length
;
try
{
while
(
a
.
i
<
d
){
h
=
a
.
scripts
[
a
.
i
];
if
(
!
h
){
a
.
i
++
;
continue
}
e
=
h
.
previousSibling
;
if
(
e
&&
e
.
className
===
"
MathJax_Error
"
){
e
.
parentNode
.
removeChild
(
e
)}
if
(
!
h
.
parentNode
||!
h
.
MathJax
||
h
.
MathJax
.
state
===
i
.
PROCESSED
){
a
.
i
++
;
continue
}
if
(
!
h
.
MathJax
.
elementJax
||
h
.
MathJax
.
state
===
i
.
UPDATE
){
this
.
checkScriptSiblings
(
h
);
var
g
=
h
.
type
.
replace
(
/ *;
(
.|
\s)
*/
,
""
);
var
j
=
this
.
inputJax
[
g
];
b
=
j
.
Process
(
h
,
a
);
if
(
typeof
b
===
"
function
"
){
if
(
b
.
called
){
continue
}
this
.
RestartAfter
(
b
)}
b
=
b
.
Attach
(
h
,
j
.
id
);
this
.
saveScript
(
b
,
a
,
h
,
i
);
this
.
postInputHooks
.
Execute
(
b
,
j
.
id
,
h
)}
else
{
if
(
h
.
MathJax
.
state
===
i
.
OUTPUT
){
this
.
saveScript
(
h
.
MathJax
.
elementJax
,
a
,
h
,
i
)}}
a
.
i
++
;
var
c
=
new
Date
().
getTime
();
if
(
c
-
a
.
start
>
this
.
processUpdateTime
&&
a
.
i
<
a
.
scripts
.
length
){
a
.
start
=
c
;
this
.
RestartAfter
(
MathJax
.
Callback
.
Delay
(
1
))}}}
catch
(
f
){
return
this
.
processError
(
f
,
a
,
"
Input
"
)}
if
(
a
.
scripts
.
length
&&
this
.
config
.
showProcessingMessages
){
MathJax
.
Message
.
Set
([
"
ProcessMath
"
,
"
Processing math: %1%%
"
,
100
],
0
)}
a
.
start
=
new
Date
().
getTime
();
a
.
i
=
a
.
j
=
0
;
return
null
},
postInputHooks
:
MathJax
.
Callback
.
Hooks
(
true
),
saveScript
:
function
(
a
,
d
,
b
,
c
){
if
(
!
this
.
outputJax
[
a
.
mimeType
]){
b
.
MathJax
.
state
=
c
.
UPDATE
;
throw
Error
(
"
No output jax registered for
"
+
a
.
mimeType
)}
a
.
outputJax
=
this
.
outputJax
[
a
.
mimeType
][
0
].
id
;
if
(
!
d
.
jax
[
a
.
outputJax
]){
if
(
d
.
jaxIDs
.
length
===
0
){
d
.
jax
[
a
.
outputJax
]
=
d
.
scripts
}
else
{
if
(
d
.
jaxIDs
.
length
===
1
){
d
.
jax
[
d
.
jaxIDs
[
0
]]
=
d
.
scripts
.
slice
(
0
,
d
.
i
)}
d
.
jax
[
a
.
outputJax
]
=
[]}
d
.
jaxIDs
.
push
(
a
.
outputJax
)}
if
(
d
.
jaxIDs
.
length
>
1
){
d
.
jax
[
a
.
outputJax
].
push
(
b
)}
b
.
MathJax
.
state
=
c
.
OUTPUT
},
prepareOutput
:
function
(
c
,
f
){
while
(
c
.
j
<
c
.
jaxIDs
.
length
){
var
e
=
c
.
jaxIDs
[
c
.
j
],
d
=
MathJax
.
OutputJax
[
e
];
if
(
d
[
f
]){
try
{
var
a
=
d
[
f
](
c
);
if
(
typeof
a
===
"
function
"
){
if
(
a
.
called
){
continue
}
this
.
RestartAfter
(
a
)}}
catch
(
b
){
if
(
!
b
.
restart
){
MathJax
.
Message
.
Set
([
"
PrepError
"
,
"
Error preparing %1 output (%2)
"
,
e
,
f
],
null
,
600
);
MathJax
.
Hub
.
lastPrepError
=
b
;
c
.
j
++
}
return
MathJax
.
Callback
.
After
([
"
prepareOutput
"
,
this
,
c
,
f
],
b
.
restart
)}}
c
.
j
++
}
return
null
},
processOutput
:
function
(
h
){
var
b
,
g
=
MathJax
.
ElementJax
.
STATE
,
d
,
a
=
h
.
scripts
.
length
;
try
{
while
(
h
.
i
<
a
){
d
=
h
.
scripts
[
h
.
i
];
if
(
!
d
||!
d
.
parentNode
||!
d
.
MathJax
||
d
.
MathJax
.
error
){
h
.
i
++
;
continue
}
var
c
=
d
.
MathJax
.
elementJax
;
if
(
!
c
){
h
.
i
++
;
continue
}
b
=
MathJax
.
OutputJax
[
c
.
outputJax
].
Process
(
d
,
h
);
if
(
b
!==
false
){
d
.
MathJax
.
state
=
g
.
PROCESSED
;
if
(
d
.
MathJax
.
preview
){
d
.
MathJax
.
preview
.
innerHTML
=
""
;
d
.
MathJax
.
preview
.
style
.
display
=
"
none
"
}
this
.
signal
.
Post
([
"
New Math
"
,
c
.
inputID
])}
h
.
i
++
;
var
e
=
new
Date
().
getTime
();
if
(
e
-
h
.
start
>
this
.
processUpdateTime
&&
h
.
i
<
h
.
scripts
.
length
){
h
.
start
=
e
;
this
.
RestartAfter
(
MathJax
.
Callback
.
Delay
(
this
.
processUpdateDelay
))}}}
catch
(
f
){
return
this
.
processError
(
f
,
h
,
"
Output
"
)}
if
(
h
.
scripts
.
length
&&
this
.
config
.
showProcessingMessages
){
MathJax
.
Message
.
Set
([
"
TypesetMath
"
,
"
Typesetting math: %1%%
"
,
100
],
0
);
MathJax
.
Message
.
Clear
(
0
)}
h
.
i
=
h
.
j
=
0
;
return
null
},
processMessage
:
function
(
d
,
b
){
var
a
=
Math
.
floor
(
d
.
i
/
(
d
.
scripts
.
length
)
*
100
);
var
c
=
(
b
===
"
Output
"
?[
"
TypesetMath
"
,
"
Typesetting math: %1%%
"
]:[
"
ProcessMath
"
,
"
Processing math: %1%%
"
]);
if
(
this
.
config
.
showProcessingMessages
){
MathJax
.
Message
.
Set
(
c
.
concat
(
a
),
0
)}},
processError
:
function
(
b
,
c
,
a
){
if
(
!
b
.
restart
){
if
(
!
this
.
config
.
errorSettings
.
message
){
throw
b
}
this
.
formatError
(
c
.
scripts
[
c
.
i
],
b
);
c
.
i
++
}
this
.
processMessage
(
c
,
a
);
return
MathJax
.
Callback
.
After
([
"
process
"
+
a
,
this
,
c
],
b
.
restart
)},
formatError
:
function
(
b
,
f
){
var
h
=
function
(
l
,
k
,
j
,
i
){
return
MathJax
.
Localization
.
_
(
l
,
k
,
j
,
i
)};
var
e
=
h
(
"
ErrorMessage
"
,
"
Error: %1
"
,
f
.
message
)
+
"
\n
"
;
if
(
f
.
sourceURL
||
f
.
fileName
){
e
+=
"
\n
"
+
h
(
"
ErrorFile
"
,
"
file: %1
"
,
f
.
sourceURL
||
f
.
fileName
)}
if
(
f
.
line
||
f
.
lineNumber
){
e
+=
"
\n
"
+
h
(
"
ErrorLine
"
,
"
line: %1
"
,
f
.
line
||
f
.
lineNumber
)}
e
+=
"
\n\n
"
+
h
(
"
ErrorTips
"
,
"
Debugging tips: use %1, inspect %2 in the browser console
"
,
"
'unpacked/MathJax.js'
"
,
"
'MathJax.Hub.lastError'
"
);
b
.
MathJax
.
error
=
MathJax
.
OutputJax
.
Error
.
Jax
(
e
,
b
);
if
(
b
.
MathJax
.
elementJax
){
b
.
MathJax
.
error
.
inputID
=
b
.
MathJax
.
elementJax
.
inputID
}
var
g
=
this
.
config
.
errorSettings
;
var
a
=
h
(
g
.
messageId
,
g
.
message
);
var
c
=
MathJax
.
HTML
.
Element
(
"
span
"
,{
className
:
"
MathJax_Error
"
,
jaxID
:
"
Error
"
,
isMathJax
:
true
,
id
:
b
.
MathJax
.
error
.
inputID
+
"
-Frame
"
},[[
"
span
"
,
null
,
a
]]);
MathJax
.
Ajax
.
Require
(
"
[MathJax]/extensions/MathEvents.js
"
,
function
(){
var
j
=
MathJax
.
Extension
.
MathEvents
.
Event
,
i
=
MathJax
.
Hub
;
c
.
oncontextmenu
=
j
.
Menu
;
c
.
onmousedown
=
j
.
Mousedown
;
c
.
onkeydown
=
j
.
Keydown
;
c
.
tabIndex
=
i
.
getTabOrder
(
i
.
getJaxFor
(
b
))});
var
d
=
document
.
getElementById
(
c
.
id
);
if
(
d
){
d
.
parentNode
.
removeChild
(
d
)}
if
(
b
.
parentNode
){
b
.
parentNode
.
insertBefore
(
c
,
b
)}
if
(
b
.
MathJax
.
preview
){
b
.
MathJax
.
preview
.
innerHTML
=
""
;
b
.
MathJax
.
preview
.
style
.
display
=
"
none
"
}
this
.
lastError
=
f
;
this
.
signal
.
Post
([
"
Math Processing Error
"
,
b
,
f
])},
RestartAfter
:
function
(
a
){
throw
this
.
Insert
(
Error
(
"
restart
"
),{
restart
:
MathJax
.
Callback
(
a
)})},
elementCallback
:
function
(
c
,
f
){
if
(
f
==
null
&&
(
MathJax
.
Object
.
isArray
(
c
)
||
typeof
c
===
"
function
"
)){
try
{
MathJax
.
Callback
(
c
);
f
=
c
;
c
=
null
}
catch
(
d
){}}
if
(
c
==
null
){
c
=
this
.
config
.
elements
||
[]}
if
(
this
.
isHTMLCollection
(
c
)){
c
=
this
.
HTMLCollection2Array
(
c
)}
if
(
!
MathJax
.
Object
.
isArray
(
c
)){
c
=
[
c
]}
c
=
[].
concat
(
c
);
for
(
var
b
=
0
,
a
=
c
.
length
;
b
<
a
;
b
++
){
if
(
typeof
(
c
[
b
])
===
"
string
"
){
c
[
b
]
=
document
.
getElementById
(
c
[
b
])}}
if
(
!
document
.
body
){
document
.
body
=
document
.
getElementsByTagName
(
"
body
"
)[
0
]}
if
(
c
.
length
==
0
){
c
.
push
(
document
.
body
)}
if
(
!
f
){
f
=
{}}
return
{
count
:
c
.
length
,
elements
:(
c
.
length
===
1
?
c
[
0
]:
c
),
callback
:
f
}},
elementScripts
:
function
(
e
){
var
b
=
[];
if
(
MathJax
.
Object
.
isArray
(
e
)
||
this
.
isHTMLCollection
(
e
)){
for
(
var
d
=
0
,
a
=
e
.
length
;
d
<
a
;
d
++
){
var
f
=
0
;
for
(
var
c
=
0
;
c
<
d
&&!
f
;
c
++
){
f
=
e
[
c
].
contains
(
e
[
d
])}
if
(
!
f
){
b
.
push
.
apply
(
b
,
this
.
elementScripts
(
e
[
d
]))}}
return
b
}
if
(
typeof
(
e
)
===
"
string
"
){
e
=
document
.
getElementById
(
e
)}
if
(
!
document
.
body
){
document
.
body
=
document
.
getElementsByTagName
(
"
body
"
)[
0
]}
if
(
e
==
null
){
e
=
document
.
body
}
if
(
e
.
tagName
!=
null
&&
e
.
tagName
.
toLowerCase
()
===
"
script
"
){
return
[
e
]}
b
=
e
.
getElementsByTagName
(
"
script
"
);
if
(
this
.
msieHTMLCollectionBug
){
b
=
this
.
HTMLCollection2Array
(
b
)}
return
b
},
isHTMLCollection
:
function
(
a
){
return
(
"
HTMLCollection
"
in
window
&&
typeof
(
a
)
===
"
object
"
&&
a
instanceof
HTMLCollection
)},
HTMLCollection2Array
:
function
(
c
){
if
(
!
this
.
msieHTMLCollectionBug
){
return
[].
slice
.
call
(
c
)}
var
b
=
[];
for
(
var
d
=
0
,
a
=
c
.
length
;
d
<
a
;
d
++
){
b
[
d
]
=
c
[
d
]}
return
b
},
Insert
:
function
(
c
,
a
){
for
(
var
b
in
a
){
if
(
a
.
hasOwnProperty
(
b
)){
if
(
typeof
a
[
b
]
===
"
object
"
&&!
(
MathJax
.
Object
.
isArray
(
a
[
b
]))
&&
(
typeof
c
[
b
]
===
"
object
"
||
typeof
c
[
b
]
===
"
function
"
)){
this
.
Insert
(
c
[
b
],
a
[
b
])}
else
{
c
[
b
]
=
a
[
b
]}}}
return
c
},
getTabOrder
:
function
(
a
){
return
this
.
config
.
menuSettings
.
inTabOrder
?
0
:
-
1
},
SplitList
:(
"
trim
"
in
String
.
prototype
?
function
(
a
){
return
a
.
trim
().
split
(
/
\s
+/
)}:
function
(
a
){
return
a
.
replace
(
/^
\s
+/
,
""
).
replace
(
/
\s
+$/
,
""
).
split
(
/
\s
+/
)})};
MathJax
.
Hub
.
Insert
(
MathJax
.
Hub
.
config
.
styles
,
MathJax
.
Message
.
styles
);
MathJax
.
Hub
.
Insert
(
MathJax
.
Hub
.
config
.
styles
,{
"
.MathJax_Error
"
:
MathJax
.
Hub
.
config
.
errorSettings
.
style
});
MathJax
.
Extension
=
{};
MathJax
.
Hub
.
Configured
=
MathJax
.
Callback
({});
MathJax
.
Hub
.
Startup
=
{
script
:
""
,
queue
:
MathJax
.
Callback
.
Queue
(),
signal
:
MathJax
.
Callback
.
Signal
(
"
Startup
"
),
params
:{},
Config
:
function
(){
this
.
queue
.
Push
([
"
Post
"
,
this
.
signal
,
"
Begin Config
"
]);
if
(
MathJax
.
AuthorConfig
&&
MathJax
.
AuthorConfig
.
root
){
MathJax
.
Ajax
.
config
.
root
=
MathJax
.
AuthorConfig
.
root
}
if
(
this
.
params
.
locale
){
MathJax
.
Localization
.
resetLocale
(
this
.
params
.
locale
);
MathJax
.
Hub
.
config
.
menuSettings
.
locale
=
this
.
params
.
locale
}
if
(
this
.
params
.
config
){
var
c
=
this
.
params
.
config
.
split
(
/,/
);
for
(
var
b
=
0
,
a
=
c
.
length
;
b
<
a
;
b
++
){
if
(
!
c
[
b
].
match
(
/
\.
js$/
)){
c
[
b
]
+=
"
.js
"
}
this
.
queue
.
Push
([
"
Require
"
,
MathJax
.
Ajax
,
this
.
URL
(
"
config
"
,
c
[
b
])])}}
this
.
queue
.
Push
([
"
Config
"
,
MathJax
.
Hub
,
MathJax
.
AuthorConfig
]);
if
(
this
.
script
.
match
(
/
\S
/
)){
this
.
queue
.
Push
(
this
.
script
+
"
;
\n
1;
"
)}
this
.
queue
.
Push
([
"
ConfigDelay
"
,
this
],[
"
ConfigBlocks
"
,
this
],[
function
(
d
){
return
d
.
loadArray
(
MathJax
.
Hub
.
config
.
config
,
"
config
"
,
null
,
true
)},
this
],[
"
Post
"
,
this
.
signal
,
"
End Config
"
])},
ConfigDelay
:
function
(){
var
a
=
this
.
params
.
delayStartupUntil
||
MathJax
.
Hub
.
config
.
delayStartupUntil
;
if
(
a
===
"
onload
"
){
return
this
.
onload
}
if
(
a
===
"
configured
"
){
return
MathJax
.
Hub
.
Configured
}
return
a
},
ConfigBlocks
:
function
(){
var
c
=
document
.
getElementsByTagName
(
"
script
"
);
var
b
=
MathJax
.
Callback
.
Queue
();
for
(
var
d
=
0
,
a
=
c
.
length
;
d
<
a
;
d
++
){
var
e
=
String
(
c
[
d
].
type
).
replace
(
/ /g
,
""
);
if
(
e
.
match
(
/^text
\/
x-mathjax-config
(
;.*
)?
$/
)
&&!
e
.
match
(
/;executed=true/
)){
c
[
d
].
type
+=
"
;executed=true
"
;
b
.
Push
(
c
[
d
].
innerHTML
+
"
;
\n
1;
"
)}}
return
b
.
Push
(
function
(){
MathJax
.
Ajax
.
config
.
root
=
MathJax
.
Hub
.
config
.
root
})},
Cookie
:
function
(){
return
this
.
queue
.
Push
([
"
Post
"
,
this
.
signal
,
"
Begin Cookie
"
],[
"
Get
"
,
MathJax
.
HTML
.
Cookie
,
"
menu
"
,
MathJax
.
Hub
.
config
.
menuSettings
],[
function
(
e
){
var
d
=
e
.
menuSettings
;
if
(
d
.
locale
){
MathJax
.
Localization
.
resetLocale
(
d
.
locale
)}
var
g
=
e
.
menuSettings
.
renderer
,
b
=
e
.
jax
;
if
(
g
){
var
c
=
"
output/
"
+
g
;
b
.
sort
();
for
(
var
f
=
0
,
a
=
b
.
length
;
f
<
a
;
f
++
){
if
(
b
[
f
].
substr
(
0
,
7
)
===
"
output/
"
){
break
}}
if
(
f
==
a
-
1
){
b
.
pop
()}
else
{
while
(
f
<
a
){
if
(
b
[
f
]
===
c
){
b
.
splice
(
f
,
1
);
break
}
f
++
}}
b
.
unshift
(
c
)}
if
(
d
.
CHTMLpreview
!=
null
){
if
(
d
.
FastPreview
==
null
){
d
.
FastPreview
=
d
.
CHTMLpreview
}
delete
d
.
CHTMLpreview
}
if
(
d
.
FastPreview
&&!
MathJax
.
Extension
[
"
fast-preview
"
]){
MathJax
.
Hub
.
config
.
extensions
.
push
(
"
fast-preview.js
"
)}
if
(
e
.
menuSettings
.
assistiveMML
&&!
MathJax
.
Extension
.
AssistiveMML
){
MathJax
.
Hub
.
config
.
extensions
.
push
(
"
AssistiveMML.js
"
)}},
MathJax
.
Hub
.
config
],[
"
Post
"
,
this
.
signal
,
"
End Cookie
"
])},
Styles
:
function
(){
return
this
.
queue
.
Push
([
"
Post
"
,
this
.
signal
,
"
Begin Styles
"
],[
"
loadArray
"
,
this
,
MathJax
.
Hub
.
config
.
styleSheets
,
"
config
"
],[
"
Styles
"
,
MathJax
.
Ajax
,
MathJax
.
Hub
.
config
.
styles
],[
"
Post
"
,
this
.
signal
,
"
End Styles
"
])},
Jax
:
function
(){
var
f
=
MathJax
.
Hub
.
config
,
c
=
MathJax
.
Hub
.
outputJax
;
for
(
var
g
=
0
,
b
=
f
.
jax
.
length
,
d
=
0
;
g
<
b
;
g
++
){
var
e
=
f
.
jax
[
g
].
substr
(
7
);
if
(
f
.
jax
[
g
].
substr
(
0
,
7
)
===
"
output/
"
&&
c
.
order
[
e
]
==
null
){
c
.
order
[
e
]
=
d
;
d
++
}}
var
a
=
MathJax
.
Callback
.
Queue
();
return
a
.
Push
([
"
Post
"
,
this
.
signal
,
"
Begin Jax
"
],[
"
loadArray
"
,
this
,
f
.
jax
,
"
jax
"
,
"
config.js
"
],[
"
Post
"
,
this
.
signal
,
"
End Jax
"
])},
Extensions
:
function
(){
var
a
=
MathJax
.
Callback
.
Queue
();
return
a
.
Push
([
"
Post
"
,
this
.
signal
,
"
Begin Extensions
"
],[
"
loadArray
"
,
this
,
MathJax
.
Hub
.
config
.
extensions
,
"
extensions
"
],[
"
Post
"
,
this
.
signal
,
"
End Extensions
"
])},
Message
:
function
(){
MathJax
.
Message
.
Init
(
true
)},
Menu
:
function
(){
var
b
=
MathJax
.
Hub
.
config
.
menuSettings
,
a
=
MathJax
.
Hub
.
outputJax
,
d
;
for
(
var
c
in
a
){
if
(
a
.
hasOwnProperty
(
c
)){
if
(
a
[
c
].
length
){
d
=
a
[
c
];
break
}}}
if
(
d
&&
d
.
length
){
if
(
b
.
renderer
&&
b
.
renderer
!==
d
[
0
].
id
){
d
.
unshift
(
MathJax
.
OutputJax
[
b
.
renderer
])}
b
.
renderer
=
d
[
0
].
id
}},
Hash
:
function
(){
if
(
MathJax
.
Hub
.
config
.
positionToHash
&&
document
.
location
.
hash
&&
document
.
body
&&
document
.
body
.
scrollIntoView
){
var
d
=
decodeURIComponent
(
document
.
location
.
hash
.
substr
(
1
));
var
f
=
document
.
getElementById
(
d
);
if
(
!
f
){
var
c
=
document
.
getElementsByTagName
(
"
a
"
);
for
(
var
e
=
0
,
b
=
c
.
length
;
e
<
b
;
e
++
){
if
(
c
[
e
].
name
===
d
){
f
=
c
[
e
];
break
}}}
if
(
f
){
while
(
!
f
.
scrollIntoView
){
f
=
f
.
parentNode
}
f
=
this
.
HashCheck
(
f
);
if
(
f
&&
f
.
scrollIntoView
){
setTimeout
(
function
(){
f
.
scrollIntoView
(
true
)},
1
)}}}},
HashCheck
:
function
(
b
){
var
a
=
MathJax
.
Hub
.
getJaxFor
(
b
);
if
(
a
&&
MathJax
.
OutputJax
[
a
.
outputJax
].
hashCheck
){
b
=
MathJax
.
OutputJax
[
a
.
outputJax
].
hashCheck
(
b
)}
return
b
},
MenuZoom
:
function
(){
if
(
MathJax
.
Hub
.
config
.
showMathMenu
){
if
(
!
MathJax
.
Extension
.
MathMenu
){
setTimeout
(
function
(){
MathJax
.
Callback
.
Queue
([
"
Require
"
,
MathJax
.
Ajax
,
"
[MathJax]/extensions/MathMenu.js
"
,{}],[
"
loadDomain
"
,
MathJax
.
Localization
,
"
MathMenu
"
])},
1000
)}
else
{
setTimeout
(
MathJax
.
Callback
([
"
loadDomain
"
,
MathJax
.
Localization
,
"
MathMenu
"
]),
1000
)}
if
(
!
MathJax
.
Extension
.
MathZoom
){
setTimeout
(
MathJax
.
Callback
([
"
Require
"
,
MathJax
.
Ajax
,
"
[MathJax]/extensions/MathZoom.js
"
,{}]),
2000
)}}},
onLoad
:
function
(){
var
a
=
this
.
onload
=
MathJax
.
Callback
(
function
(){
MathJax
.
Hub
.
Startup
.
signal
.
Post
(
"
onLoad
"
)});
if
(
document
.
body
&&
document
.
readyState
){
if
(
MathJax
.
Hub
.
Browser
.
isMSIE
){
if
(
document
.
readyState
===
"
complete
"
){
return
[
a
]}}
else
{
if
(
document
.
readyState
!==
"
loading
"
){
return
[
a
]}}}
if
(
window
.
addEventListener
){
window
.
addEventListener
(
"
load
"
,
a
,
false
);
if
(
!
this
.
params
.
noDOMContentEvent
){
window
.
addEventListener
(
"
DOMContentLoaded
"
,
a
,
false
)}}
else
{
if
(
window
.
attachEvent
){
window
.
attachEvent
(
"
onload
"
,
a
)}
else
{
window
.
onload
=
a
}}
return
a
},
Typeset
:
function
(
a
,
b
){
if
(
MathJax
.
Hub
.
config
.
skipStartupTypeset
){
return
function
(){}}
return
this
.
queue
.
Push
([
"
Post
"
,
this
.
signal
,
"
Begin Typeset
"
],[
"
Typeset
"
,
MathJax
.
Hub
,
a
,
b
],[
"
Post
"
,
this
.
signal
,
"
End Typeset
"
])},
URL
:
function
(
b
,
a
){
if
(
!
a
.
match
(
/^
([
a-z
]
+:
\/\/
|
\[
|
\/)
/
)){
a
=
"
[MathJax]/
"
+
b
+
"
/
"
+
a
}
return
a
},
loadArray
:
function
(
b
,
f
,
c
,
a
){
if
(
b
){
if
(
!
MathJax
.
Object
.
isArray
(
b
)){
b
=
[
b
]}
if
(
b
.
length
){
var
h
=
MathJax
.
Callback
.
Queue
(),
j
=
{},
e
;
for
(
var
g
=
0
,
d
=
b
.
length
;
g
<
d
;
g
++
){
e
=
this
.
URL
(
f
,
b
[
g
]);
if
(
c
){
e
+=
"
/
"
+
c
}
if
(
a
){
h
.
Push
([
"
Require
"
,
MathJax
.
Ajax
,
e
,
j
])}
else
{
h
.
Push
(
MathJax
.
Ajax
.
Require
(
e
,
j
))}}
return
h
.
Push
({})}}
return
null
}};(
function
(
d
){
var
b
=
window
[
d
],
e
=
"
[
"
+
d
+
"
]
"
;
var
c
=
b
.
Hub
,
a
=
b
.
Ajax
,
f
=
b
.
Callback
;
var
g
=
MathJax
.
Object
.
Subclass
({
JAXFILE
:
"
jax.js
"
,
require
:
null
,
config
:{},
Init
:
function
(
i
,
h
){
if
(
arguments
.
length
===
0
){
return
this
}
return
(
this
.
constructor
.
Subclass
(
i
,
h
))()},
Augment
:
function
(
k
,
j
){
var
i
=
this
.
constructor
,
h
=
{};
if
(
k
!=
null
){
for
(
var
l
in
k
){
if
(
k
.
hasOwnProperty
(
l
)){
if
(
typeof
k
[
l
]
===
"
function
"
){
i
.
protoFunction
(
l
,
k
[
l
])}
else
{
h
[
l
]
=
k
[
l
]}}}
if
(
k
.
toString
!==
i
.
prototype
.
toString
&&
k
.
toString
!==
{}.
toString
){
i
.
protoFunction
(
"
toString
"
,
k
.
toString
)}}
c
.
Insert
(
i
.
prototype
,
h
);
i
.
Augment
(
null
,
j
);
return
this
},
Translate
:
function
(
h
,
i
){
throw
Error
(
this
.
directory
+
"
/
"
+
this
.
JAXFILE
+
"
failed to define the Translate() method
"
)},
Register
:
function
(
h
){},
Config
:
function
(){
this
.
config
=
c
.
CombineConfig
(
this
.
id
,
this
.
config
);
if
(
this
.
config
.
Augment
){
this
.
Augment
(
this
.
config
.
Augment
)}},
Startup
:
function
(){},
loadComplete
:
function
(
i
){
if
(
i
===
"
config.js
"
){
return
a
.
loadComplete
(
this
.
directory
+
"
/
"
+
i
)}
else
{
var
h
=
f
.
Queue
();
h
.
Push
(
c
.
Register
.
StartupHook
(
"
End Config
"
,{}),[
"
Post
"
,
c
.
Startup
.
signal
,
this
.
id
+
"
Jax Config
"
],[
"
Config
"
,
this
],[
"
Post
"
,
c
.
Startup
.
signal
,
this
.
id
+
"
Jax Require
"
],[
function
(
j
){
return
MathJax
.
Hub
.
Startup
.
loadArray
(
j
.
require
,
this
.
directory
)},
this
],[
function
(
j
,
k
){
return
MathJax
.
Hub
.
Startup
.
loadArray
(
j
.
extensions
,
"
extensions/
"
+
k
)},
this
.
config
||
{},
this
.
id
],[
"
Post
"
,
c
.
Startup
.
signal
,
this
.
id
+
"
Jax Startup
"
],[
"
Startup
"
,
this
],[
"
Post
"
,
c
.
Startup
.
signal
,
this
.
id
+
"
Jax Ready
"
]);
if
(
this
.
copyTranslate
){
h
.
Push
([
function
(
j
){
j
.
preProcess
=
j
.
preTranslate
;
j
.
Process
=
j
.
Translate
;
j
.
postProcess
=
j
.
postTranslate
},
this
.
constructor
.
prototype
])}
return
h
.
Push
([
"
loadComplete
"
,
a
,
this
.
directory
+
"
/
"
+
i
])}}},{
id
:
"
Jax
"
,
version
:
"
2.7.7
"
,
directory
:
e
+
"
/jax
"
,
extensionDir
:
e
+
"
/extensions
"
});
b
.
InputJax
=
g
.
Subclass
({
elementJax
:
"
mml
"
,
sourceMenuTitle
:[
"
Original
"
,
"
Original Form
"
],
copyTranslate
:
true
,
Process
:
function
(
l
,
q
){
var
j
=
f
.
Queue
(),
o
;
var
k
=
this
.
elementJax
;
if
(
!
b
.
Object
.
isArray
(
k
)){
k
=
[
k
]}
for
(
var
n
=
0
,
h
=
k
.
length
;
n
<
h
;
n
++
){
o
=
b
.
ElementJax
.
directory
+
"
/
"
+
k
[
n
]
+
"
/
"
+
this
.
JAXFILE
;
if
(
!
this
.
require
){
this
.
require
=
[]}
else
{
if
(
!
b
.
Object
.
isArray
(
this
.
require
)){
this
.
require
=
[
this
.
require
]}}
this
.
require
.
push
(
o
);
j
.
Push
(
a
.
Require
(
o
))}
o
=
this
.
directory
+
"
/
"
+
this
.
JAXFILE
;
var
p
=
j
.
Push
(
a
.
Require
(
o
));
if
(
!
p
.
called
){
this
.
constructor
.
prototype
.
Process
=
function
(){
if
(
!
p
.
called
){
return
p
}
throw
Error
(
o
+
"
failed to load properly
"
)}}
k
=
c
.
outputJax
[
"
jax/
"
+
k
[
0
]];
if
(
k
){
j
.
Push
(
a
.
Require
(
k
[
0
].
directory
+
"
/
"
+
this
.
JAXFILE
))}
return
j
.
Push
({})},
needsUpdate
:
function
(
h
){
var
i
=
h
.
SourceElement
();
return
(
h
.
originalText
!==
b
.
HTML
.
getScript
(
i
))},
Register
:
function
(
h
){
if
(
!
c
.
inputJax
){
c
.
inputJax
=
{}}
c
.
inputJax
[
h
]
=
this
}},{
id
:
"
InputJax
"
,
version
:
"
2.7.7
"
,
directory
:
g
.
directory
+
"
/input
"
,
extensionDir
:
g
.
extensionDir
});
b
.
OutputJax
=
g
.
Subclass
({
copyTranslate
:
true
,
preProcess
:
function
(
j
){
var
i
,
h
=
this
.
directory
+
"
/
"
+
this
.
JAXFILE
;
this
.
constructor
.
prototype
.
preProcess
=
function
(
k
){
if
(
!
i
.
called
){
return
i
}
throw
Error
(
h
+
"
failed to load properly
"
)};
i
=
a
.
Require
(
h
);
return
i
},
Process
:
function
(
h
){
throw
Error
(
this
.
id
+
"
output jax failed to load properly
"
)},
Register
:
function
(
i
){
var
h
=
c
.
outputJax
;
if
(
!
h
[
i
]){
h
[
i
]
=
[]}
if
(
h
[
i
].
length
&&
(
this
.
id
===
c
.
config
.
menuSettings
.
renderer
||
(
h
.
order
[
this
.
id
]
||
0
)
<
(
h
.
order
[
h
[
i
][
0
].
id
]
||
0
))){
h
[
i
].
unshift
(
this
)}
else
{
h
[
i
].
push
(
this
)}
if
(
!
this
.
require
){
this
.
require
=
[]}
else
{
if
(
!
b
.
Object
.
isArray
(
this
.
require
)){
this
.
require
=
[
this
.
require
]}}
this
.
require
.
push
(
b
.
ElementJax
.
directory
+
"
/
"
+
(
i
.
split
(
/
\/
/
)[
1
])
+
"
/
"
+
this
.
JAXFILE
)},
Remove
:
function
(
h
){}},{
id
:
"
OutputJax
"
,
version
:
"
2.7.7
"
,
directory
:
g
.
directory
+
"
/output
"
,
extensionDir
:
g
.
extensionDir
,
fontDir
:
e
+
(
b
.
isPacked
?
""
:
"
/..
"
)
+
"
/fonts
"
,
imageDir
:
e
+
(
b
.
isPacked
?
""
:
"
/..
"
)
+
"
/images
"
});
b
.
ElementJax
=
g
.
Subclass
({
Init
:
function
(
i
,
h
){
return
this
.
constructor
.
Subclass
(
i
,
h
)},
inputJax
:
null
,
outputJax
:
null
,
inputID
:
null
,
originalText
:
""
,
mimeType
:
""
,
sourceMenuTitle
:[
"
MathMLcode
"
,
"
MathML Code
"
],
Text
:
function
(
i
,
j
){
var
h
=
this
.
SourceElement
();
b
.
HTML
.
setScript
(
h
,
i
);
h
.
MathJax
.
state
=
this
.
STATE
.
UPDATE
;
return
c
.
Update
(
h
,
j
)},
Reprocess
:
function
(
i
){
var
h
=
this
.
SourceElement
();
h
.
MathJax
.
state
=
this
.
STATE
.
UPDATE
;
return
c
.
Reprocess
(
h
,
i
)},
Update
:
function
(
h
){
return
this
.
Rerender
(
h
)},
Rerender
:
function
(
i
){
var
h
=
this
.
SourceElement
();
h
.
MathJax
.
state
=
this
.
STATE
.
OUTPUT
;
return
c
.
Process
(
h
,
i
)},
Remove
:
function
(
h
){
if
(
this
.
hover
){
this
.
hover
.
clear
(
this
)}
b
.
OutputJax
[
this
.
outputJax
].
Remove
(
this
);
if
(
!
h
){
c
.
signal
.
Post
([
"
Remove Math
"
,
this
.
inputID
]);
this
.
Detach
()}},
needsUpdate
:
function
(){
return
b
.
InputJax
[
this
.
inputJax
].
needsUpdate
(
this
)},
SourceElement
:
function
(){
return
document
.
getElementById
(
this
.
inputID
)},
Attach
:
function
(
i
,
j
){
var
h
=
i
.
MathJax
.
elementJax
;
if
(
i
.
MathJax
.
state
===
this
.
STATE
.
UPDATE
){
h
.
Clone
(
this
)}
else
{
h
=
i
.
MathJax
.
elementJax
=
this
;
if
(
i
.
id
){
this
.
inputID
=
i
.
id
}
else
{
i
.
id
=
this
.
inputID
=
b
.
ElementJax
.
GetID
();
this
.
newID
=
1
}}
h
.
originalText
=
b
.
HTML
.
getScript
(
i
);
h
.
inputJax
=
j
;
if
(
h
.
root
){
h
.
root
.
inputID
=
h
.
inputID
}
return
h
},
Detach
:
function
(){
var
h
=
this
.
SourceElement
();
if
(
!
h
){
return
}
try
{
delete
h
.
MathJax
}
catch
(
i
){
h
.
MathJax
=
null
}
if
(
this
.
newID
){
h
.
id
=
""
}},
Clone
:
function
(
h
){
var
i
;
for
(
i
in
this
){
if
(
!
this
.
hasOwnProperty
(
i
)){
continue
}
if
(
typeof
(
h
[
i
])
===
"
undefined
"
&&
i
!==
"
newID
"
){
delete
this
[
i
]}}
for
(
i
in
h
){
if
(
!
h
.
hasOwnProperty
(
i
)){
continue
}
if
(
typeof
(
this
[
i
])
===
"
undefined
"
||
(
this
[
i
]
!==
h
[
i
]
&&
i
!==
"
inputID
"
)){
this
[
i
]
=
h
[
i
]}}}},{
id
:
"
ElementJax
"
,
version
:
"
2.7.7
"
,
directory
:
g
.
directory
+
"
/element
"
,
extensionDir
:
g
.
extensionDir
,
ID
:
0
,
STATE
:{
PENDING
:
1
,
PROCESSED
:
2
,
UPDATE
:
3
,
OUTPUT
:
4
},
GetID
:
function
(){
this
.
ID
++
;
return
"
MathJax-Element-
"
+
this
.
ID
},
Subclass
:
function
(){
var
h
=
g
.
Subclass
.
apply
(
this
,
arguments
);
h
.
loadComplete
=
this
.
prototype
.
loadComplete
;
return
h
}});
b
.
ElementJax
.
prototype
.
STATE
=
b
.
ElementJax
.
STATE
;
b
.
OutputJax
.
Error
=
{
id
:
"
Error
"
,
version
:
"
2.7.7
"
,
config
:{},
errors
:
0
,
ContextMenu
:
function
(){
return
b
.
Extension
.
MathEvents
.
Event
.
ContextMenu
.
apply
(
b
.
Extension
.
MathEvents
.
Event
,
arguments
)},
Mousedown
:
function
(){
return
b
.
Extension
.
MathEvents
.
Event
.
AltContextMenu
.
apply
(
b
.
Extension
.
MathEvents
.
Event
,
arguments
)},
getJaxFromMath
:
function
(
h
){
return
(
h
.
nextSibling
.
MathJax
||
{}).
error
},
Jax
:
function
(
j
,
i
){
var
h
=
MathJax
.
Hub
.
inputJax
[
i
.
type
.
replace
(
/ *;
(
.|
\s)
*/
,
""
)];
this
.
errors
++
;
return
{
inputJax
:(
h
||
{
id
:
"
Error
"
}).
id
,
outputJax
:
"
Error
"
,
inputID
:
"
MathJax-Error-
"
+
this
.
errors
,
sourceMenuTitle
:[
"
ErrorMessage
"
,
"
Error Message
"
],
sourceMenuFormat
:
"
Error
"
,
originalText
:
MathJax
.
HTML
.
getScript
(
i
),
errorText
:
j
}}};
b
.
InputJax
.
Error
=
{
id
:
"
Error
"
,
version
:
"
2.7.7
"
,
config
:{},
sourceMenuTitle
:[
"
Original
"
,
"
Original Form
"
]}})(
"
MathJax
"
);(
function
(
o
){
var
h
=
window
[
o
];
if
(
!
h
){
h
=
window
[
o
]
=
{}}
var
d
=
h
.
Hub
;
var
s
=
d
.
Startup
;
var
w
=
d
.
config
;
var
g
=
document
.
head
||
(
document
.
getElementsByTagName
(
"
head
"
)[
0
]);
if
(
!
g
){
g
=
document
.
childNodes
[
0
]}
var
b
=
(
document
.
documentElement
||
document
).
getElementsByTagName
(
"
script
"
);
if
(
b
.
length
===
0
&&
g
.
namespaceURI
){
b
=
document
.
getElementsByTagNameNS
(
g
.
namespaceURI
,
"
script
"
)}
var
f
=
new
RegExp
(
"
(^|/)
"
+
o
+
"
\\
.js(
\\
?.*)?$
"
);
for
(
var
q
=
b
.
length
-
1
;
q
>=
0
;
q
--
){
if
((
b
[
q
].
src
||
""
).
match
(
f
)){
s
.
script
=
b
[
q
].
innerHTML
;
if
(
RegExp
.
$2
){
var
t
=
RegExp
.
$2
.
substr
(
1
).
split
(
/
\&
/
);
for
(
var
p
=
0
,
l
=
t
.
length
;
p
<
l
;
p
++
){
var
n
=
t
[
p
].
match
(
/
(
.*
)
=
(
.*
)
/
);
if
(
n
){
s
.
params
[
unescape
(
n
[
1
])]
=
unescape
(
n
[
2
])}
else
{
s
.
params
[
t
[
p
]]
=
true
}}}
w
.
root
=
b
[
q
].
src
.
replace
(
/
(
^|
\/)[^\/]
*
(\?
.*
)?
$/
,
""
);
h
.
Ajax
.
config
.
root
=
w
.
root
;
h
.
Ajax
.
params
=
s
.
params
;
break
}}
var
k
=
navigator
.
userAgent
;
var
a
=
{
isMac
:(
navigator
.
platform
.
substr
(
0
,
3
)
===
"
Mac
"
),
isPC
:(
navigator
.
platform
.
substr
(
0
,
3
)
===
"
Win
"
),
isMSIE
:(
"
ActiveXObject
"
in
window
&&
"
clipboardData
"
in
window
),
isEdge
:(
"
MSGestureEvent
"
in
window
&&
"
chrome
"
in
window
&&
window
.
chrome
.
loadTimes
==
null
),
isFirefox
:(
!!
k
.
match
(
/Gecko
\/
/
)
&&!
k
.
match
(
/like Gecko/
)),
isSafari
:(
!!
k
.
match
(
/
(
Apple
)?
WebKit
\/
/
)
&&!
k
.
match
(
/ like iPhone /
)
&&
(
!
window
.
chrome
||
window
.
chrome
.
app
==
null
)),
isChrome
:(
"
chrome
"
in
window
&&
window
.
chrome
.
loadTimes
!=
null
),
isOpera
:(
"
opera
"
in
window
&&
window
.
opera
.
version
!=
null
),
isKonqueror
:(
"
konqueror
"
in
window
&&
navigator
.
vendor
==
"
KDE
"
),
versionAtLeast
:
function
(
y
){
var
x
=
(
this
.
version
).
split
(
"
.
"
);
y
=
(
new
String
(
y
)).
split
(
"
.
"
);
for
(
var
z
=
0
,
j
=
y
.
length
;
z
<
j
;
z
++
){
if
(
x
[
z
]
!=
y
[
z
]){
return
parseInt
(
x
[
z
]
||
"
0
"
)
>=
parseInt
(
y
[
z
])}}
return
true
},
Select
:
function
(
j
){
var
i
=
j
[
d
.
Browser
];
if
(
i
){
return
i
(
d
.
Browser
)}
return
null
}};
var
e
=
k
.
replace
(
/^Mozilla
\/(\d
+
\.)
+
\d
+ /
,
""
).
replace
(
/
[
a-z
][
-a-z0-9._:
]
+
\/\d
+
[^
]
*-
[^
]
*
\.([
a-z
][
a-z
])?\d
+ /i
,
""
).
replace
(
/Gentoo |Ubuntu
\/(\d
+
\.)
*
\d
+
(\([^
)
]
*
\)
)?
/
,
""
);
d
.
Browser
=
d
.
Insert
(
d
.
Insert
(
new
String
(
"
Unknown
"
),{
version
:
"
0.0
"
}),
a
);
for
(
var
v
in
a
){
if
(
a
.
hasOwnProperty
(
v
)){
if
(
a
[
v
]
&&
v
.
substr
(
0
,
2
)
===
"
is
"
){
v
=
v
.
slice
(
2
);
if
(
v
===
"
Mac
"
||
v
===
"
PC
"
){
continue
}
d
.
Browser
=
d
.
Insert
(
new
String
(
v
),
a
);
var
r
=
new
RegExp
(
"
.*(Version/| Trident/.*; rv:)((?:
\\
d+
\\
.)+
\\
d+)|.*(
"
+
v
+
"
)
"
+
(
v
==
"
MSIE
"
?
"
"
:
"
/
"
)
+
"
((?:
\\
d+
\\
.)*
\\
d+)|(?:^|
\\
(| )([a-z][-a-z0-9._: ]+|(?:Apple)?WebKit)/((?:
\\
d+
\\
.)+
\\
d+)
"
);
var
u
=
r
.
exec
(
e
)
||
[
""
,
""
,
""
,
"
unknown
"
,
"
0.0
"
];
d
.
Browser
.
name
=
(
u
[
1
]
!=
""
?
v
:(
u
[
3
]
||
u
[
5
]));
d
.
Browser
.
version
=
u
[
2
]
||
u
[
4
]
||
u
[
6
];
break
}}}
try
{
d
.
Browser
.
Select
({
Safari
:
function
(
j
){
var
i
=
parseInt
((
String
(
j
.
version
).
split
(
"
.
"
))[
0
]);
if
(
i
>
85
){
j
.
webkit
=
j
.
version
}
if
(
i
>=
538
){
j
.
version
=
"
8.0
"
}
else
{
if
(
i
>=
537
){
j
.
version
=
"
7.0
"
}
else
{
if
(
i
>=
536
){
j
.
version
=
"
6.0
"
}
else
{
if
(
i
>=
534
){
j
.
version
=
"
5.1
"
}
else
{
if
(
i
>=
533
){
j
.
version
=
"
5.0
"
}
else
{
if
(
i
>=
526
){
j
.
version
=
"
4.0
"
}
else
{
if
(
i
>=
525
){
j
.
version
=
"
3.1
"
}
else
{
if
(
i
>
500
){
j
.
version
=
"
3.0
"
}
else
{
if
(
i
>
400
){
j
.
version
=
"
2.0
"
}
else
{
if
(
i
>
85
){
j
.
version
=
"
1.0
"
}}}}}}}}}}
j
.
webkit
=
(
navigator
.
appVersion
.
match
(
/WebKit
\/(\d
+
)\.
/
))[
1
];
j
.
isMobile
=
(
navigator
.
appVersion
.
match
(
/Mobile/i
)
!=
null
);
j
.
noContextMenu
=
j
.
isMobile
},
Firefox
:
function
(
j
){
if
((
j
.
version
===
"
0.0
"
||
k
.
match
(
/Firefox/
)
==
null
)
&&
navigator
.
product
===
"
Gecko
"
){
var
m
=
k
.
match
(
/
[\/
]
rv:
(\d
+
\.\d
.*
?)[\)
]
/
);
if
(
m
){
j
.
version
=
m
[
1
]}
else
{
var
i
=
(
navigator
.
buildID
||
navigator
.
productSub
||
"
0
"
).
substr
(
0
,
8
);
if
(
i
>=
"
20111220
"
){
j
.
version
=
"
9.0
"
}
else
{
if
(
i
>=
"
20111120
"
){
j
.
version
=
"
8.0
"
}
else
{
if
(
i
>=
"
20110927
"
){
j
.
version
=
"
7.0
"
}
else
{
if
(
i
>=
"
20110816
"
){
j
.
version
=
"
6.0
"
}
else
{
if
(
i
>=
"
20110621
"
){
j
.
version
=
"
5.0
"
}
else
{
if
(
i
>=
"
20110320
"
){
j
.
version
=
"
4.0
"
}
else
{
if
(
i
>=
"
20100121
"
){
j
.
version
=
"
3.6
"
}
else
{
if
(
i
>=
"
20090630
"
){
j
.
version
=
"
3.5
"
}
else
{
if
(
i
>=
"
20080617
"
){
j
.
version
=
"
3.0
"
}
else
{
if
(
i
>=
"
20061024
"
){
j
.
version
=
"
2.0
"
}}}}}}}}}}}}
j
.
isMobile
=
(
navigator
.
appVersion
.
match
(
/Android/i
)
!=
null
||
k
.
match
(
/ Fennec
\/
/
)
!=
null
||
k
.
match
(
/Mobile/
)
!=
null
)},
Chrome
:
function
(
i
){
i
.
noContextMenu
=
i
.
isMobile
=!!
navigator
.
userAgent
.
match
(
/ Mobile
[
\/]
/
)},
Opera
:
function
(
i
){
i
.
version
=
opera
.
version
()},
Edge
:
function
(
i
){
i
.
isMobile
=!!
navigator
.
userAgent
.
match
(
/ Phone/
)},
MSIE
:
function
(
j
){
j
.
isMobile
=!!
navigator
.
userAgent
.
match
(
/ Phone/
);
j
.
isIE9
=!!
(
document
.
documentMode
&&
(
window
.
performance
||
window
.
msPerformance
));
MathJax
.
HTML
.
setScriptBug
=!
j
.
isIE9
||
document
.
documentMode
<
9
;
MathJax
.
Hub
.
msieHTMLCollectionBug
=
(
document
.
documentMode
<
9
);
if
(
document
.
documentMode
<
10
&&!
s
.
params
.
NoMathPlayer
){
try
{
new
ActiveXObject
(
"
MathPlayer.Factory.1
"
);
j
.
hasMathPlayer
=
true
}
catch
(
m
){}
try
{
if
(
j
.
hasMathPlayer
){
var
i
=
document
.
createElement
(
"
object
"
);
i
.
id
=
"
mathplayer
"
;
i
.
classid
=
"
clsid:32F66A20-7614-11D4-BD11-00104BD3F987
"
;
g
.
appendChild
(
i
);
document
.
namespaces
.
add
(
"
m
"
,
"
http://www.w3.org/1998/Math/MathML
"
);
j
.
mpNamespace
=
true
;
if
(
document
.
readyState
&&
(
document
.
readyState
===
"
loading
"
||
document
.
readyState
===
"
interactive
"
)){
document
.
write
(
'
<?import namespace="m" implementation="#MathPlayer">
'
);
j
.
mpImported
=
true
}}
else
{
document
.
namespaces
.
add
(
"
mjx_IE_fix
"
,
"
http://www.w3.org/1999/xlink
"
)}}
catch
(
m
){}}}})}
catch
(
c
){
console
.
error
(
c
.
message
)}
d
.
Browser
.
Select
(
MathJax
.
Message
.
browsers
);
if
(
h
.
AuthorConfig
&&
typeof
h
.
AuthorConfig
.
AuthorInit
===
"
function
"
){
h
.
AuthorConfig
.
AuthorInit
()}
d
.
queue
=
h
.
Callback
.
Queue
();
d
.
queue
.
Push
([
"
Post
"
,
s
.
signal
,
"
Begin
"
],[
"
Config
"
,
s
],[
"
Cookie
"
,
s
],[
"
Styles
"
,
s
],[
"
Message
"
,
s
],
function
(){
var
i
=
h
.
Callback
.
Queue
(
s
.
Jax
(),
s
.
Extensions
());
return
i
.
Push
({})},[
"
Menu
"
,
s
],
s
.
onLoad
(),
function
(){
MathJax
.
isReady
=
true
},[
"
Typeset
"
,
s
],[
"
Hash
"
,
s
],[
"
MenuZoom
"
,
s
],[
"
Post
"
,
s
.
signal
,
"
End
"
])})(
"
MathJax
"
)}};
</script>
<style>
body
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment